xf86-video-intel: 4 commits - src/sna/gen2_render.c src/sna/kgem.c src/sna/sna_blt.c src/sna/sna.h src/sna/sna_io.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Oct 25 05:20:37 PDT 2013
src/sna/gen2_render.c | 1
src/sna/kgem.c | 17 ++++++----
src/sna/sna.h | 12 +++----
src/sna/sna_blt.c | 29 ++++++++++-------
src/sna/sna_io.c | 82 ++++++++++++++++++++++++++++++--------------------
5 files changed, 85 insertions(+), 56 deletions(-)
New commits:
commit 4e4d643794975b2ac90d04f1a11c0b8114699559
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 25 13:20:10 2013 +0100
sna: Fix overallocation of fences for BLT commands (gen2/3)
Fixes a regression introduced in
commit 4d2840919fd00e4ae0bf1957f66009f55a01eb7b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Sep 26 15:30:58 2013 +0100
sna: In desperation, query the actual available aperture space
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 2ee534d..a0ba8ca 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1487,6 +1487,7 @@ gen2_composite_picture(struct sna *sna,
channel->is_opaque = false;
channel->is_affine = true;
channel->transform = NULL;
+ channel->card_format = -1;
if (sna_picture_is_solid(picture, &color))
return gen2_composite_solid_init(sna, channel, color);
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index d60c430..38017dd 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4725,6 +4725,8 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
if (kgem->gen < 040 &&
bo->tiling != I915_TILING_NONE &&
(bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) {
+ assert(bo->tiling == I915_TILING_X);
+
if (kgem->nfence >= kgem->fence_max)
return false;
@@ -4749,14 +4751,10 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
return false;
}
- if (kgem->aperture + num_pages(bo) > kgem->aperture_high) {
- DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
- __FUNCTION__, num_pages(bo) + kgem->aperture, kgem->aperture_high));
- return aperture_check(kgem, num_pages(bo));
- }
-
assert_tiling(kgem, bo);
if (kgem->gen < 040 && bo->tiling != I915_TILING_NONE) {
+ assert(bo->tiling == I915_TILING_X);
+
if (kgem->nfence >= kgem->fence_max)
return false;
@@ -4770,6 +4768,12 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
return false;
}
+ if (kgem->aperture + num_pages(bo) > kgem->aperture_high) {
+ DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
+ __FUNCTION__, num_pages(bo) + kgem->aperture, kgem->aperture_high));
+ return aperture_check(kgem, num_pages(bo));
+ }
+
return kgem_flush(kgem, bo->flush);
}
@@ -4894,6 +4898,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
if (kgem->gen < 040 && read_write_domain & KGEM_RELOC_FENCED) {
if (bo->tiling &&
(bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) {
+ assert(bo->tiling == I915_TILING_X);
assert(kgem->nfence < kgem->fence_max);
kgem->aperture_fenced +=
kgem_bo_fenced_size(kgem, bo);
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 6cab2a4..c773868 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2646,6 +2646,10 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu,
_kgem_set_mode(kgem, KGEM_BLT);
}
+ assert(kgem_check_batch(kgem, 6));
+ assert(kgem_check_reloc(kgem, 1));
+ assert(kgem_check_bo_fenced(kgem, bo));
+
b = kgem->batch + kgem->nbatch;
b[0] = cmd;
b[1] = br13;
commit da0de7e55a9c1b64f3fb0d7b573bb61b0d2566df
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 25 11:35:39 2013 +0100
sna: Add a line of DBG for when we discard uploads into CPU bo
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 0dd5793..6cab2a4 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2279,6 +2279,7 @@ fill:
put:
if (tmp->dst.bo == sna_pixmap(tmp->dst.pixmap)->cpu_bo) {
+ DBG(("%s: dropping upload into CPU bo\n", __FUNCTION__));
tmp->dst.bo = NULL;
tmp->damage = NULL;
}
commit 51c87f9acaa0c4eaaea581092088e1d524396f35
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 25 11:23:21 2013 +0100
sna/io: Propagate failure to XOR uploads
Similar to the handling required for the normal upload paths.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 304f712..0796a37 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -884,7 +884,7 @@ bool sna_write_boxes(struct sna *sna, PixmapPtr dst,
struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const void *src, int stride, int16_t src_dx, int16_t src_dy,
const BoxRec *box, int n);
-void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
+bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const void *src, int stride, int16_t src_dx, int16_t src_dy,
const BoxRec *box, int nbox,
@@ -894,11 +894,11 @@ bool sna_replace(struct sna *sna,
PixmapPtr pixmap,
struct kgem_bo **bo,
const void *src, int stride);
-struct kgem_bo *sna_replace__xor(struct sna *sna,
- PixmapPtr pixmap,
- struct kgem_bo *bo,
- const void *src, int stride,
- uint32_t and, uint32_t or);
+bool sna_replace__xor(struct sna *sna,
+ PixmapPtr pixmap,
+ struct kgem_bo **bo,
+ const void *src, int stride,
+ uint32_t and, uint32_t or);
bool
sna_compute_composite_extents(BoxPtr extents,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index fdcc419..0dd5793 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1709,6 +1709,7 @@ blt_put_composite(struct sna *sna,
data += (src_x - dst_x) * bpp / 8;
data += (src_y - dst_y) * pitch;
+ assert(op->dst.bo == dst_priv->gpu_bo);
sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo,
data, pitch);
} else {
@@ -1750,6 +1751,7 @@ fastcall static void blt_put_composite_box(struct sna *sna,
data += (box->y1 + op->u.blt.sy) * pitch;
data += (box->x1 + op->u.blt.sx) * bpp;
+ assert(op->dst.bo == dst_priv->gpu_bo);
sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo,
data, pitch);
} else {
@@ -1788,6 +1790,7 @@ static void blt_put_composite_boxes(struct sna *sna,
data += (box->y1 + op->u.blt.sy) * pitch;
data += (box->x1 + op->u.blt.sx) * bpp;
+ assert(op->dst.bo == dst_priv->gpu_bo);
sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo,
data, pitch);
} else {
@@ -1829,10 +1832,9 @@ blt_put_composite_with_alpha(struct sna *sna,
data += (src_x - dst_x) * bpp;
data += (src_y - dst_y) * pitch;
- dst_priv->gpu_bo =
- sna_replace__xor(sna, op->dst.pixmap, dst_priv->gpu_bo,
- data, pitch,
- 0xffffffff, op->u.blt.pixel);
+ assert(op->dst.bo == dst_priv->gpu_bo);
+ sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo,
+ data, pitch, 0xffffffff, op->u.blt.pixel);
} else {
BoxRec box;
@@ -1871,10 +1873,9 @@ blt_put_composite_box_with_alpha(struct sna *sna,
data += (box->y1 + op->u.blt.sy) * pitch;
data += (box->x1 + op->u.blt.sx) * bpp;
- dst_priv->gpu_bo =
- sna_replace__xor(sna, op->dst.pixmap, op->dst.bo,
- data, pitch,
- 0xffffffff, op->u.blt.pixel);
+ assert(op->dst.bo == dst_priv->gpu_bo);
+ sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo,
+ data, pitch, 0xffffffff, op->u.blt.pixel);
} else {
sna_write_boxes__xor(sna, op->dst.pixmap,
op->dst.bo, op->dst.x, op->dst.y,
@@ -1909,10 +1910,9 @@ blt_put_composite_boxes_with_alpha(struct sna *sna,
data += (box->y1 + op->u.blt.sy) * pitch;
data += (box->x1 + op->u.blt.sx) * bpp;
- dst_priv->gpu_bo =
- sna_replace__xor(sna, op->dst.pixmap, op->dst.bo,
- data, pitch,
- 0xffffffff, op->u.blt.pixel);
+ assert(dst_priv->gpu_bo == op->dst.bo);
+ sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo,
+ data, pitch, 0xffffffff, op->u.blt.pixel);
} else {
sna_write_boxes__xor(sna, op->dst.pixmap,
op->dst.bo, op->dst.x, op->dst.y,
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 578442d..78951ca 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -1032,7 +1032,7 @@ fallback:
box, nbox);
}
-static void
+static bool
write_boxes_inplace__xor(struct kgem *kgem,
const void *src, int stride, int bpp, int16_t src_dx, int16_t src_dy,
struct kgem_bo *bo, int16_t dst_dx, int16_t dst_dy,
@@ -1047,11 +1047,11 @@ write_boxes_inplace__xor(struct kgem *kgem,
dst = kgem_bo_map(kgem, bo);
if (dst == NULL)
- return;
+ return false;
sigtrap_assert();
if (sigtrap_get())
- return;
+ return false;
do {
DBG(("%s: (%d, %d) -> (%d, %d) x (%d, %d) [bpp=%d, src_pitch=%d, dst_pitch=%d]\n", __FUNCTION__,
@@ -1082,6 +1082,7 @@ write_boxes_inplace__xor(struct kgem *kgem,
} while (--n);
sigtrap_put();
+ return true;
}
static bool upload_inplace__xor(struct kgem *kgem,
@@ -1098,7 +1099,7 @@ static bool upload_inplace__xor(struct kgem *kgem,
return __upload_inplace(kgem, bo, box, n, bpp);
}
-void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
+bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
const void *src, int stride, int16_t src_dx, int16_t src_dy,
const BoxRec *box, int nbox,
@@ -1116,12 +1117,11 @@ void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
if (upload_inplace__xor(kgem, dst_bo, box, nbox, dst->drawable.bitsPerPixel)) {
fallback:
- write_boxes_inplace__xor(kgem,
- src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy,
- dst_bo, dst_dx, dst_dy,
- box, nbox,
- and, or);
- return;
+ return write_boxes_inplace__xor(kgem,
+ src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy,
+ dst_bo, dst_dx, dst_dy,
+ box, nbox,
+ and, or);
}
can_blt = kgem_bo_can_blt(kgem, dst_bo) &&
@@ -1294,7 +1294,7 @@ tile:
goto tile;
}
- return;
+ return true;
}
cmd = XY_SRC_COPY_BLT_CMD;
@@ -1410,6 +1410,7 @@ tile:
} while (nbox);
sna->blt_state.fill_bo = 0;
+ return true;
}
static bool
@@ -1564,12 +1565,14 @@ err:
return false;
}
-struct kgem_bo *sna_replace__xor(struct sna *sna,
- PixmapPtr pixmap,
- struct kgem_bo *bo,
- const void *src, int stride,
- uint32_t and, uint32_t or)
+bool
+sna_replace__xor(struct sna *sna,
+ PixmapPtr pixmap,
+ struct kgem_bo **_bo,
+ const void *src, int stride,
+ uint32_t and, uint32_t or)
{
+ struct kgem_bo *bo = *_bo;
struct kgem *kgem = &sna->kgem;
void *dst;
@@ -1615,12 +1618,21 @@ struct kgem_bo *sna_replace__xor(struct sna *sna,
box.x2 = pixmap->drawable.width;
box.y2 = pixmap->drawable.height;
- sna_write_boxes__xor(sna, pixmap,
- bo, 0, 0,
- src, stride, 0, 0,
- &box, 1,
- and, or);
+ if (!sna_write_boxes__xor(sna, pixmap,
+ bo, 0, 0,
+ src, stride, 0, 0,
+ &box, 1,
+ and, or))
+ goto err;
}
- return bo;
+ if (bo != *_bo)
+ kgem_bo_destroy(kgem, *_bo);
+ *_bo = bo;
+ return true;
+
+err:
+ if (bo != *_bo)
+ kgem_bo_destroy(kgem, bo);
+ return false;
}
commit 51590e55c0187862174a7dd5775915216b3137a6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 25 11:03:05 2013 +0100
sna/io: Wrap the XOR upload paths with SIGBUS handling
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 0988d3d..578442d 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -1049,6 +1049,10 @@ write_boxes_inplace__xor(struct kgem *kgem,
if (dst == NULL)
return;
+ sigtrap_assert();
+ if (sigtrap_get())
+ return;
+
do {
DBG(("%s: (%d, %d) -> (%d, %d) x (%d, %d) [bpp=%d, src_pitch=%d, dst_pitch=%d]\n", __FUNCTION__,
box->x1 + src_dx, box->y1 + src_dy,
@@ -1076,6 +1080,8 @@ write_boxes_inplace__xor(struct kgem *kgem,
and, or);
box++;
} while (--n);
+
+ sigtrap_put();
}
static bool upload_inplace__xor(struct kgem *kgem,
@@ -1591,17 +1597,17 @@ struct kgem_bo *sna_replace__xor(struct sna *sna,
}
}
- if (kgem_bo_is_mappable(kgem, bo)) {
- dst = kgem_bo_map(kgem, bo);
- if (dst) {
- memcpy_xor(src, dst, pixmap->drawable.bitsPerPixel,
- stride, bo->pitch,
- 0, 0,
- 0, 0,
- pixmap->drawable.width,
- pixmap->drawable.height,
- and, or);
- }
+ if (kgem_bo_is_mappable(kgem, bo) &&
+ (dst = kgem_bo_map(kgem, bo)) != NULL &&
+ sigtrap_get() == 0) {
+ memcpy_xor(src, dst, pixmap->drawable.bitsPerPixel,
+ stride, bo->pitch,
+ 0, 0,
+ 0, 0,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ and, or);
+ sigtrap_put();
} else {
BoxRec box;
More information about the xorg-commit
mailing list