Hi, 2012/7/9 Kristian Høgsberg <k...@bitplanet.net>:
> + switch (buffer->format) { > + case WL_DRM_FORMAT_ARGB8888: > + case WL_DRM_FORMAT_XRGB8888: > + if (plane > 0) { > + _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer"); > + return NULL; > + } > + width = buffer->buffer.width; > + height = buffer->buffer.height; > + format = buffer->driver_format; > + offset = buffer->offset[0]; > + stride = buffer->stride[0]; > + cpp = 4; For all of those, I'd suggest a map table or the use of some format descriptor. e.g. struct dri_image_descriptor { unsigned int num_planes; /* Max number of planes */ struct { unsigned int format; /* __DRI_IMAGE_FORMAT_xxx */ unsigned char cpp; /* Number of components per pixel */ unsigned char w_shift; /* Plane width = Image width >> w_shift */ unsigned char h_shift; /* Plane height = Image height >> h_shift */ } planes[3]; }; static const struct dri_image_descriptor dri_image_argb8888_desc = { 1, { { __DRI_IMAGE_FORMAT_ARGB8888, 4, 0, 0 }, } }; static const struct dri_image_descriptor dri_image_xrgb8888_desc = { 1, { { __DRI_IMAGE_FORMAT_XRGB8888, 4, 0, 0 }, } }; static const struct dri_image_descriptor dri_image_nv12_desc = { 2, { { __DRI_IMAGE_FORMAT_R8, 1, 0, 0 }, { __DRI_IMAGE_FORMAT_GR88, 2, 1, 1 }, } }; [...] That way, we could also re-use the same descriptors for other non-Wayland buffers. switch (buffer->format) { case WL_DRM_FORMAT_ARGB8888: m = &image_argb8888_desc; break; } and thus reducing to if (plane >= m->num_planes) { _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer"); return NULL; } width = buffer->buffer.width >> m->planes[plane].w_shift; height = buffer->buffer.height >> m->planes[plane].h_shift; cpp = m->planes[plane].cpp; BTW, could you please also add YUV 4:2:2 and 4:4:4 back? That's useful to JPEG decoded surfaces. :) Thanks, Gwenole. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev