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