st/dri/sw: Fix pitch calculation in drisw_update_tex_buffer
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Tue, 18 Jun 2013 15:41:43 +0000 (16:41 +0100)
committerAdam Jackson <ajax@redhat.com>
Mon, 24 Jun 2013 13:52:24 +0000 (09:52 -0400)
swrastGetImage rounds the pitch up to 4 bytes for compatibility reasons
that are explained in drisw_glx.c:bytes_per_line, so drisw_update_tex_buffer
must do the same.

Fixes window skew seen while running firefox over vnc on a 16-bit screen.

NOTE: This is a candidate for the stable branches.

[ajax: fixed typo in comment]

Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Signed-off-by: Richard Sandiford <rsandifo@linux.vnet.ibm.com>
src/gallium/state_trackers/dri/sw/drisw.c

index 7a5f79716c08eb0fac53e375900a18375554abb7..41f66d5e4d47dc4b35628efeeda408b92aaa557e 100644 (file)
@@ -265,8 +265,9 @@ 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. */
-   ximage_stride = w * cpp;
+   /* The pipe transfer has a pitch rounded up to the nearest 64 pixels.
+      get_image() has a pitch rounded up to 4 bytes.  */
+   ximage_stride = ((w * cpp) + 3) & -4;
    for (line = h-1; line; --line) {
       memmove(&map[line * transfer->stride],
               &map[line * ximage_stride],