[PATCH] dri2: Fix stride to pitch conversion

Nicolas Dufresne nicolas.dufresne at collabora.co.uk
Sat Dec 19 08:02:24 PST 2015


Not all color formats have a pixel stride of 4 bytes. This
fixes importation of RGB565 images.

Signed-off-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
---
 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



More information about the dri-devel mailing list