diff options
author | Qiang Yu <yuq825@gmail.com> | 2022-02-07 15:00:03 +0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-02-22 07:10:40 +0000 |
commit | 4a420c50f298e59a595eb7a9aa6c42b0ffd4dce2 (patch) | |
tree | 822e0695996dd5c202d67ae01b5687f867a8e4aa | |
parent | bf09c08e315280da340690aa5bdf9ea1ff738108 (diff) |
glx: merge drawable release to the same function
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14926>
-rw-r--r-- | src/glx/dri_common.c | 45 |
1 files 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; |