summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/shaderobj.c
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2016-11-07 14:43:48 +1100
committerTimothy Arceri <[email protected]>2016-11-19 15:45:46 +1100
commit65cd0a0d7f411eefac81408ebf7b704ccd1c9bf7 (patch)
treef53070bc0cb2e26248eeab49dbf2191c3f841ba8 /src/mesa/main/shaderobj.c
parent0c85d2fea406df033c27201ba5e7257874a67a9a (diff)
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 <[email protected]>
Diffstat (limited to 'src/mesa/main/shaderobj.c')
-rw-r--r--src/mesa/main/shaderobj.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 8fd574e5121..fe0b45f57e8 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)
{