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.
.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,
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)
{
.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,
};
.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,
};
.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,
};
dri2_setup_screen(disp);
if (disp->Options.Zink) {
+ /* kopper */
#ifdef HAVE_WAYLAND_PLATFORM
dri2_dpy->device_name = strdup("zink");
#endif
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))
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;
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);