From ff18be0872ad98bf842ba6dab02493a58985495e Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Mon, 11 Jul 2022 12:01:27 -0700 Subject: [PATCH] glx: Unify dri2/dri3 vblank_mode logic. We need it from kopper, as well. Reviewed-By: Mike Blumenkrantz Reviewed-by: Adam Jackson Part-of: --- src/glx/dri2_glx.c | 45 +++------------------------- src/glx/dri3_glx.c | 20 ++----------- src/glx/dri3_priv.h | 6 ---- src/loader/loader_dri3_helper.c | 27 ++--------------- src/loader/loader_dri_helper.c | 53 +++++++++++++++++++++++++++++++++ src/loader/loader_dri_helper.h | 6 ++++ 6 files changed, 69 insertions(+), 88 deletions(-) diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index e75ee2b7d38..c000139a74f 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -49,12 +49,7 @@ #include "dri_common.h" #include "dri2_priv.h" #include "loader.h" - -/* From driconf.h, user exposed so should be stable */ -#define DRI_CONF_VBLANK_NEVER 0 -#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 -#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 -#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 +#include "loader_dri_helper.h" #undef DRI2_MINOR #define DRI2_MINOR 1 @@ -302,7 +297,6 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable, __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; struct glx_display *dpyPriv; struct dri2_display *pdp; - GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; dpyPriv = __glXInitialize(psc->base.dpy); if (dpyPriv == NULL) @@ -317,25 +311,9 @@ dri2CreateDrawable(struct glx_screen *base, XID xDrawable, pdraw->base.drawable = drawable; pdraw->base.psc = &psc->base; pdraw->bufferCount = 0; - pdraw->swap_interval = 1; /* default may be overridden below */ + pdraw->swap_interval = dri_get_initial_swap_interval(psc->driScreen, psc->config); pdraw->have_back = 0; - if (psc->config) - psc->config->configQueryi(psc->driScreen, - "vblank_mode", &vblank_mode); - - switch (vblank_mode) { - case DRI_CONF_VBLANK_NEVER: - case DRI_CONF_VBLANK_DEF_INTERVAL_0: - pdraw->swap_interval = 0; - break; - case DRI_CONF_VBLANK_DEF_INTERVAL_1: - case DRI_CONF_VBLANK_ALWAYS_SYNC: - default: - pdraw->swap_interval = 1; - break; - } - DRI2CreateDrawable(psc->base.dpy, xDrawable); pdp = (struct dri2_display *)dpyPriv->dri2Display; /* Create a new drawable */ @@ -832,25 +810,10 @@ dri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval) { xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); struct dri2_drawable *priv = (struct dri2_drawable *) pdraw; - GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; struct dri2_screen *psc = (struct dri2_screen *) priv->base.psc; - if (psc->config) - psc->config->configQueryi(psc->driScreen, - "vblank_mode", &vblank_mode); - - switch (vblank_mode) { - case DRI_CONF_VBLANK_NEVER: - if (interval != 0) - return GLX_BAD_VALUE; - break; - case DRI_CONF_VBLANK_ALWAYS_SYNC: - if (interval <= 0) - return GLX_BAD_VALUE; - break; - default: - break; - } + if (!dri_valid_swap_interval(psc->driScreen, psc->config, interval)) + return GLX_BAD_VALUE; xcb_dri2_swap_interval(c, priv->base.xDrawable, interval); priv->swap_interval = interval; diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index b2ac456b8e4..ecfcdee1816 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -76,6 +76,7 @@ #include "dri_common.h" #include "dri3_priv.h" #include "loader.h" +#include "loader_dri_helper.h" #include "dri2.h" static struct dri3_drawable * @@ -646,25 +647,10 @@ dri3_set_swap_interval(__GLXDRIdrawable *pdraw, int interval) assert(pdraw != NULL); struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; - GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; - if (psc->config) - psc->config->configQueryi(psc->driScreen, - "vblank_mode", &vblank_mode); - - switch (vblank_mode) { - case DRI_CONF_VBLANK_NEVER: - if (interval != 0) - return GLX_BAD_VALUE; - break; - case DRI_CONF_VBLANK_ALWAYS_SYNC: - if (interval <= 0) - return GLX_BAD_VALUE; - break; - default: - break; - } + if (!dri_valid_swap_interval(psc->driScreen, psc->config, interval)) + return GLX_BAD_VALUE; loader_dri3_set_swap_interval(&priv->loader_drawable, interval); diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h index 192238fde14..61cde69a0a9 100644 --- a/src/glx/dri3_priv.h +++ b/src/glx/dri3_priv.h @@ -61,12 +61,6 @@ #include "loader_dri3_helper.h" -/* From driconf.h, user exposed so should be stable */ -#define DRI_CONF_VBLANK_NEVER 0 -#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 -#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 -#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 - struct dri3_display { __GLXDRIdisplay base; diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 364695d0667..ae4fb374604 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -39,12 +39,6 @@ #include "util/macros.h" #include "drm-uapi/drm_fourcc.h" -/* From driconf.h, user exposed so should be stable */ -#define DRI_CONF_VBLANK_NEVER 0 -#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 -#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 -#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 - /** * A cached blit context. */ @@ -397,8 +391,6 @@ loader_dri3_drawable_init(xcb_connection_t *conn, xcb_get_geometry_cookie_t cookie; xcb_get_geometry_reply_t *reply; xcb_generic_error_t *error; - GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; - int swap_interval; draw->conn = conn; draw->ext = ext; @@ -425,9 +417,6 @@ loader_dri3_drawable_init(xcb_connection_t *conn, if (draw->ext->config) { unsigned char adaptive_sync = 0; - draw->ext->config->configQueryi(draw->dri_screen, - "vblank_mode", &vblank_mode); - draw->ext->config->configQueryb(draw->dri_screen, "adaptive_sync", &adaptive_sync); @@ -438,18 +427,8 @@ loader_dri3_drawable_init(xcb_connection_t *conn, if (!draw->adaptive_sync) set_adaptive_sync_property(conn, draw->drawable, false); - switch (vblank_mode) { - case DRI_CONF_VBLANK_NEVER: - case DRI_CONF_VBLANK_DEF_INTERVAL_0: - swap_interval = 0; - break; - case DRI_CONF_VBLANK_DEF_INTERVAL_1: - case DRI_CONF_VBLANK_ALWAYS_SYNC: - default: - swap_interval = 1; - break; - } - draw->swap_interval = swap_interval; + draw->swap_interval = dri_get_initial_swap_interval(draw->dri_screen, + draw->ext->config); dri3_update_max_num_back(draw); @@ -487,7 +466,7 @@ loader_dri3_drawable_init(xcb_connection_t *conn, * Make sure server has the same swap interval we do for the new * drawable. */ - loader_dri3_set_swap_interval(draw, swap_interval); + loader_dri3_set_swap_interval(draw, draw->swap_interval); return 0; } diff --git a/src/loader/loader_dri_helper.c b/src/loader/loader_dri_helper.c index ff6ce35953f..71cd351e06c 100644 --- a/src/loader/loader_dri_helper.c +++ b/src/loader/loader_dri_helper.c @@ -72,3 +72,56 @@ __DRIimage *loader_dri_create_image(__DRIscreen *screen, return image->createImage(screen, width, height, dri_format, dri_usage, loaderPrivate); } + +/* From driconf.h, user exposed so should be stable */ +#define DRI_CONF_VBLANK_NEVER 0 +#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 +#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 +#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 + +static int dri_vblank_mode(__DRIscreen *driScreen, const __DRI2configQueryExtension *config) +{ + GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; + + if (config) + config->configQueryi(driScreen, "vblank_mode", &vblank_mode); + + return vblank_mode; +} + +int dri_get_initial_swap_interval(__DRIscreen *driScreen, + const __DRI2configQueryExtension *config) +{ + int vblank_mode = dri_vblank_mode(driScreen, config); + + switch (vblank_mode) { + case DRI_CONF_VBLANK_NEVER: + case DRI_CONF_VBLANK_DEF_INTERVAL_0: + return 0; + case DRI_CONF_VBLANK_DEF_INTERVAL_1: + case DRI_CONF_VBLANK_ALWAYS_SYNC: + default: + return 1; + } +} + +bool dri_valid_swap_interval(__DRIscreen *driScreen, + const __DRI2configQueryExtension *config, int interval) +{ + int vblank_mode = dri_vblank_mode(driScreen, config); + + switch (vblank_mode) { + case DRI_CONF_VBLANK_NEVER: + if (interval != 0) + return false; + break; + case DRI_CONF_VBLANK_ALWAYS_SYNC: + if (interval <= 0) + return false; + break; + default: + break; + } + + return true; +} diff --git a/src/loader/loader_dri_helper.h b/src/loader/loader_dri_helper.h index e0aae69477b..906ca9ab046 100644 --- a/src/loader/loader_dri_helper.h +++ b/src/loader/loader_dri_helper.h @@ -31,3 +31,9 @@ __DRIimage *loader_dri_create_image(__DRIscreen *screen, const uint64_t *modifiers, unsigned int modifiers_count, void *loaderPrivate); + +int dri_get_initial_swap_interval(__DRIscreen *driScreen, + const __DRI2configQueryExtension *config); + +bool dri_valid_swap_interval(__DRIscreen *driScreen, + const __DRI2configQueryExtension *config, int interval);