sna/gen3+: And restore non-CA compositing state after the CA pass

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-01-20 15:53:32 +00:00
parent 650c9d5ce8
commit 2f9ac4e8a1
5 changed files with 40 additions and 15 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);