Mesa (staging/22.1): glx/kopper: Enable GLX_EXT_swap_control etc.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu May 5 18:05:48 UTC 2022


Module: Mesa
Branch: staging/22.1
Commit: cbc697d2d6b594eb2611096d9ccd8ef7809e46ea
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cbc697d2d6b594eb2611096d9ccd8ef7809e46ea

Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Apr 28 17:19:13 2022 -0400

glx/kopper: Enable GLX_EXT_swap_control etc.

This requires newly tracking the max swap interval since kopper can't do
abs(interval) > 1 yet.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15800>

---

 src/glx/dri2_glx.c    |  1 +
 src/glx/dri3_glx.c    |  1 +
 src/glx/drisw_glx.c   | 38 +++++++++++++++++++++++++++++++++++++-
 src/glx/drisw_priv.h  |  1 +
 src/glx/glx_pbuffer.c |  2 +-
 src/glx/glxclient.h   |  2 ++
 6 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index 8c711c9cff8..fd090bf374f 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -1272,6 +1272,7 @@ dri2CreateScreen(int screen, struct glx_display * priv)
       psp->waitForSBC = dri2WaitForSBC;
       psp->setSwapInterval = dri2SetSwapInterval;
       psp->getSwapInterval = dri2GetSwapInterval;
+      psp->maxSwapInterval = INT_MAX;
 
       __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control");
    }
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 4c1fea97a15..6370ca05beb 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -1021,6 +1021,7 @@ dri3_create_screen(int screen, struct glx_display * priv)
    psp->getSwapInterval = dri3_get_swap_interval;
    psp->bindTexImage = dri3_bind_tex_image;
    psp->releaseTexImage = dri3_release_tex_image;
+   psp->maxSwapInterval = INT_MAX;
 
    __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control");
    __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync");
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index 6f174d6f348..96b6f227408 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -697,9 +697,11 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable,
    }
 
    /* Create a new drawable */
-   if (kopper)
+   if (kopper) {
       pdp->driDrawable =
          (*kopper->createNewDrawable) (psc->driScreen, config->driConfig, pdp, !(type & GLX_WINDOW_BIT));
+      pdp->swapInterval = 1;
+   }
    else
       pdp->driDrawable =
          (*swrast->createNewDrawable) (psc->driScreen, config->driConfig, pdp);
@@ -836,6 +838,14 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions)
 				     "GLX_ARB_context_flush_control");
       }
    }
+
+   if (psc->kopper) {
+       __glXEnableDirectExtension(&psc->base, "GLX_EXT_swap_control");
+       __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control");
+       __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control");
+       // This needs to check whether RELAXED is available
+       // __glXEnableDirectExtension(&psc->base, "GLX_EXT_swap_control_tear");
+   }
 }
 
 static int
@@ -863,6 +873,26 @@ check_xshm(Display *dpy)
    return ret;
 }
 
+static int
+kopperSetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
+{
+   struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw;
+   struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc;
+
+   psc->kopper->setSwapInterval(pdp->driDrawable, interval);
+   pdp->swapInterval = interval;
+
+   return 1;
+}
+
+static int
+kopperGetSwapInterval(__GLXDRIdrawable *pdraw)
+{
+   struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw;
+
+   return pdp->swapInterval;
+}
+
 static struct glx_screen *
 driswCreateScreenDriver(int screen, struct glx_display *priv,
                         const char *driver)
@@ -959,6 +989,12 @@ driswCreateScreenDriver(int screen, struct glx_display *priv,
    if (psc->copySubBuffer)
       psp->copySubBuffer = driswCopySubBuffer;
 
+   if (psc->kopper) {
+      psp->setSwapInterval = kopperSetSwapInterval;
+      psp->getSwapInterval = kopperGetSwapInterval;
+      psp->maxSwapInterval = 1;
+   }
+
    return &psc->base;
 
  handle_error:
diff --git a/src/glx/drisw_priv.h b/src/glx/drisw_priv.h
index 1d3ad81fcf9..401d94fc755 100644
--- a/src/glx/drisw_priv.h
+++ b/src/glx/drisw_priv.h
@@ -71,6 +71,7 @@ struct drisw_drawable
    XImage *ximage;
    XShmSegmentInfo shminfo;
    int xDepth;
+   int swapInterval;
 };
 
 _X_HIDDEN int
diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c
index ebd130146d4..e56d4290ed2 100644
--- a/src/glx/glx_pbuffer.c
+++ b/src/glx/glx_pbuffer.c
@@ -312,7 +312,7 @@ __glXGetDrawableAttribute(Display * dpy, GLXDrawable drawable,
          *value = pdraw->psc->driScreen->getSwapInterval(pdraw);
          return 0;
       } else if (attribute == GLX_MAX_SWAP_INTERVAL_EXT) {
-         *value = INT_MAX;
+         *value = pdraw->psc->driScreen->maxSwapInterval;
          return 0;
       } else if (attribute == GLX_LATE_SWAPS_TEAR_EXT) {
          *value = __glXExtensionBitIsEnabled(pdraw->psc,
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index e03b410283d..9d402bec664 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -137,6 +137,8 @@ struct __GLXDRIscreenRec {
    int (*getBufferAge)(__GLXDRIdrawable *pdraw);
    void (*bindTexImage)(__GLXDRIdrawable *pdraw, int buffer, const int *attribs);
    void (*releaseTexImage)(__GLXDRIdrawable *pdraw, int buffer);
+
+   int maxSwapInterval;
 };
 
 struct __GLXDRIdrawableRec



More information about the mesa-commit mailing list