egl/x11: implement ANGLE_sync_control_rate

Implement EGL_ANGLE_sync_control_rate for running Chromium Linux on Wayland with EGL backend.

Chromium works with this patch using(with videos playing smoothly):
/usr/bin/google-chrome-stable --use-gl=egl --enable-features=VaapiVideoDecoder --ignore-gpu-blocklist

Closes #2930

Signed-off-by: KJ Liew <liewkj@yahoo.com>
Signed-off-by: Térence Clastres <t.clastres@gmail.com>
Signed-off-by: Satadru Pramanik <satadru@gmail.com>
Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Acked-by: Eric Engestrom <eric@igalia.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17815>
This commit is contained in:
Yonggang Luo 2022-07-30 17:59:33 +08:00 committed by Marge Bot
parent 94cfa50dc6
commit 4752655649
7 changed files with 54 additions and 1 deletions

View File

@ -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')

View File

@ -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,

View File

@ -34,6 +34,7 @@
#ifdef HAVE_X11_PLATFORM
#include <xcb/xcb.h>
#include <xcb/dri2.h>
#include <xcb/randr.h>
#include <xcb/xfixes.h>
#include <X11/Xlib-xcb.h>
@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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,
};

View File

@ -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')