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 <emil.velikov@collabora.com>
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user