[Mesa-dev] [PATCH 7/8] glx: fix the refcounting of dri drawables
Stéphane Marchesin
stephane.marchesin at gmail.com
Thu Apr 7 09:05:58 UTC 2016
On Mar 23, 2016 17:13, "Miklós Máté" <mtmkls at 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é <mtmkls at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160407/8557b093/attachment.html>
More information about the mesa-dev
mailing list