summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2016-10-05 08:36:21 +0200
committerAdam Jackson <ajax@redhat.com>2016-10-05 13:57:13 -0400
commit1c2fcb95484777ca9aa80b3f814ad64e81f825f1 (patch)
tree4eb7cc90bcd0f7ed6cccbf481e2f7f8b75743836
parenta6e85e6330adcdcbcd939c0963daaecc96d41a2a (diff)
glamor: Fix pixmap offset for bitplane in glamor_copy_fbo_cpu
Commit cba28d5 - "glamor: Handle bitplane in glamor_copy_fbo_cpu" introduced a regression as the computed pixmap offset would not match the actual coordinates and write data elsewhere in memory causing a segfault in fbBltOne(). Translate the pixmap coordinates so that the data is read and written at the correct location. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97974 Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Reviewed-and-Tested-by: Michel Dänzer <michel.daenzer@amd.com>
-rw-r--r--glamor/glamor_copy.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c
index 8a329d2f8..3ca56fb09 100644
--- a/glamor/glamor_copy.c
+++ b/glamor/glamor_copy.c
@@ -230,20 +230,22 @@ glamor_copy_cpu_fbo(DrawablePtr src,
goto bail;
}
+ src_pix->drawable.x = -dst->x;
+ src_pix->drawable.y = -dst->y;
+
fbGetDrawable(&src_pix->drawable, src_bits, src_stride, src_bpp, src_xoff,
src_yoff);
if (src->bitsPerPixel > 1)
- fbCopyNto1(src, &src_pix->drawable, gc, box, nbox,
- dst_xoff + dx, dst_yoff + dy, reverse, upsidedown,
- bitplane, closure);
+ fbCopyNto1(src, &src_pix->drawable, gc, box, nbox, dx, dy,
+ reverse, upsidedown, bitplane, closure);
else
- fbCopy1toN(src, &src_pix->drawable, gc, box, nbox,
- dst_xoff + dx, dst_yoff + dy, reverse, upsidedown,
- bitplane, closure);
+ fbCopy1toN(src, &src_pix->drawable, gc, box, nbox, dx, dy,
+ reverse, upsidedown, bitplane, closure);
- glamor_upload_boxes(dst_pixmap, box, nbox, 0, 0, 0, 0,
- (uint8_t *) src_bits, src_stride * sizeof(FbBits));
+ glamor_upload_boxes(dst_pixmap, box, nbox, src_xoff, src_yoff,
+ dst_xoff, dst_yoff, (uint8_t *) src_bits,
+ src_stride * sizeof(FbBits));
fbDestroyPixmap(src_pix);
} else {
fbGetDrawable(src, src_bits, src_stride, src_bpp, src_xoff, src_yoff);