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