diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-07 20:16:48 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-07 20:16:48 +0000 |
commit | 798aad6c95a1a95fd587430dc7a6d59497a10ce1 (patch) | |
tree | 8fbee78757c761e0cf83f5e26145bfcb2ee7d2ad | |
parent | ea6588726107f1ab0ef5a8f69d420b5bff819a76 (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.c | 2 | ||||
-rw-r--r-- | src/sna/gen6_render.c | 4 | ||||
-rw-r--r-- | src/sna/gen7_render.c | 5 | ||||
-rw-r--r-- | src/sna/sna_render.c | 4 | ||||
-rw-r--r-- | src/sna/sna_tiling.c | 36 |
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); |