diff options
-rw-r--r-- | src/mesa/main/mtypes.h | 25 | ||||
-rw-r--r-- | src/mesa/main/shaderobj.c | 39 | ||||
-rw-r--r-- | src/mesa/main/shaderobj.h | 5 |
3 files changed, 69 insertions, 0 deletions
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 @@ -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 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, |