[Mesa-dev] [PATCH 5/8] wayland-drm: Pass struct wl_drm_buffer to the driver

Kristian Høgsberg krh at bitplanet.net
Thu Jul 5 14:50:05 PDT 2012


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 ++++++++---
 .../egl/common/native_wayland_drm_bufmgr_helper.c  |   23 +++++++-------
 .../egl/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 e2dee79..bb30e69 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 5f831b3..af176b7 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 bec50a5..f3df7ee 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 80b3f22..6d72ce1 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 6085875..e7a2171 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,
-- 
1.7.10.2



More information about the mesa-dev mailing list