summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaio Marcelo de Oliveira Filho <[email protected]>2019-05-19 00:22:17 -0700
committerCaio Marcelo de Oliveira Filho <[email protected]>2019-05-29 10:34:35 -0700
commite45bf01940fa6692d4f1d9385c2d6466da06a9bb (patch)
tree4e8c8694747bb1d65374f878434c03020f8aec65 /src
parenta3bfdacb6c9f992dd1933c163c2580049ffea11e (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/amd/vulkan/radv_shader.c9
-rw-r--r--src/compiler/spirv/nir_spirv.h12
-rw-r--r--src/compiler/spirv/spirv2nir.c8
-rw-r--r--src/compiler/spirv/spirv_to_nir.c5
-rw-r--r--src/freedreno/vulkan/tu_shader.c8
-rw-r--r--src/gallium/drivers/freedreno/ir3/ir3_cmdline.c8
-rw-r--r--src/intel/vulkan/anv_pipeline.c3
-rw-r--r--src/mesa/main/glspirv.c7
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;