xf86-video-intel: 2 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_render.c src/sna/sna_tiling.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Jun 26 04:08:50 PDT 2013
src/sna/gen4_render.c | 8 ++---
src/sna/gen5_render.c | 8 ++---
src/sna/gen6_render.c | 8 ++---
src/sna/gen7_render.c | 8 ++---
src/sna/sna_render.c | 5 ++-
src/sna/sna_tiling.c | 71 ++++++++++++++++++++++++++++++--------------------
6 files changed, 62 insertions(+), 46 deletions(-)
New commits:
commit 362b0dc6a3b1692b752d8f250075ccc81debfca3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jun 26 12:04:46 2013 +0100
sna/gen4+: Fix determination of intermediate extents
Complete logic fail for finding the bounding box of the boxes to be
copied.
Reported-by: Clemens Eisserer <linuxhippy at gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66168
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e6b6d44..b27e531 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2377,14 +2377,14 @@ fallback_blt:
int i;
for (i = 1; i < n; i++) {
- if (extents.x1 < box[i].x1)
+ if (box[i].x1 < extents.x1)
extents.x1 = box[i].x1;
- if (extents.y1 < box[i].y1)
+ if (box[i].y1 < extents.y1)
extents.y1 = box[i].y1;
- if (extents.x2 > box[i].x2)
+ if (box[i].x2 > extents.x2)
extents.x2 = box[i].x2;
- if (extents.y2 > box[i].y2)
+ if (box[i].y2 > extents.y2)
extents.y2 = box[i].y2;
}
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index f7f7e6f..689332c 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2323,14 +2323,14 @@ fallback_blt:
int i;
for (i = 1; i < n; i++) {
- if (extents.x1 < box[i].x1)
+ if (box[i].x1 < extents.x1)
extents.x1 = box[i].x1;
- if (extents.y1 < box[i].y1)
+ if (box[i].y1 < extents.y1)
extents.y1 = box[i].y1;
- if (extents.x2 > box[i].x2)
+ if (box[i].x2 > extents.x2)
extents.x2 = box[i].x2;
- if (extents.y2 > box[i].y2)
+ if (box[i].y2 > extents.y2)
extents.y2 = box[i].y2;
}
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 5cdfec7..e9136d7 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2758,14 +2758,14 @@ fallback_blt:
extents = box[0];
for (i = 1; i < n; i++) {
- if (extents.x1 < box[i].x1)
+ if (box[i].x1 < extents.x1)
extents.x1 = box[i].x1;
- if (extents.y1 < box[i].y1)
+ if (box[i].y1 < extents.y1)
extents.y1 = box[i].y1;
- if (extents.x2 > box[i].x2)
+ if (box[i].x2 > extents.x2)
extents.x2 = box[i].x2;
- if (extents.y2 > box[i].y2)
+ if (box[i].y2 > extents.y2)
extents.y2 = box[i].y2;
}
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 49a82e1..665d515 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2941,14 +2941,14 @@ fallback_blt:
extents = box[0];
for (i = 1; i < n; i++) {
- if (extents.x1 < box[i].x1)
+ if (box[i].x1 < extents.x1)
extents.x1 = box[i].x1;
- if (extents.y1 < box[i].y1)
+ if (box[i].y1 < extents.y1)
extents.y1 = box[i].y1;
- if (extents.x2 > box[i].x2)
+ if (box[i].x2 > extents.x2)
extents.x2 = box[i].x2;
- if (extents.y2 > box[i].y2)
+ if (box[i].y2 > extents.y2)
extents.y2 = box[i].y2;
}
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 330bfad..f27d1d8 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1890,11 +1890,12 @@ sna_render_composite_redirect(struct sna *sna,
return false;
#endif
- DBG(("%s: target too large (%dx%d), copying to temporary %dx%d, max %d\n",
+ DBG(("%s: target too large (%dx%d), copying to temporary %dx%d, max %d / %d\n",
__FUNCTION__,
op->dst.width, op->dst.height,
width, height,
- sna->render.max_3d_size));
+ sna->render.max_3d_size,
+ sna->render.max_3d_pitch));
if (!width || !height)
return false;
commit 2212468315f383d09ea17c2edac8666bdb862bc7
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jun 26 11:26:29 2013 +0100
sna: Avoid allocating a temporary if using rendercpy tiles
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index 02ab59d..e6cc193 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -804,32 +804,40 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
BoxRec extents, tile, stack[64], *clipped, *c;
PixmapRec p;
int i, step, tiling;
+ bool create = true;
bool ret = false;
extents = box[0];
for (i = 1; i < n; i++) {
- if (extents.x1 < box[i].x1)
+ if (box[i].x1 < extents.x1)
extents.x1 = box[i].x1;
- if (extents.y1 < box[i].y1)
+ if (box[i].y1 < extents.y1)
extents.y1 = box[i].y1;
- if (extents.x2 > box[i].x2)
+ if (box[i].x2 > extents.x2)
extents.x2 = box[i].x2;
- if (extents.y2 > box[i].y2)
+ if (box[i].y2 > extents.y2)
extents.y2 = box[i].y2;
}
- step = sna->render.max_3d_size - 4096 / dst->drawable.bitsPerPixel;
- while (step * step * 4 > sna->kgem.max_upload_tile_size)
- step /= 2;
-
tiling = I915_TILING_X;
if (!kgem_bo_can_blt(&sna->kgem, src_bo) ||
!kgem_bo_can_blt(&sna->kgem, dst_bo))
tiling = I915_TILING_Y;
- DBG(("%s: tiling copy, using %dx%d %c tiles\n",
- __FUNCTION__, step, step, tiling == I915_TILING_X ? 'X' : 'Y'));
+ create = (src_bo->pitch > sna->render.max_3d_pitch ||
+ dst_bo->pitch > sna->render.max_3d_pitch);
+
+ step = sna->render.max_3d_size / 2;
+ if (create) {
+ while (step * step * 4 > sna->kgem.max_upload_tile_size)
+ step /= 2;
+ }
+
+ DBG(("%s: tiling copy %dx%d, %s %dx%d %c tiles\n", __FUNCTION__,
+ extents.x2-extents.x1, extents.y2-extents.y1,
+ create ? "creating" : "using",
+ step, step, tiling == I915_TILING_X ? 'X' : 'Y'));
if (n > ARRAY_SIZE(stack)) {
clipped = malloc(sizeof(BoxRec) * n);
@@ -878,24 +886,31 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
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;
-
- i = (sna->render.copy_boxes(sna, GXcopy,
- src, src_bo, src_dx, src_dy,
- &p, tmp_bo, -tile.x1, -tile.y1,
- clipped, c - clipped, 0) &&
- sna->render.copy_boxes(sna, alu,
- &p, tmp_bo, -tile.x1, -tile.y1,
- dst, dst_bo, dst_dx, dst_dy,
- clipped, c - clipped, 0));
-
- kgem_bo_destroy(&sna->kgem, tmp_bo);
+ if (create) {
+ 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;
+
+ i = (sna->render.copy_boxes(sna, GXcopy,
+ src, src_bo, src_dx, src_dy,
+ &p, tmp_bo, -tile.x1, -tile.y1,
+ clipped, c - clipped, 0) &&
+ sna->render.copy_boxes(sna, alu,
+ &p, tmp_bo, -tile.x1, -tile.y1,
+ dst, dst_bo, dst_dx, dst_dy,
+ clipped, c - clipped, 0));
+
+ kgem_bo_destroy(&sna->kgem, tmp_bo);
+ } else {
+ i = sna->render.copy_boxes(sna, GXcopy,
+ src, src_bo, src_dx, src_dy,
+ dst, dst_bo, dst_dx, dst_dy,
+ clipped, c - clipped, 0);
+ }
if (!i)
goto tiled_error;
More information about the xorg-commit
mailing list