On Mar 23, 2016 17:13, "Miklós Máté" <mtm...@gmail.com> wrote: > > This fixes premature deallocation on unbind, and introduces > support for deleting GLX drawables while they are current to a context. > > Note that in practice this also introduces a resource leak, because nobody > uses the GLX 1.3 glXDestroyWindow and glXDestroyPixmap calls. > > This fixes disappearing characters in SW:KotOR when soft shadows are enabled. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93955
Chrome has hit the same problem. There is no way to fix glx without breaking glx 1.3. I think we should educate people still using glx 1.2 to go to 1.3 instead. That's what we did for chrome. Stéphane > > Signed-off-by: Miklós Máté <mtm...@gmail.com> > --- > src/glx/dri_common.c | 3 ++- > src/glx/glx_pbuffer.c | 8 ++++++-- > src/glx/glxcmds.c | 8 ++++++-- > 3 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c > index 6728d38..7051fa0 100644 > --- a/src/glx/dri_common.c > +++ b/src/glx/dri_common.c > @@ -420,7 +420,8 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) > (*pdraw->destroyDrawable) (pdraw); > return NULL; > } > - pdraw->refcount = 1; > + /* created and bound */ > + pdraw->refcount = 1 + 1; > > return pdraw; > } > diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c > index 231ab20..860c039 100644 > --- a/src/glx/glx_pbuffer.c > +++ b/src/glx/glx_pbuffer.c > @@ -217,6 +217,7 @@ CreateDRIDrawable(Display *dpy, struct glx_config *config, > (*pdraw->destroyDrawable) (pdraw); > return GL_FALSE; > } > + pdraw->refcount = 1; > > pdraw->textureTarget = determineTextureTarget(attrib_list, num_attribs); > pdraw->textureFormat = determineTextureFormat(attrib_list, num_attribs); > @@ -233,8 +234,11 @@ DestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) > > if (priv != NULL && pdraw != NULL) { > xid = pdraw->xDrawable; > - (*pdraw->destroyDrawable) (pdraw); > - __glxHashDelete(priv->drawHash, drawable); > + pdraw->refcount --; > + if (pdraw->refcount == 0) { > + (*pdraw->destroyDrawable) (pdraw); > + __glxHashDelete(priv->drawHash, drawable); > + } > if (destroy_xdrawable) > XFreePixmap(priv->dpy, xid); > } > diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c > index 93e8db5..ce798c6 100644 > --- a/src/glx/glxcmds.c > +++ b/src/glx/glxcmds.c > @@ -753,6 +753,7 @@ glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap) > xid = None; > break; > } > + pdraw->refcount = 1; > } while (0); > > if (xid == None) { > @@ -806,8 +807,11 @@ glXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap) > __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap); > > if (priv != NULL && pdraw != NULL) { > - (*pdraw->destroyDrawable) (pdraw); > - __glxHashDelete(priv->drawHash, glxpixmap); > + pdraw->refcount --; > + if (pdraw->refcount == 0) { > + (*pdraw->destroyDrawable) (pdraw); > + __glxHashDelete(priv->drawHash, glxpixmap); > + } > } > } > #endif > -- > 2.8.0.rc3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev