[Mesa-dev] [PATCH 14/70] mesa: create new gl_shader_program_data struct
Timothy Arceri
timothy.arceri at collabora.com
Fri Nov 11 00:45:56 UTC 2016
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.
---
src/mesa/main/mtypes.h | 25 +++++++++++++++++++++++++
src/mesa/main/shaderobj.c | 41 +++++++++++++++++++++++++++++++++++++++++
src/mesa/main/shaderobj.h | 5 +++++
3 files changed, 71 insertions(+)
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 600b1da..9500ec9 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..a753a1b 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,35 @@ _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;
+ }
+
+ assert(!*ptr);
+ 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 +279,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,
--
2.7.4
More information about the mesa-dev
mailing list