diff --git a/meson.build b/meson.build index 7c1a3a5f0da49..048020e377917 100644 --- a/meson.build +++ b/meson.build @@ -2082,6 +2082,7 @@ if with_platform_x11 dep_x11 = dependency('x11') dep_xext = dependency('xext') dep_xcb = dependency('xcb') + dep_xcb_xrandr = dependency('xcb-randr') elif with_glx == 'dri' dep_x11 = dependency('x11') dep_xext = dependency('xext') diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 79e1cbe25ad57..1b08a46a4fe2f 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -2387,6 +2387,16 @@ dri2_get_sync_values_chromium(_EGLDisplay *disp, _EGLSurface *surf, return dri2_dpy->vtbl->get_sync_values(disp, surf, ust, msc, sbc); } +static EGLBoolean +dri2_get_msc_rate_angle(_EGLDisplay *disp, _EGLSurface *surf, + EGLint *numerator, EGLint *denominator) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + if (!dri2_dpy->vtbl->get_msc_rate) + return EGL_FALSE; + return dri2_dpy->vtbl->get_msc_rate(disp, surf, numerator, denominator); +} + /** * Set the error code after a call to * dri2_egl_image::dri_image::createImageFromTexture. @@ -3741,6 +3751,7 @@ const _EGLDriver _eglDriver = { .QueryWaylandBufferWL = dri2_query_wayland_buffer_wl, #endif .GetSyncValuesCHROMIUM = dri2_get_sync_values_chromium, + .GetMscRateANGLE = dri2_get_msc_rate_angle, .CreateSyncKHR = dri2_create_sync, .ClientWaitSyncKHR = dri2_client_wait_sync, .SignalSyncKHR = dri2_signal_sync, diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 056bc2e099a92..a3d848e0a281a 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -34,6 +34,7 @@ #ifdef HAVE_X11_PLATFORM #include #include +#include #include #include @@ -160,6 +161,10 @@ struct dri2_egl_display_vtbl { EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc); + /* optional */ + EGLBoolean (*get_msc_rate)(_EGLDisplay *display, _EGLSurface *surface, + EGLint *numerator, EGLint *denominator); + /* mandatory */ __DRIdrawable *(*get_dri_drawable)(_EGLSurface *surf); diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 4ef9a2e19bf4d..b6fbd86925e11 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -1191,6 +1191,27 @@ dri2_x11_get_sync_values(_EGLDisplay *display, _EGLSurface *surface, return EGL_TRUE; } +EGLBoolean +dri2_x11_get_msc_rate(_EGLDisplay *display, _EGLSurface *surface, + EGLint *numerator, EGLint *denominator) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(display); + xcb_randr_get_screen_info_cookie_t cookie; + xcb_randr_get_screen_info_reply_t *reply; + + cookie = xcb_randr_get_screen_info_unchecked(dri2_dpy->conn, dri2_dpy->screen->root); + reply = xcb_randr_get_screen_info_reply(dri2_dpy->conn, cookie, NULL); + + if (!reply) + return _eglError(EGL_BAD_ACCESS, "eglGetMscRateANGLE"); + + *numerator = reply->rate; + *denominator = 1; + free(reply); + + return EGL_TRUE; +} + static EGLBoolean dri2_kopper_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval) { @@ -1253,6 +1274,7 @@ static const struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = { .copy_buffers = dri2_x11_copy_buffers, /* XXX: should really implement this since X11 has pixmaps */ .query_surface = dri2_query_surface, + .get_msc_rate = dri2_x11_get_msc_rate, .get_dri_drawable = dri2_surface_get_dri_drawable, }; @@ -1271,6 +1293,7 @@ static const struct dri2_egl_display_vtbl dri2_x11_kopper_display_vtbl = { .query_buffer_age = dri2_kopper_query_buffer_age, /* XXX: should really implement this since X11 has pixmaps */ .query_surface = dri2_query_surface, + .get_msc_rate = dri2_x11_get_msc_rate, .get_dri_drawable = dri2_surface_get_dri_drawable, }; @@ -1288,6 +1311,7 @@ static const struct dri2_egl_display_vtbl dri2_x11_display_vtbl = { .copy_buffers = dri2_x11_copy_buffers, .query_surface = dri2_query_surface, .get_sync_values = dri2_x11_get_sync_values, + .get_msc_rate = dri2_x11_get_msc_rate, .get_dri_drawable = dri2_surface_get_dri_drawable, }; @@ -1454,6 +1478,7 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp) dri2_setup_screen(disp); if (disp->Options.Zink) { + /* kopper */ #ifdef HAVE_WAYLAND_PLATFORM dri2_dpy->device_name = strdup("zink"); #endif @@ -1463,10 +1488,14 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp) disp->Extensions.KHR_image_pixmap = EGL_TRUE; disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE; disp->Extensions.CHROMIUM_sync_control = EGL_TRUE; + disp->Extensions.ANGLE_sync_control_rate = EGL_TRUE; disp->Extensions.EXT_buffer_age = EGL_TRUE; disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE; //dri2_set_WL_bind_wayland_display(disp); + } else { + /* swrast */ + disp->Extensions.ANGLE_sync_control_rate = EGL_TRUE; } if (!dri2_x11_add_configs_for_visuals(dri2_dpy, disp, true)) @@ -1544,6 +1573,7 @@ dri2_initialize_x11_dri3(_EGLDisplay *disp) disp->Extensions.KHR_image_pixmap = EGL_TRUE; disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE; disp->Extensions.CHROMIUM_sync_control = EGL_TRUE; + disp->Extensions.ANGLE_sync_control_rate = EGL_TRUE; disp->Extensions.EXT_buffer_age = EGL_TRUE; disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE; @@ -1656,6 +1686,7 @@ dri2_initialize_x11_dri2(_EGLDisplay *disp) disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE; disp->Extensions.NV_post_sub_buffer = EGL_TRUE; disp->Extensions.CHROMIUM_sync_control = EGL_TRUE; + disp->Extensions.ANGLE_sync_control_rate = EGL_TRUE; dri2_set_WL_bind_wayland_display(disp); diff --git a/src/egl/drivers/dri2/platform_x11.h b/src/egl/drivers/dri2/platform_x11.h index b54781daa38fe..1882922ec7eee 100644 --- a/src/egl/drivers/dri2/platform_x11.h +++ b/src/egl/drivers/dri2/platform_x11.h @@ -12,4 +12,8 @@ uint32_t dri2_format_for_depth(struct dri2_egl_display *dri2_dpy, uint32_t depth); +EGLBoolean +dri2_x11_get_msc_rate(_EGLDisplay *display, _EGLSurface *surface, + EGLint *numerator, EGLint *denominator); + #endif diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c index 3d7c2ae440127..c529f426f5ecf 100644 --- a/src/egl/drivers/dri2/platform_x11_dri3.c +++ b/src/egl/drivers/dri2/platform_x11_dri3.c @@ -527,6 +527,7 @@ struct dri2_egl_display_vtbl dri3_x11_display_vtbl = { .query_buffer_age = dri3_query_buffer_age, .query_surface = dri3_query_surface, .get_sync_values = dri3_get_sync_values, + .get_msc_rate = dri2_x11_get_msc_rate, .get_dri_drawable = dri3_get_dri_drawable, .close_screen_notify = dri3_close_screen_notify, }; diff --git a/src/egl/meson.build b/src/egl/meson.build index be55ac7ab7fc0..6420f85fb7425 100644 --- a/src/egl/meson.build +++ b/src/egl/meson.build @@ -106,7 +106,7 @@ if with_dri2 files_egl += files('drivers/dri2/platform_x11_dri3.c') link_for_egl += libloader_dri3_helper endif - deps_for_egl += [dep_x11_xcb, dep_xcb_dri2, dep_xcb_xfixes] + deps_for_egl += [dep_x11_xcb, dep_xcb_dri2, dep_xcb_xrandr, dep_xcb_xfixes] endif if with_gbm and not with_platform_android files_egl += files('drivers/dri2/platform_drm.c')