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