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