summaryrefslogtreecommitdiff
path: root/src/sna/sna_blt.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-11-04 12:57:01 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2013-11-04 13:56:37 +0000
commit8f6e227ba8127a2ca034271f2a660c24abbe056f (patch)
treea9b769bd36b2eab36d50e445e278ed93656ec4eb /src/sna/sna_blt.c
parent82b646a42f5a6271c8518ad454f1603714276caf (diff)
sna: Apply the BLT source offset for individual copies
Following a complex path through multiple layers of indirections and tiling fallbacks, resulted in hitting a path where the source offset was subsequently ignored. This leads to the operation reading from invalid memory (or hitting the assert warning about the same). References: https://bugs.freedesktop.org/show_bug.cgi?id=70924 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/sna/sna_blt.c')
-rw-r--r--src/sna/sna_blt.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index f5abeffc..b4f7d0ee 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1379,8 +1379,8 @@ blt_composite_copy(struct sna *sna,
x2 = x1 + r->width;
y2 = y1 + r->height;
- src_x = r->src.x - x1;
- src_y = r->src.y - y1;
+ src_x = r->src.x - x1 + op->u.blt.sx;
+ src_y = r->src.y - y1 + op->u.blt.sy;
/* clip against dst */
if (x1 < 0)
@@ -1799,6 +1799,7 @@ prepare_blt_copy(struct sna *sna,
assert(kgem_bo_can_blt(&sna->kgem, op->dst.bo));
assert(kgem_bo_can_blt(&sna->kgem, bo));
+ kgem_set_mode(&sna->kgem, KGEM_BLT, op->dst.bo);
if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, bo, NULL)) {
kgem_submit(&sna->kgem);
if (!kgem_check_many_bo_fenced(&sna->kgem,
@@ -2675,6 +2676,7 @@ sna_blt_composite__convert(struct sna *sna,
return false;
}
+ kgem_set_mode(&sna->kgem, KGEM_BLT, tmp->dst.bo);
if (!kgem_check_many_bo_fenced(&sna->kgem, tmp->dst.bo, tmp->src.bo, NULL)) {
kgem_submit(&sna->kgem);
if (!kgem_check_many_bo_fenced(&sna->kgem,
@@ -2687,7 +2689,7 @@ sna_blt_composite__convert(struct sna *sna,
DBG(("%s: blt dst offset (%d, %d), source offset (%d, %d), with alpha fixup? %x\n",
__FUNCTION__,
- tmp->dst.x, tmp->dst.y, tmp->u.blt.sx, tmp->u.blt.sy, alpha_fixup));
+ tmp->dst.x, tmp->dst.y, sx, sy, alpha_fixup));
tmp->u.blt.src_pixmap = NULL;
tmp->u.blt.sx = sx;