On Mon, Dec 21, 2015 at 10:12:54AM -0500, Nicolas Dufresne wrote:
Le samedi 19 décembre 2015 à 11:02 -0500, Nicolas Dufresne a écrit :
Not all color formats have a pixel stride of 4 bytes. This fixes importation of RGB565 images.
I just notice there is generic method to get the pixel stride (called block something size iirc). But worst then that, the underlying function will simply convert back to stride, better then this patch is to change this function to take a stride as parameter. I'll submit a new patch, please ignore this one.
Signed-off-by: Nicolas Dufresne nicolas.dufresne@collabora.com
Since this is a mesa patch please resubmit to mesa-devel@lists.freedesktop.org. This list here is for the drm component (despite that it says dri-devel, I know confusing ...).
Thanks, Daniel
src/gallium/state_trackers/dri/dri2.c | 28 +++++++++++++++++------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index a11a6cb..1373785 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -46,34 +46,40 @@ #include "dri_query_renderer.h" #include "dri2_buffer.h" -static int convert_fourcc(int format, int *dri_components_p) +static int convert_fourcc(int format, int *dri_components_p, int *pstride_p) { - int dri_components; + int dri_components, pstride; switch(format) { case __DRI_IMAGE_FOURCC_RGB565: format = __DRI_IMAGE_FORMAT_RGB565; dri_components = __DRI_IMAGE_COMPONENTS_RGB; + pstride = 2; break; case __DRI_IMAGE_FOURCC_ARGB8888: format = __DRI_IMAGE_FORMAT_ARGB8888; dri_components = __DRI_IMAGE_COMPONENTS_RGBA; + pstride = 4; break; case __DRI_IMAGE_FOURCC_XRGB8888: format = __DRI_IMAGE_FORMAT_XRGB8888; dri_components = __DRI_IMAGE_COMPONENTS_RGB; + pstride = 4; break; case __DRI_IMAGE_FOURCC_ABGR8888: format = __DRI_IMAGE_FORMAT_ABGR8888; dri_components = __DRI_IMAGE_COMPONENTS_RGBA; + pstride = 4; break; case __DRI_IMAGE_FOURCC_XBGR8888: format = __DRI_IMAGE_FORMAT_XBGR8888; dri_components = __DRI_IMAGE_COMPONENTS_RGB; + pstride = 4; break; default: return -1; } *dri_components_p = dri_components; + *pstride_p = pstride; return format; } @@ -986,19 +992,19 @@ dri2_from_names(__DRIscreen *screen, int width, int height, int format, void *loaderPrivate) { __DRIimage *img; - int stride, dri_components; + int stride, pstride, dri_components; if (num_names != 1) return NULL; if (offsets[0] != 0) return NULL; - format = convert_fourcc(format, &dri_components); + format = convert_fourcc(format, &dri_components, &pstride); if (format == -1) return NULL; /* Strides are in bytes not pixels. */ - stride = strides[0] /4; + stride = strides[0] / pstride; img = dri2_create_image_from_name(screen, width, height, format, names[0], stride, loaderPrivate); @@ -1101,19 +1107,19 @@ dri2_from_fds(__DRIscreen *screen, int width, int height, int fourcc, void *loaderPrivate) { __DRIimage *img; - int format, stride, dri_components; + int format, stride, pstride, dri_components; if (num_fds != 1) return NULL; if (offsets[0] != 0) return NULL; - format = convert_fourcc(fourcc, &dri_components); + format = convert_fourcc(fourcc, &dri_components, &pstride); if (format == -1) return NULL; /* Strides are in bytes not pixels. */ - stride = strides[0] /4; + stride = strides[0] / pstride; img = dri2_create_image_from_fd(screen, width, height, format, fds[0], stride, loaderPrivate); @@ -1137,21 +1143,21 @@ dri2_from_dma_bufs(__DRIscreen *screen, void *loaderPrivate) { __DRIimage *img; - int format, stride, dri_components; + int format, stride, pstride, dri_components; if (num_fds != 1 || offsets[0] != 0) { *error = __DRI_IMAGE_ERROR_BAD_MATCH; return NULL; } - format = convert_fourcc(fourcc, &dri_components); + format = convert_fourcc(fourcc, &dri_components, &pstride); if (format == -1) { *error = __DRI_IMAGE_ERROR_BAD_MATCH; return NULL; } /* Strides are in bytes not pixels. */ - stride = strides[0] /4; + stride = strides[0] / pstride; img = dri2_create_image_from_fd(screen, width, height, format, fds[0], stride, loaderPrivate);
dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel