On 11/15/2017 05:22 AM, Eduardo Lima Mitev wrote: > This is a per-shader structure holding the SPIR-V data associated with the > shader (binary module, specialization constants and entry-point). > > This is needed because both gl_shader and gl_linked_shader need to share this > data. Instead of copying the data, we pass a reference to it upon program > linking. That's why it is reference-counted. > > This struct is created and associated with the shader upon calling > glShaderBinary(), then subsequently filled up by the call to > glSpecializeShaderARB(). > --- > src/mesa/main/glspirv.c | 19 +++++++++++++++++++ > src/mesa/main/glspirv.h | 25 +++++++++++++++++++++++++ > 2 files changed, 44 insertions(+) > > diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c > index eb869356632..d4724ad245c 100644 > --- a/src/mesa/main/glspirv.c > +++ b/src/mesa/main/glspirv.c > @@ -42,6 +42,25 @@ _mesa_spirv_module_reference(struct gl_spirv_module **dest, > p_atomic_inc(&src->RefCount); > } > > +void > +_mesa_shader_spirv_data_reference(struct gl_shader_spirv_data **dest, > + struct gl_shader_spirv_data *src) > +{ > + struct gl_shader_spirv_data *old = *dest; > + > + if (old) { > + if (p_atomic_dec_zero(&old->RefCount)) { > + _mesa_spirv_module_reference(&(*dest)->SpirVModule, NULL); > + ralloc_free(old); > + } > + }
Same trivial comment here as on the previous patch, and the same Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > + > + *dest = src; > + > + if (src) > + p_atomic_inc(&src->RefCount); > +} > + > void GLAPIENTRY > _mesa_SpecializeShaderARB(GLuint shader, > const GLchar *pEntryPoint, > diff --git a/src/mesa/main/glspirv.h b/src/mesa/main/glspirv.h > index 4e033735cfe..b8a0125ea9f 100644 > --- a/src/mesa/main/glspirv.h > +++ b/src/mesa/main/glspirv.h > @@ -42,10 +42,35 @@ struct gl_spirv_module { > char Binary[0]; > }; > > +/** > + * SPIR-V data needed to compile and link a SPIR-V shader. > + * > + * It includes a SPIR-V binary that is potentially shared among different > + * shaders; and shader-specific specialization constants and entry point. > + * > + * It is reference-counted because it is shared between gl_shader and its > + * corresponding gl_linked_shader. > + */ > +struct gl_shader_spirv_data { > + GLint RefCount; > + > + struct gl_spirv_module *SpirVModule; > + > + GLchar *SpirVEntryPoint; > + > + GLuint NumSpecializationConstants; > + GLuint *SpecializationConstantsIndex; > + GLuint *SpecializationConstantsValue; > +}; > + > void > _mesa_spirv_module_reference(struct gl_spirv_module **dest, > struct gl_spirv_module *src); > > +void > +_mesa_shader_spirv_data_reference(struct gl_shader_spirv_data **dest, > + struct gl_shader_spirv_data *src); > + > /** > * \name API functions > */ > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev