Re: [Mesa-dev] [PATCH 2/3] gbm: Add support for __DRIimage based getBuffers when available
On Mon, Nov 11, 2013 at 1:22 PM, Kristian Høgsberg k...@bitplanet.net wrote: This lets us allocate color buffers as __DRIimages and pass them into the driver instead of having to create a __DRIbuffer with the flink that requires. It seems worth mentioning in the commit message that this allows gbm to work with render nodes. Series Reviewed-by: Jordan Justen jordan.l.jus...@intel.com I tested waffle's gl_basic using render nodes on gbm with this series, so to that extent 1 2 are Tested-by: Jordan Justen jordan.l.jus...@intel.com Signed-off-by: Kristian Høgsberg k...@bitplanet.net Cc: 10.0 mesa-sta...@lists.freedesktop.org --- src/egl/drivers/dri2/platform_drm.c | 46 ++--- src/gbm/backends/dri/gbm_dri.c | 28 +- src/gbm/backends/dri/gbm_driint.h | 8 ++- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 7b1e3a1..181b29d 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -175,13 +175,12 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) } static int -get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) +get_back_bo(struct dri2_egl_surface *dri2_surf) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf-base.Resource.Display); - struct gbm_dri_bo *bo; struct gbm_dri_surface *surf = dri2_surf-gbm_surf; - int i, name, pitch; + int i; if (dri2_surf-back == NULL) { for (i = 0; i ARRAY_SIZE(dri2_surf-color_buffers); i++) { @@ -201,6 +200,17 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) if (dri2_surf-back-bo == NULL) return -1; + return 0; +} + +static void +back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) +{ + struct dri2_egl_display *dri2_dpy = + dri2_egl_display(dri2_surf-base.Resource.Display); + struct gbm_dri_bo *bo; + int name, pitch; + bo = (struct gbm_dri_bo *) dri2_surf-back-bo; dri2_dpy-image-queryImage(bo-image, __DRI_IMAGE_ATTRIB_NAME, name); @@ -211,8 +221,6 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) buffer-pitch = pitch; buffer-cpp = 4; buffer-flags = 0; - - return 0; } static int @@ -254,10 +262,11 @@ dri2_get_buffers_with_format(__DRIdrawable *driDrawable, switch (attachments[i]) { case __DRI_BUFFER_BACK_LEFT: -if (get_back_bo(dri2_surf, dri2_surf-buffers[j]) 0) { +if (get_back_bo(dri2_surf) 0) { _eglError(EGL_BAD_ALLOC, failed to allocate color buffer); return NULL; } + back_bo_to_dri_buffer(dri2_surf, dri2_surf-buffers[j]); break; default: if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1], @@ -312,6 +321,27 @@ dri2_get_buffers(__DRIdrawable * driDrawable, return buffer; } +static int +dri_image_get_buffers(__DRIdrawable *driDrawable, + unsigned int format, + uint32_t *stamp, + void *loaderPrivate, + uint32_t buffer_mask, + struct __DRIimageList *buffers) +{ + struct dri2_egl_surface *dri2_surf = loaderPrivate; + struct gbm_dri_bo *bo; + + if (get_back_bo(dri2_surf) 0) + return 0; + + bo = (struct gbm_dri_bo *) dri2_surf-back-bo; + buffers-image_mask = __DRI_IMAGE_BUFFER_BACK; + buffers-back = bo-image; + + return 1; +} + static void dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) { @@ -348,9 +378,8 @@ dri2_query_buffer_age(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface) { struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface); - __DRIbuffer buffer; - if (get_back_bo(dri2_surf, buffer) 0) { + if (get_back_bo(dri2_surf) 0) { _eglError(EGL_BAD_ALLOC, dri2_query_buffer_age); return 0; } @@ -469,6 +498,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy-gbm_dri-get_buffers = dri2_get_buffers; dri2_dpy-gbm_dri-flush_front_buffer = dri2_flush_front_buffer; dri2_dpy-gbm_dri-get_buffers_with_format = dri2_get_buffers_with_format; + dri2_dpy-gbm_dri-image_get_buffers = dri_image_get_buffers; dri2_dpy-gbm_dri-base.base.surface_lock_front_buffer = lock_front_buffer; dri2_dpy-gbm_dri-base.base.surface_release_buffer = release_buffer; diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index e95fcc7..6c63c75 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -104,6 +104,24 @@ dri_get_buffers_with_format(__DRIdrawable * driDrawable, count, out_count, surf-dri_private); } +static int
[Mesa-dev] [PATCH 2/3] gbm: Add support for __DRIimage based getBuffers when available
This lets us allocate color buffers as __DRIimages and pass them into the driver instead of having to create a __DRIbuffer with the flink that requires. Signed-off-by: Kristian Høgsberg k...@bitplanet.net Cc: 10.0 mesa-sta...@lists.freedesktop.org --- src/egl/drivers/dri2/platform_drm.c | 46 ++--- src/gbm/backends/dri/gbm_dri.c | 28 +- src/gbm/backends/dri/gbm_driint.h | 8 ++- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 7b1e3a1..181b29d 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -175,13 +175,12 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) } static int -get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) +get_back_bo(struct dri2_egl_surface *dri2_surf) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dri2_surf-base.Resource.Display); - struct gbm_dri_bo *bo; struct gbm_dri_surface *surf = dri2_surf-gbm_surf; - int i, name, pitch; + int i; if (dri2_surf-back == NULL) { for (i = 0; i ARRAY_SIZE(dri2_surf-color_buffers); i++) { @@ -201,6 +200,17 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) if (dri2_surf-back-bo == NULL) return -1; + return 0; +} + +static void +back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) +{ + struct dri2_egl_display *dri2_dpy = + dri2_egl_display(dri2_surf-base.Resource.Display); + struct gbm_dri_bo *bo; + int name, pitch; + bo = (struct gbm_dri_bo *) dri2_surf-back-bo; dri2_dpy-image-queryImage(bo-image, __DRI_IMAGE_ATTRIB_NAME, name); @@ -211,8 +221,6 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer) buffer-pitch = pitch; buffer-cpp = 4; buffer-flags = 0; - - return 0; } static int @@ -254,10 +262,11 @@ dri2_get_buffers_with_format(__DRIdrawable *driDrawable, switch (attachments[i]) { case __DRI_BUFFER_BACK_LEFT: -if (get_back_bo(dri2_surf, dri2_surf-buffers[j]) 0) { +if (get_back_bo(dri2_surf) 0) { _eglError(EGL_BAD_ALLOC, failed to allocate color buffer); return NULL; } + back_bo_to_dri_buffer(dri2_surf, dri2_surf-buffers[j]); break; default: if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1], @@ -312,6 +321,27 @@ dri2_get_buffers(__DRIdrawable * driDrawable, return buffer; } +static int +dri_image_get_buffers(__DRIdrawable *driDrawable, + unsigned int format, + uint32_t *stamp, + void *loaderPrivate, + uint32_t buffer_mask, + struct __DRIimageList *buffers) +{ + struct dri2_egl_surface *dri2_surf = loaderPrivate; + struct gbm_dri_bo *bo; + + if (get_back_bo(dri2_surf) 0) + return 0; + + bo = (struct gbm_dri_bo *) dri2_surf-back-bo; + buffers-image_mask = __DRI_IMAGE_BUFFER_BACK; + buffers-back = bo-image; + + return 1; +} + static void dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) { @@ -348,9 +378,8 @@ dri2_query_buffer_age(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface) { struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface); - __DRIbuffer buffer; - if (get_back_bo(dri2_surf, buffer) 0) { + if (get_back_bo(dri2_surf) 0) { _eglError(EGL_BAD_ALLOC, dri2_query_buffer_age); return 0; } @@ -469,6 +498,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy-gbm_dri-get_buffers = dri2_get_buffers; dri2_dpy-gbm_dri-flush_front_buffer = dri2_flush_front_buffer; dri2_dpy-gbm_dri-get_buffers_with_format = dri2_get_buffers_with_format; + dri2_dpy-gbm_dri-image_get_buffers = dri_image_get_buffers; dri2_dpy-gbm_dri-base.base.surface_lock_front_buffer = lock_front_buffer; dri2_dpy-gbm_dri-base.base.surface_release_buffer = release_buffer; diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index e95fcc7..6c63c75 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -104,6 +104,24 @@ dri_get_buffers_with_format(__DRIdrawable * driDrawable, count, out_count, surf-dri_private); } +static int +image_get_buffers(__DRIdrawable *driDrawable, + unsigned int format, + uint32_t *stamp, + void *loaderPrivate, + uint32_t buffer_mask, + struct __DRIimageList *buffers) +{ + struct gbm_dri_surface *surf = loaderPrivate; + struct gbm_dri_device *dri = gbm_dri_device(surf-base.gbm); + + if (dri-image_get_buffers == NULL) + return 0; + + return dri-image_get_buffers(driDrawable, format, stamp, +