[Mesa-dev] [PATCH v3] egl/android: Update color_buffers querying for buffer age
Chia-I Wu
olvaffe at gmail.com
Sat Jul 20 01:31:57 UTC 2019
On Fri, Jul 19, 2019 at 11:03 AM Nataraj Deshpande
<nataraj.deshpande at intel.com> wrote:
>
> 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 at chromium.org)
>
> Fixes: 2acc69da8ce "EGL/Android: Add EGL_EXT_buffer_age extension"
> Signed-off-by: Nataraj Deshpande <nataraj.deshpande at intel.com>
> Acked-by: Eric Engestrom <eric at engestrom.ch>
Reviewed-by: Chia-I Wu <olvaffe at gmail.com>
> ---
> src/egl/drivers/dri2/egl_dri2.h | 7 ++++---
> src/egl/drivers/dri2/platform_android.c | 30 +++++++++++++++++++++++++++---
> 2 files changed, 31 insertions(+), 6 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
> index fa04e3b..3206d00 100644
> --- a/src/egl/drivers/dri2/egl_dri2.h
> +++ b/src/egl/drivers/dri2/egl_dri2.h
> @@ -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 */
> diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
> index d949ed4..d37f6b8 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -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++;
> }
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list