return EGL_TRUE;
}
+static EGLBoolean
+droid_swap_interval(_EGLDriver *drv, _EGLDisplay *dpy,
+ _EGLSurface *surf, EGLint interval)
+{
+ struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
+ struct ANativeWindow *window = dri2_surf->window;
+
+ if (window->setSwapInterval(window, interval))
+ return EGL_FALSE;
+
+ surf->SwapInterval = interval;
+ return EGL_TRUE;
+}
+
static int
update_buffers(struct dri2_egl_surface *dri2_surf)
{
.swap_buffers = droid_swap_buffers,
.swap_buffers_with_damage = dri2_fallback_swap_buffers_with_damage, /* Android implements the function */
.swap_buffers_region = dri2_fallback_swap_buffers_region,
+ .swap_interval = droid_swap_interval,
#if ANDROID_API_LEVEL >= 23
.set_damage_region = droid_set_damage_region,
#else
};
EGLBoolean
-dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy)
+dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp)
{
struct dri2_egl_display *dri2_dpy;
const char *err;
int ret;
+ /* Not supported yet */
+ if (disp->Options.ForceSoftware)
+ return EGL_FALSE;
+
loader_set_logger(_eglLog);
dri2_dpy = calloc(1, sizeof(*dri2_dpy));
goto cleanup;
}
- dpy->DriverData = (void *) dri2_dpy;
+ disp->DriverData = (void *) dri2_dpy;
dri2_dpy->fd = droid_open_device(dri2_dpy);
if (dri2_dpy->fd < 0) {
* the __DRI_DRI2_LOADER extension */
if (!dri2_dpy->is_render_node) {
dri2_dpy->loader_extensions = droid_dri2_loader_extensions;
- if (!dri2_load_driver(dpy)) {
+ if (!dri2_load_driver(disp)) {
err = "DRI2: failed to load driver";
goto cleanup;
}
} else {
dri2_dpy->loader_extensions = droid_image_loader_extensions;
- if (!dri2_load_driver_dri3(dpy)) {
+ if (!dri2_load_driver_dri3(disp)) {
err = "DRI3: failed to load driver";
goto cleanup;
}
}
- if (!dri2_create_screen(dpy)) {
+ if (!dri2_create_screen(disp)) {
err = "DRI2: failed to create screen";
goto cleanup;
}
- if (!dri2_setup_extensions(dpy)) {
+ if (!dri2_setup_extensions(disp)) {
err = "DRI2: failed to setup extensions";
goto cleanup;
}
- dri2_setup_screen(dpy);
+ dri2_setup_screen(disp);
+
+ /* We set the maximum swap interval as 1 for Android platform, since it is
+ * the maximum value supported by Android according to the value of
+ * ANativeWindow::maxSwapInterval.
+ */
+ dri2_setup_swap_interval(disp, 1);
- if (!droid_add_configs_for_visuals(drv, dpy)) {
+ if (!droid_add_configs_for_visuals(drv, disp)) {
err = "DRI2: failed to add configs";
goto cleanup;
}
- dpy->Extensions.ANDROID_framebuffer_target = EGL_TRUE;
- dpy->Extensions.ANDROID_image_native_buffer = EGL_TRUE;
- dpy->Extensions.ANDROID_recordable = EGL_TRUE;
- dpy->Extensions.EXT_buffer_age = EGL_TRUE;
+ disp->Extensions.ANDROID_framebuffer_target = EGL_TRUE;
+ disp->Extensions.ANDROID_image_native_buffer = EGL_TRUE;
+ disp->Extensions.ANDROID_recordable = EGL_TRUE;
+ disp->Extensions.EXT_buffer_age = EGL_TRUE;
#if ANDROID_API_LEVEL >= 23
- dpy->Extensions.KHR_partial_update = EGL_TRUE;
+ disp->Extensions.KHR_partial_update = EGL_TRUE;
#endif
- dpy->Extensions.KHR_image = EGL_TRUE;
+ disp->Extensions.KHR_image = EGL_TRUE;
/* Fill vtbl last to prevent accidentally calling virtual function during
* initialization.
return EGL_TRUE;
cleanup:
- dri2_display_destroy(dpy);
+ dri2_display_destroy(disp);
return _eglError(EGL_NOT_INITIALIZED, err);
}