mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-28 16:28:14 +02:00
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> (cherry picked from commit39e7492d33)
This commit is contained in:
parent
4f6044a273
commit
386b9c5e7e
2 changed files with 23 additions and 7 deletions
|
|
@ -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"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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…
Add table
Reference in a new issue