From: Timothy Arceri Date: Mon, 7 Nov 2016 03:43:48 +0000 (+1100) Subject: mesa: create new gl_shader_program_data struct X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=65cd0a0d7f411eefac81408ebf7b704ccd1c9bf7;p=mesa.git 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 --- diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 440bbb4b762..aa4d1d5e8f0 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2624,6 +2624,31 @@ struct gl_program_resource uint8_t StageReferences; /** Bitmask of shader stage references. */ }; +/** + * 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 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) { diff --git a/src/mesa/main/shaderobj.h b/src/mesa/main/shaderobj.h index 12497328f98..c5153d09ba4 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,