drisw: fix image stride calculation for 16-bit.
authorDave Airlie <airlied@gmail.com>
Thu, 22 Mar 2012 11:56:43 +0000 (11:56 +0000)
committerDave Airlie <airlied@redhat.com>
Sun, 25 Mar 2012 16:15:23 +0000 (17:15 +0100)
If you ran g-s in 16-bpp we'd do a bunch of memory corruption.

now it just misrenders for some other reasons.

applies to stable.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/state_trackers/dri/sw/drisw.c

index f5d1555..c4c4264 100644 (file)
@@ -253,6 +253,7 @@ drisw_update_tex_buffer(struct dri_drawable *drawable,
    char *map;
    int x, y, w, h;
    int ximage_stride, line;
+   int cpp = util_format_get_blocksize(res->format);
 
    get_drawable_info(dPriv, &x, &y, &w, &h);
 
@@ -265,9 +266,8 @@ drisw_update_tex_buffer(struct dri_drawable *drawable,
    /* Copy the Drawable content to the mapped texture buffer */
    get_image(dPriv, x, y, w, h, map);
 
-   /* The pipe transfer has a pitch rounded up to the nearest 64 pixels.
-      We assume 32 bit pixels. */
-   ximage_stride = w * 4;
+   /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. */
+   ximage_stride = w * cpp;
    for (line = h-1; line; --line) {
       memmove(&map[line * transfer->stride],
               &map[line * ximage_stride],