mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 02:30:18 +01:00
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 <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
a3bfdacb6c
commit
e45bf01940
8 changed files with 28 additions and 32 deletions
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue