From 379eb47ea61c87c9ac071fa6d93e49ae3f02ac2c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 5 Jul 2012 14:19:48 -0400 Subject: [PATCH] wayland-drm: Pass struct wl_drm_buffer to the driver We're going to extend this to support multi-plane buffers, so pass this to the driver so it can access the details. --- src/egl/drivers/dri2/egl_dri2.c | 33 +++++++++---------- src/egl/wayland/wayland-drm/wayland-drm.c | 19 +++-------- src/egl/wayland/wayland-drm/wayland-drm.h | 18 +++++++--- .../common/native_wayland_drm_bufmgr_helper.c | 23 ++++++------- .../common/native_wayland_drm_bufmgr_helper.h | 8 ++--- 5 files changed, 49 insertions(+), 52 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index e2dee798d60..bb30e699fe4 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1220,43 +1220,40 @@ dri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img, #ifdef HAVE_WAYLAND_PLATFORM -static void * +static void dri2_wl_reference_buffer(void *user_data, uint32_t name, - int32_t width, int32_t height, - uint32_t stride, uint32_t format) + struct wl_drm_buffer *buffer) { _EGLDisplay *disp = user_data; struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); - __DRIimage *image; - int dri_format; - switch (format) { + switch (buffer->format) { case WL_DRM_FORMAT_ARGB8888: - dri_format =__DRI_IMAGE_FORMAT_ARGB8888; + buffer->driver_format =__DRI_IMAGE_FORMAT_ARGB8888; break; case WL_DRM_FORMAT_XRGB8888: - dri_format = __DRI_IMAGE_FORMAT_XRGB8888; + buffer->driver_format = __DRI_IMAGE_FORMAT_XRGB8888; break; default: - return NULL; + return; } - image = dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen, - width, height, - dri_format, name, stride / 4, - NULL); - - return image; + buffer->driver_buffer = + dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen, + buffer->buffer.width, + buffer->buffer.height, + buffer->driver_format, name, + buffer->stride0 / 4, + NULL); } static void -dri2_wl_release_buffer(void *user_data, void *buffer) +dri2_wl_release_buffer(void *user_data, struct wl_drm_buffer *buffer) { _EGLDisplay *disp = user_data; - __DRIimage *image = buffer; struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); - dri2_dpy->image->destroyImage(image); + dri2_dpy->image->destroyImage(buffer->driver_buffer); } static struct wayland_drm_callbacks wl_drm_callbacks = { diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c index 5f831b3487f..af176b72d12 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.c +++ b/src/egl/wayland/wayland-drm/wayland-drm.c @@ -56,22 +56,13 @@ struct wl_drm { struct wayland_drm_callbacks *callbacks; }; -struct wl_drm_buffer { - struct wl_buffer buffer; - struct wl_drm *drm; - uint32_t format; - - void *driver_buffer; -}; - static void destroy_buffer(struct wl_resource *resource) { struct wl_drm_buffer *buffer = resource->data; struct wl_drm *drm = buffer->drm; - drm->callbacks->release_buffer(drm->user_data, - buffer->driver_buffer); + drm->callbacks->release_buffer(drm->user_data, buffer); free(buffer); } @@ -129,12 +120,10 @@ drm_create_buffer(struct wl_client *client, struct wl_resource *resource, buffer->buffer.width = width; buffer->buffer.height = height; buffer->format = format; + buffer->offset0 = 0; + buffer->stride0 = stride; - buffer->driver_buffer = - drm->callbacks->reference_buffer(drm->user_data, name, - width, height, - stride, format); - + drm->callbacks->reference_buffer(drm->user_data, name, buffer); if (buffer->driver_buffer == NULL) { wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_NAME, diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h b/src/egl/wayland/wayland-drm/wayland-drm.h index bec50a5539f..f3df7eeaddd 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.h +++ b/src/egl/wayland/wayland-drm/wayland-drm.h @@ -9,14 +9,24 @@ struct wl_drm; +struct wl_drm_buffer { + struct wl_buffer buffer; + struct wl_drm *drm; + uint32_t format; + uint32_t driver_format; + int32_t offset0; + int32_t stride0; + + void *driver_buffer; +}; + struct wayland_drm_callbacks { int (*authenticate)(void *user_data, uint32_t id); - void *(*reference_buffer)(void *user_data, uint32_t name, - int32_t width, int32_t height, - uint32_t stride, uint32_t format); + void (*reference_buffer)(void *user_data, uint32_t name, + struct wl_drm_buffer *buffer); - void (*release_buffer)(void *user_data, void *buffer); + void (*release_buffer)(void *user_data, struct wl_drm_buffer *buffer); }; struct wl_drm * diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c index 80b3f227d0b..6d72ce14774 100644 --- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c @@ -12,17 +12,16 @@ #include "native_wayland_drm_bufmgr_helper.h" -void * +void egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name, - int32_t width, int32_t height, - uint32_t stride, uint32_t format) + struct wl_drm_buffer *buffer) { struct native_display *ndpy = user_data; struct pipe_resource templ; struct winsys_handle wsh; enum pipe_format pf; - switch (format) { + switch (buffer->format) { case WL_DRM_FORMAT_ARGB8888: pf = PIPE_FORMAT_B8G8R8A8_UNORM; break; @@ -35,28 +34,30 @@ egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name, } if (pf == PIPE_FORMAT_NONE) - return NULL; + return; memset(&templ, 0, sizeof(templ)); templ.target = PIPE_TEXTURE_2D; templ.format = pf; templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; - templ.width0 = width; - templ.height0 = height; + templ.width0 = buffer->buffer.width; + templ.height0 = buffer->buffer.height; templ.depth0 = 1; templ.array_size = 1; memset(&wsh, 0, sizeof(wsh)); wsh.handle = name; - wsh.stride = stride; + wsh.stride = buffer->stride0; - return ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh); + buffer->driver_buffer = + ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh); } void -egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, void *buffer) +egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, + struct wl_drm_buffer *buffer) { - struct pipe_resource *resource = buffer; + struct pipe_resource *resource = buffer->driver_buffer; pipe_resource_reference(&resource, NULL); } diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h index 6085875f098..e7a21717aeb 100644 --- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h @@ -28,13 +28,13 @@ #include "wayland-drm.h" -void * +void egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name, - int32_t width, int32_t height, - uint32_t stride, uint32_t format); + struct wl_drm_buffer *buffer); void -egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, void *buffer); +egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, + struct wl_drm_buffer *buffer); struct pipe_resource * egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy, -- 2.30.2