From f4070956d4cd06b27c596ff4780b945537ceb84f Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Mon, 26 Feb 2018 14:27:40 +0100 Subject: [PATCH] glx/dri: Add a driconf option to disable GLX_SGI_video_sync Drivers on virtual hardware don't want to expose this extension to GLX compositors, similarly to GLX_OML_sync_control, since that significantly increases latency. Signed-off-by: Thomas Hellstrom Reviewed-by: Brian Paul Reviewed-by: Sinclair Yeh Reviewed-by: Deepak Rawat --- src/glx/dri2_glx.c | 9 ++++++--- src/glx/dri3_glx.c | 6 +++++- src/util/xmlpool/t_options.h | 5 +++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 0f44635725d..91afc337505 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -1102,7 +1102,6 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, extensions = psc->core->getExtensions(psc->driScreen); - __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); @@ -1207,6 +1206,7 @@ dri2CreateScreen(int screen, struct glx_display * priv) char *driverName = NULL, *loader_driverName, *deviceName, *tmp; drm_magic_t magic; int i; + unsigned char disable; psc = calloc(1, sizeof *psc); if (psc == NULL) @@ -1325,8 +1325,6 @@ dri2CreateScreen(int screen, struct glx_display * priv) psp->getBufferAge = NULL; if (pdp->driMinor >= 2) { - unsigned char disable; - psp->getDrawableMSC = dri2DrawableGetMSC; psp->waitForMSC = dri2WaitForMSC; psp->waitForSBC = dri2WaitForSBC; @@ -1338,6 +1336,11 @@ dri2CreateScreen(int screen, struct glx_display * priv) __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); } + if (psc->config->configQueryb(psc->driScreen, + "glx_disable_sgi_video_sync", + &disable) || !disable) + __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); + /* DRI2 supports SubBuffer through DRI2CopyRegion, so it's always * available.*/ psp->copySubBuffer = dri2CopySubBuffer; diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 016f91b1963..adfc3499688 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -721,7 +721,6 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, extensions = psc->core->getExtensions(psc->driScreen); - __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); @@ -956,6 +955,11 @@ dri3_create_screen(int screen, struct glx_display * priv) &disable) || !disable) __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); + if (psc->config->configQueryb(psc->driScreen, + "glx_disable_sgi_video_sync", + &disable) || !disable) + __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); + psp->copySubBuffer = dri3_copy_sub_buffer; __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h index 5f377c9dcd5..3ada813d639 100644 --- a/src/util/xmlpool/t_options.h +++ b/src/util/xmlpool/t_options.h @@ -346,6 +346,11 @@ DRI_CONF_OPT_BEGIN_B(glx_disable_oml_sync_control, def) \ DRI_CONF_DESC(en, gettext("Disable the GLX_OML_sync_control extension")) \ DRI_CONF_OPT_END +#define DRI_CONF_DISABLE_SGI_VIDEO_SYNC(def) \ +DRI_CONF_OPT_BEGIN_B(glx_disable_sgi_video_sync, def) \ + DRI_CONF_DESC(en, gettext("Disable the GLX_SGI_video_sync extension")) \ +DRI_CONF_OPT_END + /** * \brief Software-fallback options. To allow using features (like -- 2.30.2