mesa: Add locking to programs.

Reviewed-by: Timothy Arceri <t_arceri@yahoo.com.au>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Matt Turner 2015-07-30 11:25:27 -07:00
parent 3c57a102eb
commit 1dd943d7fb
2 changed files with 12 additions and 8 deletions

View file

@ -1888,6 +1888,7 @@ enum gl_frag_depth_layout
*/
struct gl_program
{
mtx_t Mutex;
GLuint Id;
GLint RefCount;
GLubyte *String; /**< Null-terminated program text */

View file

@ -226,6 +226,7 @@ init_program_struct(struct gl_program *prog, GLenum target, GLuint id)
assert(prog);
memset(prog, 0, sizeof(*prog));
mtx_init(&prog->Mutex, mtx_plain);
prog->Id = id;
prog->Target = target;
prog->RefCount = 1;
@ -418,6 +419,7 @@ _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog)
ralloc_free(prog->nir);
}
mtx_destroy(&prog->Mutex);
free(prog);
}
@ -463,17 +465,18 @@ _mesa_reference_program_(struct gl_context *ctx,
if (*ptr) {
GLboolean deleteFlag;
struct gl_program *oldProg = *ptr;
/*mtx_lock(&(*ptr)->Mutex);*/
assert((*ptr)->RefCount > 0);
(*ptr)->RefCount--;
mtx_lock(&oldProg->Mutex);
assert(oldProg->RefCount > 0);
oldProg->RefCount--;
deleteFlag = ((*ptr)->RefCount == 0);
/*mtx_lock(&(*ptr)->Mutex);*/
deleteFlag = (oldProg->RefCount == 0);
mtx_unlock(&oldProg->Mutex);
if (deleteFlag) {
assert(ctx);
ctx->Driver.DeleteProgram(ctx, *ptr);
ctx->Driver.DeleteProgram(ctx, oldProg);
}
*ptr = NULL;
@ -481,9 +484,9 @@ _mesa_reference_program_(struct gl_context *ctx,
assert(!*ptr);
if (prog) {
/*mtx_lock(&prog->Mutex);*/
mtx_lock(&prog->Mutex);
prog->RefCount++;
/*mtx_unlock(&prog->Mutex);*/
mtx_unlock(&prog->Mutex);
}
*ptr = prog;