xf86-video-intel: 2 commits - src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_blt.c
Chris Wilson
ickle at kemper.freedesktop.org
Sat Jul 6 08:03:33 PDT 2013
src/sna/kgem.h | 5 +++++
src/sna/sna_accel.c | 6 ------
src/sna/sna_blt.c | 47 ++++++++++++++++++++++++++---------------------
3 files changed, 31 insertions(+), 27 deletions(-)
New commits:
commit 5aaab9ea0310d48bb1a1ca20308d1c9721a9de3f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Jul 6 15:10:22 2013 +0100
sna: Relax assertion that the source of the cloned pixmap cannot be mapped
I was being overzealous at the time of making the COW and trying to be
sure that we would never write through a mapping. Then I started to
allow clones to be mapped (for reads) and missed relaxing this assertion.
Reported-by: Jiri Slaby <jirislaby at gmail.com>
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 010f6e4..da1ca40 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1729,13 +1729,7 @@ sna_pixmap_make_cow(struct sna *sna,
src_priv->cow = MAKE_COW_OWNER(cow);
list_init(&src_priv->cow_list);
-
- if (src_priv->mapped) {
- src_priv->pixmap->devPrivate.ptr = NULL;
- src_priv->mapped = false;
- }
}
- assert(!src_priv->mapped);
if (cow == COW(dst_priv->cow)) {
assert(dst_priv->gpu_bo == cow->bo);
commit 8751c0f5ad202850bdd56dbb4eedb211c023cf23
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jul 5 17:55:10 2013 +0100
sna: Flush blt copies if no operations pending
More work to try and keep the GPU busy.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 73ac951..044dbba 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -319,6 +319,11 @@ static inline bool kgem_is_idle(struct kgem *kgem)
return kgem_ring_is_idle(kgem, kgem->ring);
}
+static inline bool __kgem_ring_empty(struct kgem *kgem)
+{
+ return list_is_empty(&kgem->requests[kgem->ring == KGEM_BLT]);
+}
+
void _kgem_submit(struct kgem *kgem);
static inline void kgem_submit(struct kgem *kgem)
{
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 8b10707..54cf4f8 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -85,7 +85,8 @@ static const uint8_t fill_ROP[] = {
static void nop_done(struct sna *sna, const struct sna_composite_op *op)
{
assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem));
- (void)sna;
+ if (sna->kgem.nreloc && __kgem_ring_empty(&sna->kgem))
+ _kgem_submit(&sna->kgem);
(void)op;
}
@@ -93,6 +94,12 @@ static void gen6_blt_copy_done(struct sna *sna, const struct sna_composite_op *o
{
struct kgem *kgem = &sna->kgem;
+ assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
+ if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+ _kgem_submit(kgem);
+ return;
+ }
+
if (kgem_check_batch(kgem, 3)) {
uint32_t *b = kgem->batch + kgem->nbatch;
b[0] = XY_SETUP_CLIP;
@@ -2293,6 +2300,12 @@ static void convert_done(struct sna *sna, const struct sna_composite_op *op)
{
struct kgem *kgem = &sna->kgem;
+ assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
+ if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+ _kgem_submit(kgem);
+ return;
+ }
+
if (kgem->gen >= 060 && op->src.bo == op->dst.bo && kgem_check_batch(kgem, 3)) {
uint32_t *b = kgem->batch + kgem->nbatch;
b[0] = XY_SETUP_CLIP;
@@ -2459,11 +2472,6 @@ fastcall static void sna_blt_fill_op_boxes(struct sna *sna,
_sna_blt_fill_boxes(sna, &op->base.u.blt, box, nbox);
}
-static void sna_blt_fill_op_done(struct sna *sna,
- const struct sna_fill_op *fill)
-{
-}
-
bool sna_blt_fill(struct sna *sna, uint8_t alu,
struct kgem_bo *bo, int bpp,
uint32_t pixel,
@@ -2488,7 +2496,8 @@ bool sna_blt_fill(struct sna *sna, uint8_t alu,
fill->blt = sna_blt_fill_op_blt;
fill->box = sna_blt_fill_op_box;
fill->boxes = sna_blt_fill_op_boxes;
- fill->done = sna_blt_fill_op_done;
+ fill->done =
+ (void (*)(struct sna *, const struct sna_fill_op *))nop_done;
return true;
}
@@ -2504,17 +2513,6 @@ static void sna_blt_copy_op_blt(struct sna *sna,
dst_x, dst_y);
}
-static void sna_blt_copy_op_done(struct sna *sna,
- const struct sna_copy_op *op)
-{
-}
-
-static void gen6_blt_copy_op_done(struct sna *sna,
- const struct sna_copy_op *op)
-{
- gen6_blt_copy_done(sna, &op->base);
-}
-
bool sna_blt_copy(struct sna *sna, uint8_t alu,
struct kgem_bo *src,
struct kgem_bo *dst,
@@ -2538,9 +2536,11 @@ bool sna_blt_copy(struct sna *sna, uint8_t alu,
op->blt = sna_blt_copy_op_blt;
if (sna->kgem.gen >= 060 && src == dst)
- op->done = gen6_blt_copy_op_done;
+ op->done = (void (*)(struct sna *, const struct sna_copy_op *))
+ gen6_blt_copy_done;
else
- op->done = sna_blt_copy_op_done;
+ op->done = (void (*)(struct sna *, const struct sna_copy_op *))
+ nop_done;
return true;
}
@@ -2792,6 +2792,9 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
}
} while (nbox);
+ if (kgem->nreloc && __kgem_ring_empty(kgem))
+ _kgem_submit(kgem);
+
return true;
}
@@ -2978,7 +2981,9 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
} while (1);
}
- if (kgem->gen >= 060 && kgem_check_batch(kgem, 3)) {
+ if (kgem->nreloc && __kgem_ring_empty(kgem)) {
+ _kgem_submit(kgem);
+ } else if (kgem->gen >= 060 && kgem_check_batch(kgem, 3)) {
uint32_t *b = kgem->batch + kgem->nbatch;
b[0] = XY_SETUP_CLIP;
b[1] = b[2] = 0;
More information about the xorg-commit
mailing list