diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-04-19 11:20:41 +0200 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-05-18 18:35:11 +0200 |
commit | 5c2a0bcf61c691d7e694f2f1a6130a6efad05ba8 (patch) | |
tree | 9db6faabcb8dcb7289411bfe79f2272492ec8d7a | |
parent | 8a269b38ce51b201dde95eb4b1acef792709c382 (diff) |
wayland-drm: simplify wayland_drm_callbacks::reference_buffer().
Reference a buffer based on its layout and the specified layer.
5 files changed, 28 insertions, 22 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 755fb49c8c..70a257bd2e 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1312,20 +1312,24 @@ dri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img, static void * dri2_wl_reference_buffer(void *user_data, uint32_t name, - int32_t width, int32_t height, - uint32_t stride, uint32_t format) + const struct wl_buffer_layout *layout, + uint32_t plane_id) { _EGLDisplay *disp = user_data; struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); __DRIimageAttrs imageAttrs; - int dri_format, cpp; + int dri_format, cpp, width, height, stride; - switch (format) { - case WL_DRM_FORMAT_ARGB8888: - dri_format =__DRI_IMAGE_FORMAT_ARGB8888; + width = layout->width; + height = layout->height; + stride = layout->pitches[plane_id]; + + switch (layout->format) { + case WL_BUFFER_FORMAT_ARGB8888: + dri_format = __DRI_IMAGE_FORMAT_ARGB8888; cpp = 4; break; - case WL_DRM_FORMAT_XRGB8888: + case WL_BUFFER_FORMAT_XRGB8888: dri_format = __DRI_IMAGE_FORMAT_XRGB8888; cpp = 4; break; @@ -1333,14 +1337,14 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name, return NULL; } - imageAttrs.plane_id = 0; + imageAttrs.plane_id = plane_id; imageAttrs.format = dri_format; imageAttrs.width = width; imageAttrs.height = height; imageAttrs.pitch = stride / cpp; imageAttrs.structure = __DRI_IMAGE_STRUCTURE_FRAME; return dri2_invoke_create_image_from_name(dri2_dpy, - name, 0, + name, layout->offsets[plane_id], &imageAttrs, NULL); } diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c index a7cf531736..b1dc3a2b5c 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.c +++ b/src/egl/wayland/wayland-drm/wayland-drm.c @@ -149,10 +149,7 @@ drm_do_create_buffer(struct wl_client *client, struct wl_resource *resource, buffer->driver_buffer = drm->callbacks->reference_buffer(drm->user_data, name, - layout->width, layout->height, - layout->pitches[0], - layout->format); - + layout, 0); 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 9df38cd80f..671c25849c 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.h +++ b/src/egl/wayland/wayland-drm/wayland-drm.h @@ -13,8 +13,8 @@ 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); + const struct wl_buffer_layout *layout, + uint32_t plane_id); void (*release_buffer)(void *user_data, void *buffer); }; 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 80b3f227d0..74e15bd6c9 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 @@ -14,19 +14,24 @@ 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) + const struct wl_buffer_layout *layout, + uint32_t plane_id) { struct native_display *ndpy = user_data; struct pipe_resource templ; struct winsys_handle wsh; enum pipe_format pf; + uint32_t width, height, stride; - switch (format) { - case WL_DRM_FORMAT_ARGB8888: + width = layout->width; + height = layout->height; + stride = layout->pitches[plane_id]; + + switch (layout->format) { + case WL_BUFFER_FORMAT_ARGB32: pf = PIPE_FORMAT_B8G8R8A8_UNORM; break; - case WL_DRM_FORMAT_XRGB8888: + case WL_BUFFER_FORMAT_XRGB32: pf = PIPE_FORMAT_B8G8R8X8_UNORM; break; default: 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 6085875f09..6ddb762901 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 @@ -30,8 +30,8 @@ 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); + const struct wl_buffer_layout *layout, + uint32_t plane_id); void egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, void *buffer); |