diff --git a/.pick_status.json b/.pick_status.json index 009b6e8eb95..e1236585d15 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1444,7 +1444,7 @@ "description": "egl/android: fix buffer_count for applications setting max count", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "be08e6a4496aad219df1fd829fca3e4f7b322538" }, diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index d1b50a3fa72..da90c44d601 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -375,7 +375,10 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, if (type == EGL_WINDOW_BIT) { int format; int buffer_count; - const int min_buffers = 3; + int min_buffer_count, max_buffer_count; + + /* Prefer triple buffering for performance reasons. */ + const int preferred_buffer_count = 3; if (window->common.magic != ANDROID_NATIVE_WINDOW_MAGIC) { _eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface"); @@ -386,17 +389,30 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, goto cleanup_surface; } - /* Query ANativeWindow for MIN_UNDEQUEUED_BUFFER, set buffer count - * and allocate color_buffers. + /* Query ANativeWindow for MIN_UNDEQUEUED_BUFFER, minimum amount + * of undequeued buffers. */ if (window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, - &buffer_count)) { + &min_buffer_count)) { _eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface"); goto cleanup_surface; } - if (buffer_count < min_buffers) - buffer_count = min_buffers; + /* Query for maximum buffer count, application can set this + * to limit the total amount of buffers. + */ + if (window->query(window, NATIVE_WINDOW_MAX_BUFFER_COUNT, + &max_buffer_count)) { + _eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface"); + goto cleanup_surface; + } + + /* Clamp preferred between minimum (min undequeued + 1 dequeued) + * and maximum. + */ + buffer_count = CLAMP(preferred_buffer_count, min_buffer_count + 1, + max_buffer_count); + if (native_window_set_buffer_count(window, buffer_count)) { _eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface"); goto cleanup_surface;