Re: [Mesa-dev] [PATCH 2/2] mesa: reference shared state in glPushAttrib(GL_TEXTURE_BIT)
Looks good. Good find! Jose - Original Message - This fixes a dangling texture object pointer bug hit via wglShareLists(). When we push the GL_TEXTURE_BIT state we may push references to the default texture objects which are owned by the gl_shared_state object. We don't want to accidentally delete that shared state while the attribute stack references shared objects. So keep a reference to it. NOTE: This is a candidate for the 8.0 branch. --- src/mesa/main/attrib.c | 13 + 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 01e7945..1068dd8 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -47,6 +47,7 @@ #include multisample.h #include points.h #include polygon.h +#include shared.h #include scissor.h #include stencil.h #include texenv.h @@ -165,6 +166,13 @@ struct texture_state * deleted while saved in the attribute stack). */ struct gl_texture_object *SavedTexRef[MAX_TEXTURE_UNITS][NUM_TEXTURE_TARGETS]; + + /* We need to keep a reference to the shared state. That's where the +* default texture objects are kept. We don't want that state to be +* freed while the attribute stack contains pointers to any default +* texture objects. +*/ + struct gl_shared_state *SharedRef; }; @@ -437,6 +445,8 @@ _mesa_PushAttrib(GLbitfield mask) } } + _mesa_reference_shared_state(ctx, texstate-SharedRef, ctx-Shared); + _mesa_unlock_context_textures(ctx); save_attrib_data(head, GL_TEXTURE_BIT, texstate); @@ -806,6 +816,8 @@ pop_texture_group(struct gl_context *ctx, struct texture_state *texstate) _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + texstate-Texture.CurrentUnit); + _mesa_reference_shared_state(ctx, texstate-SharedRef, NULL); + _mesa_unlock_context_textures(ctx); } @@ -1605,6 +1617,7 @@ _mesa_free_attrib_data(struct gl_context *ctx) _mesa_reference_texobj(texstate-SavedTexRef[u][tgt], NULL); } } +_mesa_reference_shared_state(ctx, texstate-SharedRef, NULL); } else { /* any other chunks of state that requires special handling? */ -- 1.7.3.4 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 2/2] mesa: reference shared state in glPushAttrib(GL_TEXTURE_BIT)
This fixes a dangling texture object pointer bug hit via wglShareLists(). When we push the GL_TEXTURE_BIT state we may push references to the default texture objects which are owned by the gl_shared_state object. We don't want to accidentally delete that shared state while the attribute stack references shared objects. So keep a reference to it. NOTE: This is a candidate for the 8.0 branch. --- src/mesa/main/attrib.c | 13 + 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 01e7945..1068dd8 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -47,6 +47,7 @@ #include multisample.h #include points.h #include polygon.h +#include shared.h #include scissor.h #include stencil.h #include texenv.h @@ -165,6 +166,13 @@ struct texture_state * deleted while saved in the attribute stack). */ struct gl_texture_object *SavedTexRef[MAX_TEXTURE_UNITS][NUM_TEXTURE_TARGETS]; + + /* We need to keep a reference to the shared state. That's where the +* default texture objects are kept. We don't want that state to be +* freed while the attribute stack contains pointers to any default +* texture objects. +*/ + struct gl_shared_state *SharedRef; }; @@ -437,6 +445,8 @@ _mesa_PushAttrib(GLbitfield mask) } } + _mesa_reference_shared_state(ctx, texstate-SharedRef, ctx-Shared); + _mesa_unlock_context_textures(ctx); save_attrib_data(head, GL_TEXTURE_BIT, texstate); @@ -806,6 +816,8 @@ pop_texture_group(struct gl_context *ctx, struct texture_state *texstate) _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + texstate-Texture.CurrentUnit); + _mesa_reference_shared_state(ctx, texstate-SharedRef, NULL); + _mesa_unlock_context_textures(ctx); } @@ -1605,6 +1617,7 @@ _mesa_free_attrib_data(struct gl_context *ctx) _mesa_reference_texobj(texstate-SavedTexRef[u][tgt], NULL); } } +_mesa_reference_shared_state(ctx, texstate-SharedRef, NULL); } else { /* any other chunks of state that requires special handling? */ -- 1.7.3.4 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev