mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 09:10:11 +01:00
mesa/glspirv: Add struct gl_shader_spirv_data
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(). v2: Readability improvements (Ian Romanick) Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
74f98ab76f
commit
a8889f5cc7
2 changed files with 42 additions and 0 deletions
|
|
@ -42,6 +42,23 @@ _mesa_spirv_module_reference(struct gl_spirv_module **dest,
|
||||||
p_atomic_inc(&src->RefCount);
|
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 && 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
|
void GLAPIENTRY
|
||||||
_mesa_SpecializeShaderARB(GLuint shader,
|
_mesa_SpecializeShaderARB(GLuint shader,
|
||||||
const GLchar *pEntryPoint,
|
const GLchar *pEntryPoint,
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,35 @@ struct gl_spirv_module {
|
||||||
char Binary[0];
|
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
|
void
|
||||||
_mesa_spirv_module_reference(struct gl_spirv_module **dest,
|
_mesa_spirv_module_reference(struct gl_spirv_module **dest,
|
||||||
struct gl_spirv_module *src);
|
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
|
* \name API functions
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue