mesa/glspirv: Add struct gl_shader_spirv_data
authorEduardo Lima Mitev <elima@igalia.com>
Mon, 13 Nov 2017 12:57:46 +0000 (13:57 +0100)
committerEduardo Lima Mitev <elima@igalia.com>
Tue, 12 Dec 2017 07:18:32 +0000 (08:18 +0100)
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>
src/mesa/main/glspirv.c
src/mesa/main/glspirv.h

index d4832db549da1cf3e22c0270f925c8a5a4f7e95d..8d1e652e088e12a1a494e1248a20bcf85fe7bd00 100644 (file)
@@ -42,6 +42,23 @@ _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 && 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
 _mesa_SpecializeShaderARB(GLuint shader,
                           const GLchar *pEntryPoint,
index 4e033735cfe96b38e3df4e63b7d1296bccf614a1..b8a0125ea9f2d16087f7d1414ef5925dc9432c8f 100644 (file)
@@ -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
  */