Mesa (master): mesa: create new gl_shader_program_data struct

Timothy Arceri tarceri at kemper.freedesktop.org
Sat Nov 19 06:10:40 UTC 2016


Module: Mesa
Branch: master
Commit: 65cd0a0d7f411eefac81408ebf7b704ccd1c9bf7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=65cd0a0d7f411eefac81408ebf7b704ccd1c9bf7

Author: Timothy Arceri <timothy.arceri at collabora.com>
Date:   Mon Nov  7 14:43:48 2016 +1100

mesa: create new gl_shader_program_data struct

This will be used to share data between gl_program and gl_shader_program
allowing for greater code simplification as we can remove a number of
awkward uses of gl_shader_program.

Reviewed-by: Emil Velikov <emil.velikov at collabora.com>

---

 src/mesa/main/mtypes.h    | 25 +++++++++++++++++++++++++
 src/mesa/main/shaderobj.c | 39 +++++++++++++++++++++++++++++++++++++++
 src/mesa/main/shaderobj.h |  5 +++++
 3 files changed, 69 insertions(+)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 440bbb4..aa4d1d5 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2625,6 +2625,31 @@ struct gl_program_resource
 };
 
 /**
+ * A data structure to be shared by gl_shader_program and gl_program.
+ */
+struct gl_shader_program_data
+{
+   GLint RefCount;  /**< Reference count */
+
+   unsigned NumUniformStorage;
+   unsigned NumHiddenUniforms;
+   struct gl_uniform_storage *UniformStorage;
+
+   unsigned NumUniformBlocks;
+   struct gl_uniform_block *UniformBlocks;
+
+   unsigned NumShaderStorageBlocks;
+   struct gl_uniform_block *ShaderStorageBlocks;
+
+   struct gl_active_atomic_buffer *AtomicBuffers;
+   unsigned NumAtomicBuffers;
+
+   GLboolean LinkStatus;   /**< GL_LINK_STATUS */
+   GLboolean Validated;
+   GLchar *InfoLog;
+};
+
+/**
  * A GLSL program object.
  * Basically a linked collection of vertex and fragment shaders.
  */
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 8fd574e..fe0b45f 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -41,6 +41,7 @@
 #include "program/prog_parameter.h"
 #include "util/ralloc.h"
 #include "util/string_to_uint_map.h"
+#include "util/u_atomic.h"
 
 /**********************************************************************/
 /*** Shader object functions                                        ***/
@@ -208,6 +209,33 @@ _mesa_lookup_shader_err(struct gl_context *ctx, GLuint name, const char *caller)
 /**********************************************************************/
 
 
+void
+_mesa_reference_shader_program_data(struct gl_context *ctx,
+                                    struct gl_shader_program_data **ptr,
+                                    struct gl_shader_program_data *data)
+{
+   if (*ptr == data)
+      return;
+
+   if (*ptr) {
+      struct gl_shader_program_data *oldData = *ptr;
+
+      assert(oldData->RefCount > 0);
+
+      if (p_atomic_dec_zero(&oldData->RefCount)) {
+         assert(ctx);
+         ralloc_free(oldData);
+      }
+
+      *ptr = NULL;
+   }
+
+   if (data)
+      p_atomic_inc(&data->RefCount);
+
+   *ptr = data;
+}
+
 /**
  * Set ptr to point to shProg.
  * If ptr is pointing to another object, decrement its refcount (and delete
@@ -249,6 +277,17 @@ _mesa_reference_shader_program_(struct gl_context *ctx,
    }
 }
 
+static struct gl_shader_program_data *
+create_shader_program_data()
+{
+   struct gl_shader_program_data *data;
+   data = rzalloc(NULL, struct gl_shader_program_data);
+   if (data)
+      data->RefCount = 1;
+
+   return data;
+}
+
 static void
 init_shader_program(struct gl_shader_program *prog)
 {
diff --git a/src/mesa/main/shaderobj.h b/src/mesa/main/shaderobj.h
index 1249732..c5153d0 100644
--- a/src/mesa/main/shaderobj.h
+++ b/src/mesa/main/shaderobj.h
@@ -66,6 +66,11 @@ _mesa_reference_shader_program_(struct gl_context *ctx,
                                struct gl_shader_program **ptr,
                                struct gl_shader_program *shProg);
 
+void
+_mesa_reference_shader_program_data(struct gl_context *ctx,
+                                    struct gl_shader_program_data **ptr,
+                                    struct gl_shader_program_data *data);
+
 static inline void
 _mesa_reference_shader_program(struct gl_context *ctx,
                                struct gl_shader_program **ptr,




More information about the mesa-commit mailing list