[Mesa-dev] [PATCH v2 23/25] mesa/glspirv: Add a _mesa_spirv_to_nir() function
Timothy Arceri
tarceri at itsqueeze.com
Wed Dec 6 09:13:26 UTC 2017
On 01/12/17 04:28, Eduardo Lima Mitev wrote:
> This is basically a wrapper around spirv_to_nir() that includes
> arguments setup and post-conversion validation.
>
> v2: Rebase update (SpirVCapabilities not a pointer anymore)
> ---
> src/mesa/main/glspirv.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/mesa/main/glspirv.h | 7 ++++++
> 2 files changed, 67 insertions(+)
>
> diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c
> index e5dc8b26ea9..2a20e4b5cc7 100644
> --- a/src/mesa/main/glspirv.c
> +++ b/src/mesa/main/glspirv.c
> @@ -159,6 +159,66 @@ _mesa_spirv_link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
> }
> }
>
> +nir_shader *
> +_mesa_spirv_to_nir(struct gl_context *ctx,
> + const struct gl_shader_program *prog,
> + 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);
> +
> + struct gl_shader_spirv_data *spirv_data = linked_shader->spirv_data;
> + assert(spirv_data);
> +
> + struct gl_spirv_module *spirv_module = spirv_data->SpirVModule;
> + assert (spirv_module != NULL);
> +
> + const char *entry_point_name = spirv_data->SpirVEntryPoint;
> + assert(entry_point_name);
> +
> + struct nir_spirv_specialization *spec_entries = NULL;
> + spec_entries = calloc(sizeof(*spec_entries),
> + spirv_data->NumSpecializationConstants);
Can we just make this:
struct nir_spirv_specialization *spec_entries =
calloc(sizeof(*spec_entries),
spirv_data->NumSpecializationConstants);
> +
> + for (unsigned i = 0; i < spirv_data->NumSpecializationConstants; ++i) {
> + spec_entries[i].id = spirv_data->SpecializationConstantsIndex[i];
> + spec_entries[i].data32 = spirv_data->SpecializationConstantsValue[i];
> + spec_entries[i].defined_on_module = false;
> + }
> +
> + nir_function *entry_point =
> + spirv_to_nir((const uint32_t *) &spirv_module->Binary[0],
> + spirv_module->Length / 4,
> + spec_entries, spirv_data->NumSpecializationConstants,
> + stage, entry_point_name,
> + &ctx->Const.SpirVCapabilities,
> + options);
> + free(spec_entries);
> +
> + assert (entry_point);
> + nir = entry_point->shader;
> + assert(nir->info.stage == stage);
> +
> + nir->options = options;
> +
> + nir->info.name =
> + ralloc_asprintf(nir, "SPIRV:%s:%d",
> + _mesa_shader_stage_to_abbrev(nir->info.stage),
> + prog->Name);
> + nir_validate_shader(nir);
> +
> + if (false) {
> + /* @FIXME: Only for debugging purposes */
> + nir_print_shader(nir, stdout);
> + fflush(stdout);
> + }
I'd rather we not commit this debug code, if you want this for
development please carry a patch around in your dev branch.
With those two things addressed:
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
> +
> + return nir;
> +}
> +
> void GLAPIENTRY
> _mesa_SpecializeShaderARB(GLuint shader,
> const GLchar *pEntryPoint,
> diff --git a/src/mesa/main/glspirv.h b/src/mesa/main/glspirv.h
> index 0f03b75c111..81626ce75b5 100644
> --- a/src/mesa/main/glspirv.h
> +++ b/src/mesa/main/glspirv.h
> @@ -24,6 +24,7 @@
> #ifndef GLSPIRV_H
> #define GLSPIRV_H
>
> +#include "compiler/nir/nir.h"
> #include "mtypes.h"
>
> #ifdef __cplusplus
> @@ -80,6 +81,12 @@ void
> _mesa_spirv_link_shaders(struct gl_context *ctx,
> struct gl_shader_program *prog);
>
> +nir_shader *
> +_mesa_spirv_to_nir(struct gl_context *ctx,
> + const struct gl_shader_program *prog,
> + gl_shader_stage stage,
> + const nir_shader_compiler_options *options);
> +
> /**
> * \name API functions
> */
>
More information about the mesa-dev
mailing list