glx: Unify dri2/dri3 vblank_mode logic.

We need it from kopper, as well.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17470>
This commit is contained in:
Emma Anholt
2022-07-11 12:01:27 -07:00
committed by Marge Bot
parent f9ecf99ca9
commit ff18be0872
6 changed files with 69 additions and 88 deletions
+3 -24
View File
@@ -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;
}
+53
View File
@@ -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;
}
+6
View File
@@ -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);