From 4a420c50f298e59a595eb7a9aa6c42b0ffd4dce2 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Mon, 7 Feb 2022 15:00:03 +0800 Subject: [PATCH] glx: merge drawable release to the same function Reviewed-by: Pierre-Eric Pelloux-Prayer Signed-off-by: Qiang Yu Part-of: --- src/glx/dri_common.c | 45 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c index 502b6a10d39..fd52b0e347d 100644 --- a/src/glx/dri_common.c +++ b/src/glx/dri_common.c @@ -419,36 +419,37 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) return pdraw; } +static void +releaseDrawable(const struct glx_display *priv, GLXDrawable drawable) +{ + __GLXDRIdrawable *pdraw; + + if (__glxHashLookup(priv->drawHash, drawable, (void *) &pdraw) == 0) { + /* Only native window and pbuffer have same GLX and X11 drawable ID. */ + if (pdraw->drawable == pdraw->xDrawable) { + pdraw->refcount --; + /* If pbuffer's refcount reaches 0, it must be imported from other + * display. Because pbuffer created from this display will always + * hold the last refcount until destroy the GLXPbuffer object. + */ + if (pdraw->refcount == 0) { + pdraw->destroyDrawable(pdraw); + __glxHashDelete(priv->drawHash, drawable); + } + } + } +} + _X_HIDDEN void driReleaseDrawables(struct glx_context *gc) { const struct glx_display *priv = gc->psc->display; - __GLXDRIdrawable *pdraw; if (priv == NULL) return; - if (__glxHashLookup(priv->drawHash, - gc->currentDrawable, (void *) &pdraw) == 0) { - if (pdraw->drawable == pdraw->xDrawable) { - pdraw->refcount --; - if (pdraw->refcount == 0) { - pdraw->destroyDrawable(pdraw); - __glxHashDelete(priv->drawHash, gc->currentDrawable); - } - } - } - - if (__glxHashLookup(priv->drawHash, - gc->currentReadable, (void *) &pdraw) == 0) { - if (pdraw->drawable == pdraw->xDrawable) { - pdraw->refcount --; - if (pdraw->refcount == 0) { - pdraw->destroyDrawable(pdraw); - __glxHashDelete(priv->drawHash, gc->currentReadable); - } - } - } + releaseDrawable(priv, gc->currentDrawable); + releaseDrawable(priv, gc->currentReadable); gc->currentDrawable = None; gc->currentReadable = None;