[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