X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fdrivers%2Fdri2%2Fplatform_android.c;h=7f1a496ea24180c9dedeec877e4833951fc1f027;hb=478fc2d2a1a392108f48a3ed9aa21b10be72b4a2;hp=7cf03b3467f285e3611747d2391426a140c8c308;hpb=96fc5fbf232b6bc7f3db0b5037df9f120704980f;p=mesa.git diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 7cf03b3467f..7f1a496ea24 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -417,6 +417,20 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) 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) { @@ -1127,6 +1141,7 @@ static const struct dri2_egl_display_vtbl droid_display_vtbl = { .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 @@ -1173,12 +1188,16 @@ static const __DRIextension *droid_image_loader_extensions[] = { }; 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)); @@ -1193,7 +1212,7 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *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) { @@ -1213,43 +1232,49 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy) * 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. @@ -1259,6 +1284,6 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy) return EGL_TRUE; cleanup: - dri2_display_destroy(dpy); + dri2_display_destroy(disp); return _eglError(EGL_NOT_INITIALIZED, err); }