Not all color formats have a pixel stride of 4 bytes. This fixes importation of RGB565 images. Signed-off-by: Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxx> --- 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); -- 2.5.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel