[Mesa-dev] [PATCH 05/24] mesa/glspirv: Add struct gl_shader_spirv_data
Ian Romanick
idr at freedesktop.org
Mon Nov 27 22:22:25 UTC 2017
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.romanick at 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
> */
>
More information about the mesa-dev
mailing list