egl/kopper: Hook up eglSwapInterval

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15800>
This commit is contained in:
Adam Jackson 2022-04-28 17:38:17 -04:00 committed by Marge Bot
parent b6ea787903
commit 6f4b5fb675
2 changed files with 80 additions and 2 deletions

View File

@ -839,6 +839,18 @@ dri2_wl_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
return EGL_TRUE;
}
static EGLBoolean
dri2_wl_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
if (dri2_dpy->kopper)
dri2_dpy->kopper->setSwapInterval(dri2_surf->dri_drawable, interval);
return EGL_TRUE;
}
static void
dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
{
@ -1959,6 +1971,7 @@ static const struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
.create_window_surface = dri2_wl_create_window_surface,
.create_pixmap_surface = dri2_wl_create_pixmap_surface,
.destroy_surface = dri2_wl_destroy_surface,
.swap_interval = dri2_wl_swap_interval,
.create_image = dri2_create_image_khr,
.swap_buffers = dri2_wl_swap_buffers,
.swap_buffers_with_damage = dri2_wl_swap_buffers_with_damage,

View File

@ -994,6 +994,11 @@ dri2_x11_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval)
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
if (dri2_dpy->kopper) {
dri2_dpy->kopper->setSwapInterval(dri2_surf->dri_drawable, interval);
return EGL_TRUE;
}
if (dri2_dpy->swap_available)
xcb_dri2_swap_interval(dri2_dpy->conn, dri2_surf->drawable, interval);
@ -1169,6 +1174,42 @@ dri2_x11_get_sync_values(_EGLDisplay *display, _EGLSurface *surface,
return EGL_TRUE;
}
static EGLBoolean
dri2_kopper_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
/* This can legitimately be null for lavapipe */
if (dri2_dpy->kopper)
dri2_dpy->kopper->setSwapInterval(dri2_surf->dri_drawable, interval);
return EGL_TRUE;
}
static _EGLSurface *
dri2_kopper_create_window_surface(_EGLDisplay *disp, _EGLConfig *conf,
void *native_window,
const EGLint *attrib_list)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
_EGLSurface *surf;
surf = dri2_x11_create_surface(disp, EGL_WINDOW_BIT, conf,
native_window, attrib_list);
if (surf != NULL) {
/* When we first create the DRI2 drawable, its swap interval on the
* server side is 1.
*/
surf->SwapInterval = 1;
/* Override that with a driconf-set value. */
dri2_kopper_swap_interval(disp, surf, dri2_dpy->default_swap_interval);
}
return surf;
}
static const struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = {
.authenticate = NULL,
.create_window_surface = dri2_x11_create_window_surface,
@ -1185,6 +1226,23 @@ static const struct dri2_egl_display_vtbl dri2_x11_swrast_display_vtbl = {
.get_dri_drawable = dri2_surface_get_dri_drawable,
};
static const struct dri2_egl_display_vtbl dri2_x11_kopper_display_vtbl = {
.authenticate = NULL,
.create_window_surface = dri2_kopper_create_window_surface,
.create_pixmap_surface = dri2_x11_create_pixmap_surface,
.create_pbuffer_surface = dri2_x11_create_pbuffer_surface,
.destroy_surface = dri2_x11_destroy_surface,
.create_image = dri2_create_image_khr,
.swap_interval = dri2_kopper_swap_interval,
.swap_buffers = dri2_x11_swap_buffers,
.swap_buffers_region = dri2_x11_swap_buffers_region,
.post_sub_buffer = dri2_x11_post_sub_buffer,
.copy_buffers = dri2_x11_copy_buffers,
/* XXX: should really implement this since X11 has pixmaps */
.query_surface = dri2_query_surface,
.get_dri_drawable = dri2_surface_get_dri_drawable,
};
static const struct dri2_egl_display_vtbl dri2_x11_display_vtbl = {
.authenticate = dri2_x11_authenticate,
.create_window_surface = dri2_x11_create_window_surface,
@ -1316,8 +1374,11 @@ dri2_x11_setup_swap_interval(_EGLDisplay *disp)
return;
/* If we do have swapbuffers, then we can support pretty much any swap
* interval.
* interval. Unless we're kopper, for now.
*/
if (dri2_dpy->kopper)
arbitrary_max_interval = 1;
dri2_setup_swap_interval(disp, arbitrary_max_interval);
}
@ -1365,6 +1426,7 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp)
#ifdef HAVE_WAYLAND_PLATFORM
dri2_dpy->device_name = strdup("zink");
#endif
dri2_dpy->swap_available = EGL_TRUE;
dri2_x11_setup_swap_interval(disp);
if (!dri2_dpy->is_different_gpu)
disp->Extensions.KHR_image_pixmap = EGL_TRUE;
@ -1382,7 +1444,10 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp)
/* Fill vtbl last to prevent accidentally calling virtual function during
* initialization.
*/
dri2_dpy->vtbl = &dri2_x11_swrast_display_vtbl;
if (disp->Options.Zink)
dri2_dpy->vtbl = &dri2_x11_kopper_display_vtbl;
else
dri2_dpy->vtbl = &dri2_x11_swrast_display_vtbl;
return EGL_TRUE;