Fix program refcounting assertion failure during context tear-down
When purging the program hash table, the refcount _should_ be one since the program is referenced by the hash table. Need to explicitly set to zero before calling delete(). Also, purge high-level shader hash tables before low-level program hash tables.
This commit is contained in:
@@ -582,6 +582,8 @@ delete_program_cb(GLuint id, void *data, void *userData)
|
||||
{
|
||||
struct gl_program *prog = (struct gl_program *) data;
|
||||
GLcontext *ctx = (GLcontext *) userData;
|
||||
ASSERT(prog->RefCount == 1); /* should only be referenced by hash table */
|
||||
prog->RefCount = 0; /* now going away */
|
||||
ctx->Driver.DeleteProgram(ctx, prog);
|
||||
}
|
||||
|
||||
@@ -707,6 +709,12 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
|
||||
_mesa_HashDeleteAll(ss->DisplayList, delete_displaylist_cb, ctx);
|
||||
_mesa_DeleteHashTable(ss->DisplayList);
|
||||
|
||||
#if FEATURE_ARB_shader_objects
|
||||
_mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx);
|
||||
_mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);
|
||||
_mesa_DeleteHashTable(ss->ShaderObjects);
|
||||
#endif
|
||||
|
||||
#if defined(FEATURE_NV_vertex_program) || defined(FEATURE_NV_fragment_program)
|
||||
_mesa_HashDeleteAll(ss->Programs, delete_program_cb, ctx);
|
||||
_mesa_DeleteHashTable(ss->Programs);
|
||||
@@ -732,12 +740,6 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
|
||||
_mesa_HashDeleteAll(ss->ArrayObjects, delete_arrayobj_cb, ctx);
|
||||
_mesa_DeleteHashTable(ss->ArrayObjects);
|
||||
|
||||
#if FEATURE_ARB_shader_objects
|
||||
_mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx);
|
||||
_mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);
|
||||
_mesa_DeleteHashTable(ss->ShaderObjects);
|
||||
#endif
|
||||
|
||||
#if FEATURE_EXT_framebuffer_object
|
||||
_mesa_HashDeleteAll(ss->FrameBuffers, delete_framebuffer_cb, ctx);
|
||||
_mesa_DeleteHashTable(ss->FrameBuffers);
|
||||
|
||||
Reference in New Issue
Block a user