On Fri, Jul 19, 2019 at 11:03 AM Nataraj Deshpande <nataraj.deshpa...@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 o...@chromium.org) > > Fixes: 2acc69da8ce "EGL/Android: Add EGL_EXT_buffer_age extension" > Signed-off-by: Nataraj Deshpande <nataraj.deshpa...@intel.com> > Acked-by: Eric Engestrom <e...@engestrom.ch> Reviewed-by: Chia-I Wu <olva...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev