mesa android path didn't support pbuffer, so add pbuffer support to fix most deqp and cts pbuffer test cases fail; add support of front buffer and single buffer config.
Test status: android CTS EGL pbuffer test can run without native crash. test:[DEQP,EGL]all deqp pbuffer case passed. Signed-off-by: Liu Zhiquan <zhiquan....@intel.com> --- src/egl/drivers/dri2/egl_dri2.h | 3 +- src/egl/drivers/dri2/platform_android.c | 169 +++++++++++++++++++++++--------- 2 files changed, 124 insertions(+), 48 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 3add32e..f3d09dc 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -290,7 +290,8 @@ struct dri2_egl_surface #ifdef HAVE_ANDROID_PLATFORM struct ANativeWindow *window; struct ANativeWindowBuffer *buffer; - __DRIimage *dri_image; + __DRIimage *dri_image_back; + __DRIimage *dri_image_front; /* EGL-owned buffers */ __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT]; diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index ec52a02..79fe81a 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -204,9 +204,9 @@ droid_window_enqueue_buffer(_EGLDisplay *disp, struct dri2_egl_surface *dri2_sur mtx_lock(&disp->Mutex); - if (dri2_surf->dri_image) { - dri2_dpy->image->destroyImage(dri2_surf->dri_image); - dri2_surf->dri_image = NULL; + if (dri2_surf->dri_image_back) { + dri2_dpy->image->destroyImage(dri2_surf->dri_image_back); + dri2_surf->dri_image_back = NULL; } return EGL_TRUE; @@ -295,7 +295,7 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, window->query(window, NATIVE_WINDOW_HEIGHT, &dri2_surf->base.Height); } - config = dri2_get_dri_config(dri2_conf, EGL_WINDOW_BIT, + config = dri2_get_dri_config(dri2_conf, type, dri2_surf->base.GLColorspace); if (!config) goto cleanup_surface; @@ -353,6 +353,18 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) dri2_surf->window->common.decRef(&dri2_surf->window->common); } + if (dri2_surf->dri_image_back) { + _eglLog(_EGL_DEBUG, "%s : %d : destroy dri_image_back", __func__, __LINE__); + dri2_dpy->image->destroyImage(dri2_surf->dri_image_back); + dri2_surf->dri_image_back = NULL; + } + + if (dri2_surf->dri_image_front) { + _eglLog(_EGL_DEBUG, "%s : %d : destroy dri_image_front", __func__, __LINE__); + dri2_dpy->image->destroyImage(dri2_surf->dri_image_front); + dri2_surf->dri_image_front = NULL; + } + (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); free(dri2_surf); @@ -384,49 +396,114 @@ update_buffers(struct dri2_egl_surface *dri2_surf) } static int -get_back_bo(struct dri2_egl_surface *dri2_surf) +droid_get_front_bo(struct dri2_egl_surface *dri2_surf, unsigned int format) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf->base.Resource.Display); - int fourcc, pitch; - int offset = 0, fd; - if (dri2_surf->dri_image) - return 0; + if (dri2_surf->dri_image_front) { + _eglLog(_EGL_WARNING, "%s:%d dri2_image_front allocated !\n", __func__, __LINE__); + return 0; + } - if (!dri2_surf->buffer) + if (dri2_surf->base.Type == EGL_WINDOW_BIT) { + /* According current EGL spec, + * front buffer rendering for window surface is not supported now */ + _eglLog(_EGL_WARNING, "%s:%d front buffer rendering for window surface is not supported!\n", + __func__, __LINE__); + return -1; + + } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) { + dri2_surf->dri_image_front = + dri2_dpy->image->createImage(dri2_dpy->dri_screen, + dri2_surf->base.Width, + dri2_surf->base.Height, + format, + 0, + dri2_surf); + + + } else { + _eglLog(_EGL_WARNING, "%s:%d pixmap is not supported now !\n", __func__, __LINE__); return -1; + } - fd = get_native_buffer_fd(dri2_surf->buffer); - if (fd < 0) { - _eglLog(_EGL_WARNING, "Could not get native buffer FD"); + if (!dri2_surf->dri_image_front) { + _eglLog(_EGL_WARNING, "%s:%d dri2_image_front allocation failed !\n", __func__, __LINE__); return -1; } - fourcc = get_fourcc(dri2_surf->buffer->format); + return 0; +} - pitch = dri2_surf->buffer->stride * - get_format_bpp(dri2_surf->buffer->format); +static int +droid_get_back_bo(struct dri2_egl_surface *dri2_surf, unsigned int format) +{ + struct dri2_egl_display *dri2_dpy = + dri2_egl_display(dri2_surf->base.Resource.Display); + int fourcc, pitch; + int offset = 0, fd; - if (fourcc == -1 || pitch == 0) { - _eglLog(_EGL_WARNING, "Invalid buffer fourcc(%x) or pitch(%d)", - fourcc, pitch); - return -1; + if (dri2_surf->dri_image_back) { + _eglLog(_EGL_WARNING, "%s:%d dri_image_back allocated !\n", __func__, __LINE__); + return 0; } - dri2_surf->dri_image = - dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen, - dri2_surf->base.Width, - dri2_surf->base.Height, - fourcc, - &fd, - 1, - &pitch, - &offset, - dri2_surf); - if (!dri2_surf->dri_image) + if (dri2_surf->base.Type == EGL_WINDOW_BIT) { + + if (!dri2_surf->buffer) { + _eglLog(_EGL_WARNING, "Could not get native buffer"); + return -1; + } + + fd = get_native_buffer_fd(dri2_surf->buffer); + if (fd < 0) { + _eglLog(_EGL_WARNING, "Could not get native buffer FD"); + return -1; + } + + fourcc = get_fourcc(dri2_surf->buffer->format); + + pitch = dri2_surf->buffer->stride * + get_format_bpp(dri2_surf->buffer->format); + + if (fourcc == -1 || pitch == 0) { + _eglLog(_EGL_WARNING, "Invalid buffer fourcc(%x) or pitch(%d)", + fourcc, pitch); + return -1; + } + + dri2_surf->dri_image_back = + dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen, + dri2_surf->base.Width, + dri2_surf->base.Height, + fourcc, + &fd, + 1, + &pitch, + &offset, + dri2_surf); + } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) { + /* Current implementation pass FRONT mask for pbuffer, as it is single buffer config. + * But according to EGL spec, pbuffer is back buffer, add below code for logic + * completeness. + */ + dri2_surf->dri_image_back = + dri2_dpy->image->createImage(dri2_dpy->dri_screen, + dri2_surf->base.Width, + dri2_surf->base.Height, + format, + 0, + dri2_surf); + } else { + _eglLog(_EGL_WARNING, "%s:%d pixmap is not supported now !\n", __func__, __LINE__); return -1; + } + if (!dri2_surf->dri_image_back) { + _eglLog(_EGL_WARNING, "%s:%d dri2_image allocation failed !\n", __func__, __LINE__); + return -1; + } return 0; } @@ -441,23 +518,29 @@ droid_image_get_buffers(__DRIdrawable *driDrawable, struct dri2_egl_surface *dri2_surf = loaderPrivate; images->image_mask = 0; + images->front = NULL; + images->back = NULL; - if (update_buffers(dri2_surf) < 0) + if (update_buffers(dri2_surf) < 0) return 0; if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) { - /* - * We don't support front buffers and GLES doesn't require them for - * window surfaces, but some DRI drivers will request them anyway. - * We just ignore such request as other platforms backends do. - */ + if (droid_get_front_bo(dri2_surf, format) < 0) { + _eglError(EGL_BAD_PARAMETER, "droid_get_front_bo"); + return 0; + } + + images->front = dri2_surf->dri_image_front; + images->image_mask |= __DRI_IMAGE_BUFFER_FRONT; } if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) { - if (get_back_bo(dri2_surf) < 0) + if (droid_get_back_bo(dri2_surf, format) < 0) { + _eglError(EGL_BAD_PARAMETER, "droid_get_back_bo"); return 0; + } - images->back = dri2_surf->dri_image; + images->back = dri2_surf->dri_image_back; images->image_mask |= __DRI_IMAGE_BUFFER_BACK; } @@ -775,14 +858,6 @@ droid_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *dpy) for (i = 0; dri2_dpy->driver_configs[i]; i++) { const EGLint surface_type = EGL_WINDOW_BIT | EGL_PBUFFER_BIT; struct dri2_egl_config *dri2_conf; - unsigned int double_buffered = 0; - - dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i], - __DRI_ATTRIB_DOUBLE_BUFFER, &double_buffered); - - /* support only double buffered configs */ - if (!double_buffered) - continue; for (j = 0; j < ARRAY_SIZE(visuals); j++) { config_attrs[1] = visuals[j].format; -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev