summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-07 20:16:48 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-07 20:16:48 +0000
commit798aad6c95a1a95fd587430dc7a6d59497a10ce1 (patch)
tree8fbee78757c761e0cf83f5e26145bfcb2ee7d2ad
parentea6588726107f1ab0ef5a8f69d420b5bff819a76 (diff)
sna/gen[4-7]: Fix erroneous scale factor for partial large bo render copies
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen4_render.c2
-rw-r--r--src/sna/gen6_render.c4
-rw-r--r--src/sna/gen7_render.c5
-rw-r--r--src/sna/sna_render.c4
-rw-r--r--src/sna/sna_tiling.c36
5 files changed, 22 insertions, 29 deletions
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 700a271b..62465383 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2550,8 +2550,6 @@ fallback_blt:
gen4_copy_bind_surfaces(sna, &tmp);
gen4_align_vertex(sna, &tmp);
- tmp.src.scale[0] = 1.f/src->drawable.width;
- tmp.src.scale[1] = 1.f/src->drawable.height;
do {
gen4_render_copy_one(sna, &tmp,
box->x1 + src_dx, box->y1 + src_dy,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 213b80bf..17789e96 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3253,7 +3253,7 @@ fallback_blt:
if (!gen6_check_format(tmp.src.pict_format))
goto fallback_blt;
- tmp.op = PictOpSrc;
+ tmp.op = alu == GXcopy ? PictOpSrc : PictOpClear;
tmp.dst.pixmap = dst;
tmp.dst.width = dst->drawable.width;
tmp.dst.height = dst->drawable.height;
@@ -3357,8 +3357,6 @@ fallback_blt:
gen6_emit_copy_state(sna, &tmp);
gen6_align_vertex(sna, &tmp);
- tmp.src.scale[0] = 1.f / src->drawable.width;
- tmp.src.scale[1] = 1.f / src->drawable.height;
do {
float *v;
int n_this_time = gen6_get_rectangles(sna, &tmp, n);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 731d952b..97574054 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3271,8 +3271,7 @@ fallback_blt:
tmp.src.filter = SAMPLER_FILTER_NEAREST;
tmp.src.repeat = SAMPLER_EXTEND_NONE;
- tmp.src.card_format =
- gen7_get_card_format(tmp.src.pict_format);
+ tmp.src.card_format = gen7_get_card_format(tmp.src.pict_format);
if (too_large(src->drawable.width, src->drawable.height)) {
BoxRec extents = box[0];
int i;
@@ -3337,8 +3336,6 @@ fallback_blt:
gen7_emit_copy_state(sna, &tmp);
gen7_align_vertex(sna, &tmp);
- tmp.src.scale[0] = 1.f / src->drawable.width;
- tmp.src.scale[1] = 1.f / src->drawable.height;
do {
float *v;
int n_this_time = gen7_get_rectangles(sna, &tmp, n);
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 676f5c73..572d6ea7 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -831,13 +831,13 @@ sna_render_pixmap_partial(struct sna *sna,
box.y1 = y;
box.x2 = x + w;
box.y2 = y + h;
+ DBG(("%s: unaligned box (%d, %d), (%d, %d)\n",
+ __FUNCTION__, box.x1, box.y1, box.x2, box.y2));
if (box.x1 < 0)
box.x1 = 0;
if (box.y1 < 0)
box.y1 = 0;
- DBG(("%s: unaligned box (%d, %d), (%d, %d)\n",
- __FUNCTION__, box.x1, box.y1, box.x2, box.y2));
if (bo->tiling) {
int tile_width, tile_height, tile_size;
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index d491b3b7..17ecaead 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -599,20 +599,6 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
if (tile.x2 > extents.x2)
tile.x2 = extents.x2;
- p.drawable.width = tile.x2 - tile.x1;
- p.drawable.height = tile.y2 - tile.y1;
-
- DBG(("%s: tile (%d, %d), (%d, %d)\n",
- __FUNCTION__, tile.x1, tile.y1, tile.x2, tile.y2));
-
- tmp_bo = kgem_create_2d(&sna->kgem,
- p.drawable.width,
- p.drawable.height,
- p.drawable.bitsPerPixel,
- tiling, CREATE_TEMPORARY);
- if (!tmp_bo)
- goto tiled_error;
-
c = clipped;
for (i = 0; i < n; i++) {
*c = box[i];
@@ -628,17 +614,31 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
c->y1 - tile.y1));
c++;
}
+ if (c == clipped)
+ continue;
+
+ p.drawable.width = tile.x2 - tile.x1;
+ p.drawable.height = tile.y2 - tile.y1;
+
+ DBG(("%s: tile (%d, %d), (%d, %d)\n",
+ __FUNCTION__, tile.x1, tile.y1, tile.x2, tile.y2));
+
+ tmp_bo = kgem_create_2d(&sna->kgem,
+ p.drawable.width,
+ p.drawable.height,
+ p.drawable.bitsPerPixel,
+ tiling, CREATE_TEMPORARY);
+ if (!tmp_bo)
+ goto tiled_error;
- if (c == clipped ||
- (sna->render.copy_boxes(sna, GXcopy,
+ i = (sna->render.copy_boxes(sna, GXcopy,
src, src_bo, src_dx, src_dy,
&p, tmp_bo, -tile.x1, -tile.y1,
clipped, c - clipped) &&
sna->render.copy_boxes(sna, alu,
&p, tmp_bo, -tile.x1, -tile.y1,
dst, dst_bo, dst_dx, dst_dy,
- clipped, c - clipped)))
- i = 1;
+ clipped, c - clipped));
kgem_bo_destroy(&sna->kgem, tmp_bo);