From: Nicolai Hähnle <nicolai.haeh...@amd.com> v2: Make the SPIR-V module struct part of a larger gl_shader_spirv_data struct that will be introduced later, and don't reference it directly in gl_shader. (Eduardo Lima) --- src/mesa/main/glspirv.c | 19 +++++++++++++++++++ src/mesa/main/glspirv.h | 16 ++++++++++++++++ 2 files changed, 35 insertions(+)
diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c index 57068023091..eb869356632 100644 --- a/src/mesa/main/glspirv.c +++ b/src/mesa/main/glspirv.c @@ -23,6 +23,25 @@ #include "glspirv.h" +#include "util/u_atomic.h" + +void +_mesa_spirv_module_reference(struct gl_spirv_module **dest, + struct gl_spirv_module *src) +{ + struct gl_spirv_module *old = *dest; + + if (old) { + if (p_atomic_dec_zero(&old->RefCount)) + 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 1de88717faa..4e033735cfe 100644 --- a/src/mesa/main/glspirv.h +++ b/src/mesa/main/glspirv.h @@ -31,6 +31,22 @@ extern "C" { #endif /** + * A SPIR-V module contains the raw SPIR-V binary as set by ShaderBinary. + * + * It is reference-counted, because the same module can be attached to multiple + * shader objects simultaneously. + */ +struct gl_spirv_module { + unsigned RefCount; + GLint Length; + char Binary[0]; +}; + +void +_mesa_spirv_module_reference(struct gl_spirv_module **dest, + struct gl_spirv_module *src); + +/** * \name API functions */ /*@{*/ -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev