egl/android: fix buffer_count for applications setting max count

Problem with previous solution was that it did not take account that
some applications may set a max count for buffers. Therefore we need to
query both min and max and clamp our setting based on that.

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2373
Fixes: be08e6a449 ("egl/android: Restrict minimum triple buffering for android color_buffers")
Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3480>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3480>
This commit is contained in:
Tapani Pälli 2020-01-21 13:01:51 +02:00 committed by Marge Bot
parent 1c9ecb2123
commit 39e7492d33
1 changed files with 22 additions and 6 deletions

View File

@ -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;