From e45bf01940fa6692d4f1d9385c2d6466da06a9bb Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Sun, 19 May 2019 00:22:17 -0700 Subject: [PATCH] spirv: Change spirv_to_nir() to return a nir_shader spirv_to_nir() returned the nir_function corresponding to the entrypoint, as a way to identify it. There's now a bool is_entrypoint in nir_function and also a helper function to get the entry_point from a nir_shader. The return type reflects better what the function name suggests. It also helps drivers avoid the mistake of reusing internal shader references after running NIR_PASS on it. When using NIR_TEST_CLONE or NIR_TEST_SERIALIZE, those would be invalidated right in the first pass executed. Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_shader.c | 9 ++++----- src/compiler/spirv/nir_spirv.h | 12 ++++++------ src/compiler/spirv/spirv2nir.c | 8 ++++---- src/compiler/spirv/spirv_to_nir.c | 5 +++-- src/freedreno/vulkan/tu_shader.c | 8 ++++---- src/gallium/drivers/freedreno/ir3/ir3_cmdline.c | 8 ++++---- src/intel/vulkan/anv_pipeline.c | 3 +-- src/mesa/main/glspirv.c | 7 ++----- 8 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 05ca14b527a..36dfc47de27 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -287,11 +287,10 @@ radv_shader_compile_to_nir(struct radv_device *device, .push_const_addr_format = nir_address_format_logical, .shared_addr_format = nir_address_format_32bit_offset, }; - nir_function *entry_point = spirv_to_nir(spirv, module->size / 4, - spec_entries, num_spec_entries, - stage, entrypoint_name, - &spirv_options, &nir_options); - nir = entry_point->shader; + nir = spirv_to_nir(spirv, module->size / 4, + spec_entries, num_spec_entries, + stage, entrypoint_name, + &spirv_options, &nir_options); assert(nir->info.stage == stage); nir_validate_shader(nir, "after spirv_to_nir"); diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index 1e9e0727b63..c4381bdf62e 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -94,12 +94,12 @@ bool gl_spirv_validation(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); -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 spirv_to_nir_options *options, - const nir_shader_compiler_options *nir_options); +nir_shader *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 spirv_to_nir_options *options, + const nir_shader_compiler_options *nir_options); #ifdef __cplusplus } diff --git a/src/compiler/spirv/spirv2nir.c b/src/compiler/spirv/spirv2nir.c index 5957f064b49..48d2694c963 100644 --- a/src/compiler/spirv/spirv2nir.c +++ b/src/compiler/spirv/spirv2nir.c @@ -74,10 +74,10 @@ int main(int argc, char **argv) struct spirv_to_nir_options spirv_opts = {}; - nir_function *func = spirv_to_nir(map, word_count, NULL, 0, - MESA_SHADER_FRAGMENT, "main", - &spirv_opts, NULL); - nir_print_shader(func->shader, stderr); + nir_shader *nir = spirv_to_nir(map, word_count, NULL, 0, + MESA_SHADER_FRAGMENT, "main", + &spirv_opts, NULL); + nir_print_shader(nir, stderr); return 0; } diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index d877077fa3b..c273e9e9fee 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -4552,7 +4552,7 @@ vtn_emit_kernel_entry_point_wrapper(struct vtn_builder *b, return main_entry_point; } -nir_function * +nir_shader * 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, @@ -4669,7 +4669,8 @@ spirv_to_nir(const uint32_t *words, size_t word_count, /* Unparent the shader from the vtn_builder before we delete the builder */ ralloc_steal(NULL, b->shader); + nir_shader *shader = b->shader; ralloc_free(b); - return entry_point; + return shader; } diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c index 5d5e6524783..d87aa1dbf71 100644 --- a/src/freedreno/vulkan/tu_shader.c +++ b/src/freedreno/vulkan/tu_shader.c @@ -68,16 +68,16 @@ tu_spirv_to_nir(struct ir3_compiler *compiler, num_spec = spec_info->mapEntryCount; } - nir_function *entry_point = + nir_shader *nir = spirv_to_nir(words, word_count, spec, num_spec, stage, entry_point_name, &spirv_options, nir_options); free(spec); - assert(entry_point->shader->info.stage == stage); - nir_validate_shader(entry_point->shader, "after spirv_to_nir"); + assert(nir->info.stage == stage); + nir_validate_shader(nir, "after spirv_to_nir"); - return entry_point->shader; + return nir; } static void diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c index d45f5afec8b..34b39aa65f0 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c @@ -242,21 +242,21 @@ load_spirv(const char *filename, const char *entry, gl_shader_stage stage) .func = debug_func, } }; - nir_function *entry_point; + nir_shader *nir; void *buf; size_t size; read_file(filename, &buf, &size); - entry_point = spirv_to_nir(buf, size / 4, + nir = spirv_to_nir(buf, size / 4, NULL, 0, /* spec_entries */ stage, entry, &spirv_options, ir3_get_compiler_options(compiler)); - nir_print_shader(entry_point->shader, stdout); + nir_print_shader(nir, stdout); - return entry_point->shader; + return nir; } static void print_usage(void) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index df9a968f854..f244b0c991b 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -184,11 +184,10 @@ anv_shader_compile_to_nir(struct anv_device *device, }; - nir_function *entry_point = + nir_shader *nir = spirv_to_nir(spirv, module->size / 4, spec_entries, num_spec_entries, stage, entrypoint_name, &spirv_options, nir_options); - nir_shader *nir = entry_point->shader; assert(nir->info.stage == stage); nir_validate_shader(nir, "after spirv_to_nir"); ralloc_steal(mem_ctx, nir); diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c index 8d1ac9b5072..bb5a3f7452b 100644 --- a/src/mesa/main/glspirv.c +++ b/src/mesa/main/glspirv.c @@ -186,8 +186,6 @@ _mesa_spirv_to_nir(struct gl_context *ctx, gl_shader_stage stage, const nir_shader_compiler_options *options) { - nir_shader *nir = NULL; - struct gl_linked_shader *linked_shader = prog->_LinkedShaders[stage]; assert (linked_shader); @@ -217,7 +215,7 @@ _mesa_spirv_to_nir(struct gl_context *ctx, .caps = ctx->Const.SpirVCapabilities }; - nir_function *entry_point = + nir_shader *nir = spirv_to_nir((const uint32_t *) &spirv_module->Binary[0], spirv_module->Length / 4, spec_entries, spirv_data->NumSpecializationConstants, @@ -226,8 +224,7 @@ _mesa_spirv_to_nir(struct gl_context *ctx, options); free(spec_entries); - assert (entry_point); - nir = entry_point->shader; + assert(nir); assert(nir->info.stage == stage); nir->options = options; -- 2.30.2