[Mesa-dev] [PATCH v2 23/25] mesa/glspirv: Add a _mesa_spirv_to_nir() function
Eduardo Lima Mitev
elima at igalia.com
Wed Dec 6 09:16:40 UTC 2017
On 12/06/2017 10:13 AM, Timothy Arceri wrote:
>
>
> 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);
>
Sure, will fix it locally.
>
>> +
>> + 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.
>
Agree. Will remove it locally.
> With those two things addressed:
>
> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
>
Thanks!
>> +
>> + 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