diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-04-27 14:17:37 +0200 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-05-18 18:35:11 +0200 |
commit | 5debe9062c684fd53b531f8fb3ddcc116b47ac36 (patch) | |
tree | 39e92b5ba30f10e160f23463cd529ebac57688b2 | |
parent | 5c2a0bcf61c691d7e694f2f1a6130a6efad05ba8 (diff) |
egl_dri2: add dri2_image_attrs_from_wl_buffer_layout() helper.
Add help function to convert from a wl_buffer_layout to a suitable
DRI image attributes structure. This simplifies future support for
YUV formats as size and cpp could change based on the plane id.
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 74 |
1 files changed, 50 insertions, 24 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 70a257bd2e..637ebbd51f 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1116,6 +1116,54 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx, } #ifdef HAVE_WAYLAND_PLATFORM +struct wl_buffer_layout_map { + unsigned int num_planes; + struct { + unsigned int format; + unsigned char cpp; + unsigned char w_shift; + unsigned char h_shift; + } planes[3]; +}; + +static const struct wl_buffer_layout_map wl_buffer_layout_map_argb8888 = { + 1, { { __DRI_IMAGE_FORMAT_ARGB8888, 4, 0, 0 }, } }; +static const struct wl_buffer_layout_map wl_buffer_layout_map_xrgb8888 = { + 1, { { __DRI_IMAGE_FORMAT_XRGB8888, 4, 0, 0 }, } }; + +static int +dri2_image_attrs_from_wl_buffer_layout(__DRIimageAttrs *attrs, + const struct wl_buffer_layout *layout, + unsigned int plane_id) +{ + const struct wl_buffer_layout_map *m; + + switch (layout->format) { + case WL_BUFFER_FORMAT_ARGB8888: + m = &wl_buffer_layout_map_argb8888; + break; + case WL_BUFFER_FORMAT_XRGB8888: + m = &wl_buffer_layout_map_xrgb8888; + break; + default: + m = NULL; + break; + } + if (!m) + return 0; + + if (plane_id >= m->num_planes) + return 0; + + attrs->plane_id = plane_id; + attrs->format = m->planes[plane_id].format; + attrs->width = layout->width >> m->planes[plane_id].w_shift; + attrs->height = layout->height >> m->planes[plane_id].h_shift; + attrs->pitch = layout->pitches[plane_id] / m->planes[plane_id].cpp; + attrs->structure = __DRI_IMAGE_STRUCTURE_FRAME; + return 1; +} + static _EGLImage * dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx, EGLClientBuffer _buffer, @@ -1318,31 +1366,9 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name, _EGLDisplay *disp = user_data; struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); __DRIimageAttrs imageAttrs; - int dri_format, cpp, width, height, stride; - - 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_BUFFER_FORMAT_XRGB8888: - dri_format = __DRI_IMAGE_FORMAT_XRGB8888; - cpp = 4; - break; - default: - return NULL; - } - - 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; + if (!dri2_image_attrs_from_wl_buffer_layout(&imageAttrs, layout, plane_id)) + return NULL; return dri2_invoke_create_image_from_name(dri2_dpy, name, layout->offsets[plane_id], &imageAttrs, NULL); |