From 65cd0a0d7f411eefac81408ebf7b704ccd1c9bf7 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 7 Nov 2016 14:43:48 +1100 Subject: [PATCH] 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 --- 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, -- 2.7.4