summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiang Yu <yuq825@gmail.com>2022-02-07 15:00:03 +0800
committerMarge Bot <emma+marge@anholt.net>2022-02-22 07:10:40 +0000
commit4a420c50f298e59a595eb7a9aa6c42b0ffd4dce2 (patch)
tree822e0695996dd5c202d67ae01b5687f867a8e4aa
parentbf09c08e315280da340690aa5bdf9ea1ff738108 (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.c45
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;