Mesa (main): glx: merge drawable release to the same function

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Feb 22 07:35:14 UTC 2022


Module: Mesa
Branch: main
Commit: 4a420c50f298e59a595eb7a9aa6c42b0ffd4dce2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4a420c50f298e59a595eb7a9aa6c42b0ffd4dce2

Author: Qiang Yu <yuq825 at gmail.com>
Date:   Mon Feb  7 15:00:03 2022 +0800

glx: merge drawable release to the same function

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14926>

---

 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;



More information about the mesa-commit mailing list