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@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15800>
This commit is contained in:
Adam Jackson 2022-04-28 17:19:13 -04:00 committed by Marge Bot
parent 1e90e3325b
commit b6ea787903
6 changed files with 43 additions and 2 deletions

View File

@ -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");
}

View File

@ -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");

View File

@ -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:

View File

@ -71,6 +71,7 @@ struct drisw_drawable
XImage *ximage;
XShmSegmentInfo shminfo;
int xDepth;
int swapInterval;
};
_X_HIDDEN int

View File

@ -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,

View File

@ -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