xf86-video-intel: 2 commits - src/sna/gen5_render.c src/sna/sna_blt.c src/sna/sna_io.c src/sna/sna_tiling.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jul 12 15:26:15 PDT 2013
src/sna/gen5_render.c | 12 +++++++++++-
src/sna/sna_blt.c | 2 +-
src/sna/sna_io.c | 42 ++++++++++++++++++++++++------------------
src/sna/sna_tiling.c | 45 ++++++++++++++++++++++++---------------------
4 files changed, 60 insertions(+), 41 deletions(-)
New commits:
commit 2b16eaefb38b4a6efe50a397e68793ab9a1cb2ef
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jul 12 23:22:59 2013 +0100
sna: Avoid integer overflow when computing the tiled extents
When stepping over the tiles, beware that the step may overflow the
int16_t region extents, so use an int for the calculation.
Reported-by: Andrew Woodward
Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1200766
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 0a38aa8..406fa63 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -309,14 +309,16 @@ fallback:
__FUNCTION__, step, step));
for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
- tile.y2 = tile.y1 + step;
- if (tile.y2 > extents.y2)
- tile.y2 = extents.y2;
+ int y2 = tile.y1 + step;
+ if (y2 > extents.y2)
+ y2 = extents.y2;
+ tile.y2 = y2;
for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
- tile.x2 = tile.x1 + step;
- if (tile.x2 > extents.x2)
- tile.x2 = extents.x2;
+ int x2 = tile.x1 + step;
+ if (x2 > extents.x2)
+ x2 = extents.x2;
+ tile.x2 = x2;
tmp.drawable.width = tile.x2 - tile.x1;
tmp.drawable.height = tile.y2 - tile.y1;
@@ -767,14 +769,16 @@ tile:
clipped = stack;
for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
- tile.y2 = tile.y1 + step;
- if (tile.y2 > extents.y2)
- tile.y2 = extents.y2;
+ int y2 = tile.y1 + step;
+ if (y2 > extents.y2)
+ y2 = extents.y2;
+ tile.y2 = y2;
for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
- tile.x2 = tile.x1 + step;
- if (tile.x2 > extents.x2)
- tile.x2 = extents.x2;
+ int x2 = tile.x1 + step;
+ if (x2 > extents.x2)
+ x2 = extents.x2;
+ tile.x2 = x2;
tmp.drawable.width = tile.x2 - tile.x1;
tmp.drawable.height = tile.y2 - tile.y1;
@@ -1136,14 +1140,16 @@ tile:
clipped = stack;
for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
- tile.y2 = tile.y1 + step;
- if (tile.y2 > extents.y2)
- tile.y2 = extents.y2;
+ int y2 = tile.y1 + step;
+ if (y2 > extents.y2)
+ y2 = extents.y2;
+ tile.y2 = y2;
for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
- tile.x2 = tile.x1 + step;
- if (tile.x2 > extents.x2)
- tile.x2 = extents.x2;
+ int x2 = tile.x1 + step;
+ if (x2 > extents.x2)
+ x2 = extents.x2;
+ tile.x2 = x2;
tmp.drawable.width = tile.x2 - tile.x1;
tmp.drawable.height = tile.y2 - tile.y1;
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index e6cc193..aa5fe8f 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -607,18 +607,19 @@ sna_tiling_fill_boxes(struct sna *sna,
for (tile.extents.y1 = tile.extents.y2 = region.extents.y1;
tile.extents.y2 < region.extents.y2;
tile.extents.y1 = tile.extents.y2) {
- tile.extents.y2 = tile.extents.y1 + step;
- if (tile.extents.y2 > region.extents.y2)
- tile.extents.y2 = region.extents.y2;
+ int y2 = tile.extents.y1 + step;
+ if (y2 > region.extents.y2)
+ y2 = region.extents.y2;
+ tile.extents.y2 = y2;
for (tile.extents.x1 = tile.extents.x2 = region.extents.x1;
tile.extents.x2 < region.extents.x2;
tile.extents.x1 = tile.extents.x2) {
PixmapRec tmp;
-
- tile.extents.x2 = tile.extents.x1 + step;
- if (tile.extents.x2 > region.extents.x2)
- tile.extents.x2 = region.extents.x2;
+ int x2 = tile.extents.x1 + step;
+ if (x2 > region.extents.x2)
+ x2 = region.extents.x2;
+ tile.extents.x2 = x2;
tile.data = NULL;
@@ -733,18 +734,19 @@ bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
for (tile.extents.y1 = tile.extents.y2 = region.extents.y1;
tile.extents.y2 < region.extents.y2;
tile.extents.y1 = tile.extents.y2) {
- tile.extents.y2 = tile.extents.y1 + step;
- if (tile.extents.y2 > region.extents.y2)
- tile.extents.y2 = region.extents.y2;
+ int y2 = tile.extents.y1 + step;
+ if (y2 > region.extents.y2)
+ y2 = region.extents.y2;
+ tile.extents.y2 = y2;
for (tile.extents.x1 = tile.extents.x2 = region.extents.x1;
tile.extents.x2 < region.extents.x2;
tile.extents.x1 = tile.extents.x2) {
int w, h;
-
- tile.extents.x2 = tile.extents.x1 + step;
- if (tile.extents.x2 > region.extents.x2)
- tile.extents.x2 = region.extents.x2;
+ int x2 = tile.extents.x1 + step;
+ if (x2 > region.extents.x2)
+ x2 = region.extents.x2;
+ tile.extents.x2 = x2;
tile.data = NULL;
@@ -851,16 +853,17 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
p.devPrivate.ptr = NULL;
for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
- tile.y2 = tile.y1 + step;
- if (tile.y2 > extents.y2)
- tile.y2 = extents.y2;
+ int y2 = tile.y1 + step;
+ if (y2 > extents.y2)
+ y2 = extents.y2;
+ tile.y2 = y2;
for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
struct kgem_bo *tmp_bo;
-
- tile.x2 = tile.x1 + step;
- if (tile.x2 > extents.x2)
- tile.x2 = extents.x2;
+ int x2 = tile.x1 + step;
+ if (x2 > extents.x2)
+ x2 = extents.x2;
+ tile.x2 = x2;
c = clipped;
for (i = 0; i < n; i++) {
commit 835ceccb27afa18704c34dc3283476340f999317
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jul 12 23:20:56 2013 +0100
sna/gen5: Add some more DBG
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index b31ac1e..2b75ff6 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2247,6 +2247,13 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
{
struct sna_composite_op tmp;
+ DBG(("%s alu=%d, src=%d:handle=%d, dst=%d:handle=%d boxes=%d x [((%d, %d), (%d, %d))...], flags=%x\n",
+ __FUNCTION__, alu,
+ src->drawable.serialNumber, src_bo->handle,
+ dst->drawable.serialNumber, dst_bo->handle,
+ n, box->x1, box->y1, box->x2, box->y2,
+ flags));
+
if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
@@ -2359,8 +2366,10 @@ fallback_blt:
if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
kgem_submit(&sna->kgem);
- if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
+ if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
+ DBG(("%s: aperture check failed\n", __FUNCTION__));
goto fallback_tiled_src;
+ }
}
dst_dx += tmp.dst.x;
@@ -2420,6 +2429,7 @@ fallback_tiled:
box, n))
return true;
+ DBG(("%s: tiled fallback\n", __FUNCTION__));
return sna_tiling_copy_boxes(sna, alu,
src, src_bo, src_dx, src_dy,
dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index ec3278b..1df23de 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2667,7 +2667,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
__FUNCTION__, bpp, pixel, alu, nbox));
if (!kgem_bo_can_blt(kgem, bo)) {
- DBG(("%s: fallback -- dst uses Y-tiling\n", __FUNCTION__));
+ DBG(("%s: fallback -- cannot blt to dst\n", __FUNCTION__));
return false;
}
More information about the xorg-commit
mailing list