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:
parent
1c9ecb2123
commit
39e7492d33
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue