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:
parent
1e90e3325b
commit
b6ea787903
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -71,6 +71,7 @@ struct drisw_drawable
|
|||
XImage *ximage;
|
||||
XShmSegmentInfo shminfo;
|
||||
int xDepth;
|
||||
int swapInterval;
|
||||
};
|
||||
|
||||
_X_HIDDEN int
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue