xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen6_render.c src/sna/kgem.c src/sna/sna_render.h
Chris Wilson
ickle at kemper.freedesktop.org
Mon Jan 16 05:39:21 PST 2012
src/sna/gen2_render.c | 13 +++++++++++--
src/sna/gen3_render.c | 13 ++++++++++---
src/sna/gen6_render.c | 18 +++++++++---------
src/sna/kgem.c | 3 ++-
src/sna/sna_render.h | 1 -
5 files changed, 32 insertions(+), 16 deletions(-)
New commits:
commit 8b2bb666662305ab88aad8198ad69b1c98407d75
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Jan 16 13:35:05 2012 +0000
sna/gen6: Restore the non-pipelined op after every WM binding table update
The hw wants it as demonstrated by the '>' in KDE's menus. Why is it
always KDE that demonstrates coherency problems...
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index dd88013..0801e04 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -708,11 +708,11 @@ gen6_emit_wm(struct sna *sna, unsigned int kernel, int nr_surfaces, int nr_input
OUT_BATCH(0);
}
-static void
+static bool
gen6_emit_binding_table(struct sna *sna, uint16_t offset)
{
if (sna->render_state.gen6.surface_table == offset)
- return;
+ return false;
/* Binding table pointers */
OUT_BATCH(GEN6_3DSTATE_BINDING_TABLE_POINTERS |
@@ -724,6 +724,7 @@ gen6_emit_binding_table(struct sna *sna, uint16_t offset)
OUT_BATCH(offset*4);
sna->render_state.gen6.surface_table = offset;
+ return true;
}
static void
@@ -734,8 +735,6 @@ gen6_emit_drawing_rectangle(struct sna *sna,
uint32_t limit = (op->dst.height - 1) << 16 | (op->dst.width - 1);
uint32_t offset = (uint16_t)op->dst.y << 16 | (uint16_t)op->dst.x;
- force |= sna->render_state.gen6.target != op->dst.bo->handle;
-
if (!force &&
sna->render_state.gen6.drawrect_limit == limit &&
sna->render_state.gen6.drawrect_offset == offset)
@@ -743,7 +742,6 @@ gen6_emit_drawing_rectangle(struct sna *sna,
sna->render_state.gen6.drawrect_offset = offset;
sna->render_state.gen6.drawrect_limit = limit;
- sna->render_state.gen6.target = op->dst.bo->handle;
OUT_BATCH(GEN6_3DSTATE_DRAWING_RECTANGLE | (4 - 2));
OUT_BATCH(0);
@@ -864,8 +862,11 @@ gen6_emit_state(struct sna *sna,
op->u.gen6.nr_inputs);
gen6_emit_vertex_elements(sna, op);
- /* XXX updating the binding table requires a non-pipelined cmd? */
- gen6_emit_binding_table(sna, wm_binding_table);
+ /* XXX updating the binding table requires a non-pipelined cmd?
+ * The '>' in KDE menus suggest that every binding table update
+ * requires a subsequent non-pipelined op, or maybe a pipelined flush?
+ */
+ need_flush |= gen6_emit_binding_table(sna, wm_binding_table);
gen6_emit_drawing_rectangle(sna, op, need_flush & !flushed);
}
@@ -3901,7 +3902,6 @@ static void gen6_render_reset(struct sna *sna)
sna->render_state.gen6.samplers = -1;
sna->render_state.gen6.blend = -1;
sna->render_state.gen6.kernel = -1;
- sna->render_state.gen6.target = -1;
sna->render_state.gen6.drawrect_offset = -1;
sna->render_state.gen6.drawrect_limit = -1;
sna->render_state.gen6.surface_table = -1;
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 04543de..4346196 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -391,7 +391,6 @@ struct gen6_render_state {
uint32_t blend;
uint32_t samplers;
uint32_t kernel;
- uint32_t target;
uint16_t num_sf_outputs;
uint16_t vb_id;
commit a11b22d172898ebfc657339a9ca56102ae92592f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Jan 16 13:06:58 2012 +0000
sna/gen[23]: Remark the destination bo as dirty after flushing
One of the side-effects of emitting the composite state is that it
tags the destination surface as dirty as a result of the *forthcoming*
operation. So emitting the flush after emitting the composite state
clears that tag, so we need to restore it for future coherency.
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 e5e5884..0775b76 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1657,6 +1657,8 @@ gen2_render_composite(struct sna *sna,
int16_t width, int16_t height,
struct sna_composite_op *tmp)
{
+ bool need_flush;
+
DBG(("%s()\n", __FUNCTION__));
if (op >= ARRAY_SIZE(gen2_blend_op)) {
@@ -1808,8 +1810,10 @@ gen2_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
+ need_flush =
+ kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo);
gen2_emit_composite_state(sna, tmp);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+ if (need_flush) {
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
@@ -1819,6 +1823,7 @@ gen2_render_composite(struct sna *sna,
kgem_clear_dirty(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
+ kgem_bo_mark_dirty(tmp->dst.bo);
}
return TRUE;
@@ -2154,6 +2159,8 @@ gen2_render_composite_spans(struct sna *sna,
unsigned flags,
struct sna_composite_spans_op *tmp)
{
+ bool need_flush;
+
DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
src_x, src_y, dst_x, dst_y, width, height));
@@ -2229,8 +2236,9 @@ gen2_render_composite_spans(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
+ need_flush = tmp->base.src.bo;
gen2_emit_composite_spans_state(sna, tmp);
- if (kgem_bo_is_dirty(tmp->base.src.bo)) {
+ if (need_flush) {
if (tmp->base.src.bo == tmp->base.dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
@@ -2240,6 +2248,7 @@ gen2_render_composite_spans(struct sna *sna,
kgem_clear_dirty(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
+ kgem_bo_mark_dirty(tmp->base.dst.bo);
}
return TRUE;
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index b131b89..ffcfff6 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2560,6 +2560,8 @@ gen3_render_composite(struct sna *sna,
int16_t width, int16_t height,
struct sna_composite_op *tmp)
{
+ bool need_flush;
+
DBG(("%s()\n", __FUNCTION__));
if (op >= ARRAY_SIZE(gen3_blend_op)) {
@@ -2800,8 +2802,10 @@ gen3_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
+ need_flush =
+ kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo);
gen3_emit_composite_state(sna, tmp);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+ if (need_flush) {
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
@@ -2811,6 +2815,7 @@ gen3_render_composite(struct sna *sna,
kgem_clear_dirty(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
+ kgem_bo_mark_dirty(tmp->dst.bo);
}
gen3_align_vertex(sna, tmp);
@@ -3136,7 +3141,7 @@ gen3_render_composite_spans(struct sna *sna,
unsigned flags,
struct sna_composite_spans_op *tmp)
{
- bool no_offset;
+ bool no_offset, need_flush;
DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
src_x, src_y, dst_x, dst_y, width, height));
@@ -3241,8 +3246,9 @@ gen3_render_composite_spans(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
+ need_flush = kgem_bo_is_dirty(tmp->base.src.bo);
gen3_emit_composite_state(sna, &tmp->base);
- if (kgem_bo_is_dirty(tmp->base.src.bo)) {
+ if (need_flush) {
if (tmp->base.src.bo == tmp->base.dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
@@ -3252,6 +3258,7 @@ gen3_render_composite_spans(struct sna *sna,
kgem_clear_dirty(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
+ kgem_bo_mark_dirty(tmp->base.dst.bo);
}
gen3_align_vertex(sna, &tmp->base);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 39e036b..dd88013 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1663,7 +1663,7 @@ static void gen6_emit_composite_state(struct sna *sna,
FALSE);
}
- if (sna->kgem.surface == offset&&
+ if (sna->kgem.surface == offset &&
*(uint64_t *)(sna->kgem.batch + sna->render_state.gen6.surface_table) == *(uint64_t*)binding_table &&
(op->mask.bo == NULL ||
sna->kgem.batch[sna->render_state.gen6.surface_table+2] == binding_table[2])) {
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index d119ae3..9169dd7 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2884,9 +2884,10 @@ struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
{
struct kgem_bo *bo;
- assert(target->proxy == NULL);
DBG(("%s: target handle=%d, offset=%d, length=%d, io=%d\n",
__FUNCTION__, target->handle, offset, length, target->io));
+ assert(target->proxy == NULL);
+ assert(target->tiling == I915_TILING_NONE);
bo = __kgem_bo_alloc(target->handle, length);
if (bo == NULL)
More information about the xorg-commit
mailing list