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 <tarc...@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 >> */ >> > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev