/** * Callback for deleting shader and shader programs objects. * Called by _mesa_HashDeleteAll(). */ static void delete_shader_cb(GLuint id, void *data, void *userData) { GLcontext *ctx = (GLcontext *) userData; struct gl_shader *sh = (struct gl_shader *) data; if (sh->Type == GL_FRAGMENT_SHADER || sh->Type == GL_VERTEX_SHADER) { _mesa_free_shader(ctx, sh); } else { struct gl_shader_program *shProg = (struct gl_shader_program *) data; ASSERT(shProg->Type == GL_SHADER_PROGRAM_MESA); _mesa_free_shader_program(ctx, shProg); } }
/* XXX this could be static */ void _mesa_reference_shader_program(GLcontext *ctx, struct gl_shader_program **ptr, struct gl_shader_program *shProg) { assert(ptr); if (*ptr == shProg) { /* no-op */ return; } if (*ptr) { /* Unreference the old shader program */ GLboolean deleteFlag = GL_FALSE; struct gl_shader_program *old = *ptr; ASSERT(old->RefCount > 0); old->RefCount--; /*printf("SHPROG DECR %p (%d) to %d\n", (void*) old, old->Name, old->RefCount);*/ deleteFlag = (old->RefCount == 0); if (deleteFlag) { _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name); _mesa_free_shader_program(ctx, old); } *ptr = NULL; } assert(!*ptr); if (shProg) { shProg->RefCount++; /*printf("SHPROG INCR %p (%d) to %d\n", (void*) shProg, shProg->Name, shProg->RefCount);*/ *ptr = shProg; } }