spirv: Convert the supported_extensions struct to spirv_options
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 19 Oct 2017 00:28:19 +0000 (17:28 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 2 Dec 2017 16:09:11 +0000 (08:09 -0800)
This is a bit more general and lets us pass additional options into the
spirv_to_nir pass beyond what capabilities we support.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/amd/vulkan/radv_shader.c
src/compiler/spirv/nir_spirv.h
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_private.h
src/intel/vulkan/anv_pipeline.c

index 5464d3a58e930682771b1476f3996dfea2c5973f..4a3fdfa80ec918d54328fd067cf19a4f4b6861b0 100644 (file)
@@ -196,19 +196,22 @@ radv_shader_compile_to_nir(struct radv_device *device,
                                        spec_entries[i].data32 = *(const uint32_t *)data;
                        }
                }
-               const struct nir_spirv_supported_extensions supported_ext = {
-                       .draw_parameters = true,
-                       .float64 = true,
-                       .image_read_without_format = true,
-                       .image_write_without_format = true,
-                       .tessellation = true,
-                       .int64 = true,
-                       .multiview = true,
-                       .variable_pointers = true,
+               const struct spirv_to_nir_options spirv_options = {
+                       .caps = {
+                               .draw_parameters = true,
+                               .float64 = true,
+                               .image_read_without_format = true,
+                               .image_write_without_format = true,
+                               .tessellation = true,
+                               .int64 = true,
+                               .multiview = true,
+                               .variable_pointers = true,
+                       },
                };
                entry_point = spirv_to_nir(spirv, module->size / 4,
                                           spec_entries, num_spec_entries,
-                                          stage, entrypoint_name, &supported_ext, &nir_options);
+                                          stage, entrypoint_name,
+                                          &spirv_options, &nir_options);
                nir = entry_point->shader;
                assert(nir->info.stage == stage);
                nir_validate_shader(nir);
index 83577fb5d23db65bd52fca5a4bb74dbdea5eb198..234b0ce344469018a558af54aecbd4c4a106e0af 100644 (file)
@@ -42,24 +42,26 @@ struct nir_spirv_specialization {
    };
 };
 
-struct nir_spirv_supported_extensions {
-   bool float64;
-   bool image_ms_array;
-   bool tessellation;
-   bool draw_parameters;
-   bool image_read_without_format;
-   bool image_write_without_format;
-   bool int64;
-   bool multiview;
-   bool variable_pointers;
+struct spirv_to_nir_options {
+   struct {
+      bool float64;
+      bool image_ms_array;
+      bool tessellation;
+      bool draw_parameters;
+      bool image_read_without_format;
+      bool image_write_without_format;
+      bool int64;
+      bool multiview;
+      bool variable_pointers;
+   } caps;
 };
 
 nir_function *spirv_to_nir(const uint32_t *words, size_t word_count,
                            struct nir_spirv_specialization *specializations,
                            unsigned num_specializations,
                            gl_shader_stage stage, const char *entry_point_name,
-                           const struct nir_spirv_supported_extensions *ext,
-                           const nir_shader_compiler_options *options);
+                           const struct spirv_to_nir_options *options,
+                           const nir_shader_compiler_options *nir_options);
 
 #ifdef __cplusplus
 }
index 2c4f5b0c93e485b2363ed836b35e33a20c3bcb86..b36772caad19d41f5be3bc32518683f5f0e484c2 100644 (file)
@@ -2675,7 +2675,7 @@ stage_for_execution_model(SpvExecutionModel model)
 }
 
 #define spv_check_supported(name, cap) do {            \
-      if (!(b->ext && b->ext->name))                   \
+      if (!(b->options && b->options->caps.name))      \
          vtn_warn("Unsupported SPIR-V capability: %s",  \
                   spirv_capability_to_string(cap));     \
    } while(0)
@@ -3316,8 +3316,8 @@ nir_function *
 spirv_to_nir(const uint32_t *words, size_t word_count,
              struct nir_spirv_specialization *spec, unsigned num_spec,
              gl_shader_stage stage, const char *entry_point_name,
-             const struct nir_spirv_supported_extensions *ext,
-             const nir_shader_compiler_options *options)
+             const struct spirv_to_nir_options *options,
+             const nir_shader_compiler_options *nir_options)
 {
    const uint32_t *word_end = words + word_count;
 
@@ -3339,7 +3339,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
    exec_list_make_empty(&b->functions);
    b->entry_point_stage = stage;
    b->entry_point_name = entry_point_name;
-   b->ext = ext;
+   b->options = options;
 
    /* Handle all the preamble instructions */
    words = vtn_foreach_instruction(b, words, word_end,
@@ -3351,7 +3351,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
       return NULL;
    }
 
-   b->shader = nir_shader_create(NULL, stage, options, NULL);
+   b->shader = nir_shader_create(NULL, stage, nir_options, NULL);
 
    /* Set shader info defaults */
    b->shader->info.gs.invocations = 1;
index 751f5011b7d48bf76214d96a4ed89d1379f4504e..b43802940485bddec68fe214381b6cde31af6868 100644 (file)
@@ -467,7 +467,7 @@ struct vtn_builder {
    nir_builder nb;
 
    nir_shader *shader;
-   const struct nir_spirv_supported_extensions *ext;
+   const struct spirv_to_nir_options *options;
    struct vtn_block *block;
 
    /* Current file, line, and column.  Useful for debugging.  Set
index 907b24a758deb7181115318cc9bc01baf9dddc6c..827767cb76f747963d19166fb299fef84ff6a846 100644 (file)
@@ -132,20 +132,22 @@ anv_shader_compile_to_nir(struct anv_pipeline *pipeline,
       }
    }
 
-   const struct nir_spirv_supported_extensions supported_ext = {
-      .float64 = device->instance->physicalDevice.info.gen >= 8,
-      .int64 = device->instance->physicalDevice.info.gen >= 8,
-      .tessellation = true,
-      .draw_parameters = true,
-      .image_write_without_format = true,
-      .multiview = true,
-      .variable_pointers = true,
+   struct spirv_to_nir_options spirv_options = {
+      .caps = {
+         .float64 = device->instance->physicalDevice.info.gen >= 8,
+         .int64 = device->instance->physicalDevice.info.gen >= 8,
+         .tessellation = true,
+         .draw_parameters = true,
+         .image_write_without_format = true,
+         .multiview = true,
+         .variable_pointers = true,
+      },
    };
 
    nir_function *entry_point =
       spirv_to_nir(spirv, module->size / 4,
                    spec_entries, num_spec_entries,
-                   stage, entrypoint_name, &supported_ext, nir_options);
+                   stage, entrypoint_name, &spirv_options, nir_options);
    nir_shader *nir = entry_point->shader;
    assert(nir->info.stage == stage);
    nir_validate_shader(nir);