From e19c623128ef07c778f5f587864361c1ff383695 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 18 Oct 2017 17:28:19 -0700 Subject: [PATCH] spirv: Convert the supported_extensions struct to spirv_options 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 Reviewed-by: Kristian H. Kristensen --- src/amd/vulkan/radv_shader.c | 23 +++++++++++++---------- src/compiler/spirv/nir_spirv.h | 26 ++++++++++++++------------ src/compiler/spirv/spirv_to_nir.c | 10 +++++----- src/compiler/spirv/vtn_private.h | 2 +- src/intel/vulkan/anv_pipeline.c | 20 +++++++++++--------- 5 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 5464d3a58e9..4a3fdfa80ec 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -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); diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index 83577fb5d23..234b0ce3444 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -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 } diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 2c4f5b0c93e..b36772caad1 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -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; diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h index 751f5011b7d..b4380294048 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -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 diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 907b24a758d..827767cb76f 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -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); -- 2.30.2