mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 11:00:11 +01:00
egl/android: Update color_buffers querying for buffer age
color_buffers[] is currently hard coded to 3 for android which fails
in droid_window_dequeue_buffer when ANativeWindow creates color_buffers
>3 while querying buffer age during dEQP partial_update tests on chromeOS.
The patch removes static color_buffers[], queries for MIN_UNDEQUEUED_BUFFERS,
sets native window buffer count and allocates the correct number of
color_buffers as per android.
Fixes dEQP-EGL.functional.partial_update* tests on chromebooks with
enabling EGL_KHR_partial_update.
v2: update comment instead of removing (Eric Engestrom)
v3: change static array to dynamic allocated color_buffers
querying MIN_UNDEQUEUED_BUFFERS (Chia-I Wu olv@chromium.org)
Fixes: 2acc69da8c "EGL/Android: Add EGL_EXT_buffer_age extension"
Signed-off-by: Nataraj Deshpande <nataraj.deshpande@intel.com>
Acked-by: Eric Engestrom <eric@engestrom.ch>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
parent
0345aeeb40
commit
0661c357c6
2 changed files with 31 additions and 6 deletions
|
|
@ -325,13 +325,14 @@ struct dri2_egl_surface
|
|||
__DRIimage *dri_image_front;
|
||||
|
||||
/* Used to record all the buffers created by ANativeWindow and their ages.
|
||||
* Usually Android uses at most triple buffers in ANativeWindow
|
||||
* so hardcode the number of color_buffers to 3.
|
||||
* Allocate number of color_buffers based on query to android bufferqueue
|
||||
* and save color_buffers_count.
|
||||
*/
|
||||
int color_buffers_count;
|
||||
struct {
|
||||
struct ANativeWindowBuffer *buffer;
|
||||
int age;
|
||||
} color_buffers[3], *back;
|
||||
} *color_buffers, *back;
|
||||
#endif
|
||||
|
||||
/* surfaceless and device */
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf)
|
|||
* for updating buffer's age in swap_buffers.
|
||||
*/
|
||||
EGLBoolean updated = EGL_FALSE;
|
||||
for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
|
||||
for (int i = 0; i < dri2_surf->color_buffers_count; i++) {
|
||||
if (!dri2_surf->color_buffers[i].buffer) {
|
||||
dri2_surf->color_buffers[i].buffer = dri2_surf->buffer;
|
||||
}
|
||||
|
|
@ -252,7 +252,7 @@ droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf)
|
|||
/* In case of all the buffers were recreated by ANativeWindow, reset
|
||||
* the color_buffers
|
||||
*/
|
||||
for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
|
||||
for (int i = 0; i < dri2_surf->color_buffers_count; i++) {
|
||||
dri2_surf->color_buffers[i].buffer = NULL;
|
||||
dri2_surf->color_buffers[i].age = 0;
|
||||
}
|
||||
|
|
@ -367,6 +367,7 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
|
||||
if (type == EGL_WINDOW_BIT) {
|
||||
int format;
|
||||
int buffer_count;
|
||||
|
||||
if (window->common.magic != ANDROID_NATIVE_WINDOW_MAGIC) {
|
||||
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
|
||||
|
|
@ -377,6 +378,26 @@ 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.
|
||||
*/
|
||||
if (window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
|
||||
&buffer_count)) {
|
||||
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
|
||||
goto cleanup_surface;
|
||||
}
|
||||
if (native_window_set_buffer_count(window, buffer_count+1)) {
|
||||
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
|
||||
goto cleanup_surface;
|
||||
}
|
||||
dri2_surf->color_buffers = calloc(buffer_count+1,
|
||||
sizeof(*dri2_surf->color_buffers));
|
||||
if (!dri2_surf->color_buffers) {
|
||||
_eglError(EGL_BAD_ALLOC, "droid_create_surface");
|
||||
goto cleanup_surface;
|
||||
}
|
||||
dri2_surf->color_buffers_count = buffer_count+1;
|
||||
|
||||
if (format != dri2_conf->base.NativeVisualID) {
|
||||
_eglLog(_EGL_WARNING, "Native format mismatch: 0x%x != 0x%x",
|
||||
format, dri2_conf->base.NativeVisualID);
|
||||
|
|
@ -404,6 +425,8 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
|
|||
return &dri2_surf->base;
|
||||
|
||||
cleanup_surface:
|
||||
if (dri2_surf->color_buffers_count)
|
||||
free(dri2_surf->color_buffers);
|
||||
free(dri2_surf);
|
||||
|
||||
return NULL;
|
||||
|
|
@ -456,6 +479,7 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
|
|||
dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
|
||||
|
||||
dri2_fini_surface(surf);
|
||||
free(dri2_surf->color_buffers);
|
||||
free(dri2_surf);
|
||||
|
||||
return EGL_TRUE;
|
||||
|
|
@ -698,7 +722,7 @@ droid_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
|
|||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
|
||||
for (int i = 0; i < dri2_surf->color_buffers_count; i++) {
|
||||
if (dri2_surf->color_buffers[i].age > 0)
|
||||
dri2_surf->color_buffers[i].age++;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue