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:
Eduardo Lima Mitev 2017-11-13 13:57:46 +01:00
parent 74f98ab76f
commit a8889f5cc7
2 changed files with 42 additions and 0 deletions

View file

@ -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,

View file

@ -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
*/ */