xf86-video-intel: src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c
Chris Wilson
ickle at kemper.freedesktop.org
Sun Jan 20 07:56:41 PST 2013
src/sna/gen3_render.c | 13 ++++++++++---
src/sna/gen4_render.c | 9 ++++++---
src/sna/gen5_render.c | 9 ++++++---
src/sna/gen6_render.c | 13 ++++++++++---
src/sna/gen7_render.c | 11 ++++++++---
5 files changed, 40 insertions(+), 15 deletions(-)
New commits:
commit 2f9ac4e8a17e9d60bbb55c46929c37e92181d804
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sun Jan 20 15:53:32 2013 +0000
sna/gen3+: And restore non-CA compositing state after the CA pass
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 270bca5..3a06fed 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1569,11 +1569,11 @@ static void gen3_emit_composite_state(struct sna *sna,
gen3_composite_emit_shader(sna, op, op->op);
}
-static void gen3_magic_ca_pass(struct sna *sna,
+static bool gen3_magic_ca_pass(struct sna *sna,
const struct sna_composite_op *op)
{
if (!op->need_magic_ca_pass)
- return;
+ return false;
DBG(("%s(%d)\n", __FUNCTION__,
sna->render.vertex_index - sna->render.vertex_start));
@@ -1587,6 +1587,7 @@ static void gen3_magic_ca_pass(struct sna *sna,
OUT_BATCH(sna->render.vertex_start);
sna->render_state.gen3.last_blend = 0;
+ return true;
}
static void gen3_vertex_flush(struct sna *sna)
@@ -1785,7 +1786,13 @@ static int gen3_get_rectangles__flush(struct sna *sna,
if (sna->render.vertex_offset) {
gen3_vertex_flush(sna);
- gen3_magic_ca_pass(sna, op);
+ if (gen3_magic_ca_pass(sna, op)) {
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(6) | 0);
+ OUT_BATCH(gen3_get_blend_cntl(op->op,
+ op->has_component_alpha,
+ op->dst.format));
+ gen3_composite_emit_shader(sna, op, op->op);
+ }
}
return gen3_vertex_finish(sna);
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e1f4528..d2f3fff 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -207,13 +207,13 @@ gen4_choose_composite_kernel(int op, bool has_mask, bool is_ca, bool is_affine)
return base + !is_affine;
}
-static void gen4_magic_ca_pass(struct sna *sna,
+static bool gen4_magic_ca_pass(struct sna *sna,
const struct sna_composite_op *op)
{
struct gen4_render_state *state = &sna->render_state.gen4;
if (!op->need_magic_ca_pass)
- return;
+ return false;
assert(sna->render.vertex_index > sna->render.vertex_start);
@@ -237,6 +237,7 @@ static void gen4_magic_ca_pass(struct sna *sna,
OUT_BATCH(0); /* index buffer offset, ignored */
state->last_primitive = sna->kgem.nbatch;
+ return true;
}
static uint32_t gen4_get_blend(int op,
@@ -615,7 +616,9 @@ static int gen4_get_rectangles__flush(struct sna *sna,
if (sna->render.vertex_offset) {
gen4_vertex_flush(sna);
- gen4_magic_ca_pass(sna, op);
+ if (gen4_magic_ca_pass(sna, op))
+ gen4_emit_pipelined_pointers(sna, op, op->op,
+ op->u.gen4.wm_kernel);
}
return gen4_vertex_finish(sna);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 695ec33..5995d1d 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -199,13 +199,13 @@ gen5_choose_composite_kernel(int op, bool has_mask, bool is_ca, bool is_affine)
return base + !is_affine;
}
-static void gen5_magic_ca_pass(struct sna *sna,
+static bool gen5_magic_ca_pass(struct sna *sna,
const struct sna_composite_op *op)
{
struct gen5_render_state *state = &sna->render_state.gen5;
if (!op->need_magic_ca_pass)
- return;
+ return false;
assert(sna->render.vertex_index > sna->render.vertex_start);
@@ -230,6 +230,7 @@ static void gen5_magic_ca_pass(struct sna *sna,
OUT_BATCH(0); /* index buffer offset, ignored */
state->last_primitive = sna->kgem.nbatch;
+ return true;
}
static uint32_t gen5_get_blend(int op,
@@ -601,7 +602,9 @@ static int gen5_get_rectangles__flush(struct sna *sna,
if (sna->render.vertex_offset) {
gen4_vertex_flush(sna);
- gen5_magic_ca_pass(sna, op);
+ if (gen5_magic_ca_pass(sna, op))
+ gen5_emit_pipelined_pointers(sna, op, op->op,
+ op->u.gen5.wm_kernel);
}
return gen4_vertex_finish(sna);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 82e9d42..35ff862 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -886,13 +886,13 @@ gen6_emit_state(struct sna *sna,
sna->render_state.gen6.first_state_packet = false;
}
-static void gen6_magic_ca_pass(struct sna *sna,
+static bool gen6_magic_ca_pass(struct sna *sna,
const struct sna_composite_op *op)
{
struct gen6_render_state *state = &sna->render_state.gen6;
if (!op->need_magic_ca_pass)
- return;
+ return false;
DBG(("%s: CA fixup (%d -> %d)\n", __FUNCTION__,
sna->render.vertex_start, sna->render.vertex_index));
@@ -918,6 +918,7 @@ static void gen6_magic_ca_pass(struct sna *sna,
OUT_BATCH(0); /* index buffer offset, ignored */
state->last_primitive = sna->kgem.nbatch;
+ return true;
}
typedef struct gen6_surface_state_padded {
@@ -1147,7 +1148,13 @@ static int gen6_get_rectangles__flush(struct sna *sna,
if (sna->render.vertex_offset) {
gen4_vertex_flush(sna);
- gen6_magic_ca_pass(sna, op);
+ if (gen6_magic_ca_pass(sna, op)) {
+ gen6_emit_flush(sna);
+ gen6_emit_cc(sna, GEN6_BLEND(op->u.gen6.flags));
+ gen6_emit_wm(sna,
+ GEN6_KERNEL(op->u.gen6.flags),
+ GEN6_VERTEX(op->u.gen6.flags) >> 2);
+ }
}
return gen4_vertex_finish(sna);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index d8ad648..158c92e 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1034,13 +1034,13 @@ gen7_emit_state(struct sna *sna,
sna->render_state.gen7.emit_flush = GEN7_READS_DST(op->u.gen7.flags);
}
-static void gen7_magic_ca_pass(struct sna *sna,
+static bool gen7_magic_ca_pass(struct sna *sna,
const struct sna_composite_op *op)
{
struct gen7_render_state *state = &sna->render_state.gen7;
if (!op->need_magic_ca_pass)
- return;
+ return true;
DBG(("%s: CA fixup (%d -> %d)\n", __FUNCTION__,
sna->render.vertex_start, sna->render.vertex_index));
@@ -1064,6 +1064,7 @@ static void gen7_magic_ca_pass(struct sna *sna,
OUT_BATCH(0); /* index buffer offset, ignored */
state->last_primitive = sna->kgem.nbatch;
+ return false;
}
static void null_create(struct sna_static_stream *stream)
@@ -1274,7 +1275,11 @@ static int gen7_get_rectangles__flush(struct sna *sna,
if (sna->render.vertex_offset) {
gen4_vertex_flush(sna);
- gen7_magic_ca_pass(sna, op);
+ if (gen7_magic_ca_pass(sna, op)) {
+ gen7_emit_pipe_invalidate(sna);
+ gen7_emit_cc(sna, GEN7_BLEND(op->u.gen7.flags));
+ gen7_emit_wm(sna, GEN7_KERNEL(op->u.gen7.flags));
+ }
}
return gen4_vertex_finish(sna);
More information about the xorg-commit
mailing list