sna/gen[23]: Check for room in the batch before emitting pipeline flushes

Use a single idiom and reuse the check built into the state emission,
for both spans/boxes paths.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-01-14 18:28:24 +00:00
parent f7e4799687
commit 5d5da35c9f
2 changed files with 21 additions and 37 deletions

View File

@ -492,14 +492,6 @@ static void gen2_emit_invariant(struct sna *sna)
sna->render_state.gen2.need_invariant = FALSE;
}
static bool
gen2_check_batch(struct sna *sna)
{
return (kgem_check_batch(&sna->kgem, 30+40) &&
kgem_check_reloc(&sna->kgem, 3) &&
kgem_check_exec(&sna->kgem, 3));
}
static void
gen2_get_batch(struct sna *sna)
{
@ -1780,19 +1772,18 @@ gen2_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
gen2_emit_composite_state(sna, tmp);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
kgem_emit_flush(&sna->kgem);
} else if (gen2_check_batch(sna)) {
} else {
BATCH(_3DSTATE_MODES_5_CMD |
PIPELINE_FLUSH_RENDER_CACHE |
PIPELINE_FLUSH_TEXTURE_CACHE);
kgem_clear_dirty(&sna->kgem);
} else
kgem_submit(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
}
gen2_emit_composite_state(sna, tmp);
return TRUE;
cleanup_src:
@ -2190,17 +2181,6 @@ gen2_render_composite_spans(struct sna *sna,
tmp->prim_emit = gen2_emit_composite_spans_primitive_identity_source;
else if (tmp->base.src.is_affine)
tmp->prim_emit = gen2_emit_composite_spans_primitive_affine_source;
if (kgem_bo_is_dirty(tmp->base.src.bo)) {
if (tmp->base.src.bo == tmp->base.dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
BATCH(_3DSTATE_MODES_5_CMD |
PIPELINE_FLUSH_RENDER_CACHE |
PIPELINE_FLUSH_TEXTURE_CACHE);
kgem_clear_dirty(&sna->kgem);
}
}
}
tmp->base.floats_per_rect = 3*tmp->base.floats_per_vertex;
@ -2214,6 +2194,17 @@ gen2_render_composite_spans(struct sna *sna,
kgem_submit(&sna->kgem);
gen2_emit_composite_spans_state(sna, tmp);
if (kgem_bo_is_dirty(tmp->base.src.bo)) {
if (tmp->base.src.bo == tmp->base.dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
BATCH(_3DSTATE_MODES_5_CMD |
PIPELINE_FLUSH_RENDER_CACHE |
PIPELINE_FLUSH_TEXTURE_CACHE);
kgem_clear_dirty(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
}
return TRUE;
cleanup_dst:

View File

@ -1200,14 +1200,6 @@ static void gen3_emit_invariant(struct sna *sna)
#define MAX_OBJECTS 3 /* worst case: dst + src + mask */
static bool
gen3_check_batch(struct sna *sna)
{
return (kgem_check_batch(&sna->kgem, 200) &&
kgem_check_reloc(&sna->kgem, MAX_OBJECTS) &&
kgem_check_exec(&sna->kgem, MAX_OBJECTS));
}
static void
gen3_get_batch(struct sna *sna)
{
@ -2752,19 +2744,19 @@ gen3_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
gen3_emit_composite_state(sna, tmp);
if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
kgem_emit_flush(&sna->kgem);
} else if (gen3_check_batch(sna)) {
} else {
OUT_BATCH(_3DSTATE_MODES_5_CMD |
PIPELINE_FLUSH_RENDER_CACHE |
PIPELINE_FLUSH_TEXTURE_CACHE);
kgem_clear_dirty(&sna->kgem);
} else
kgem_submit(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
}
gen3_emit_composite_state(sna, tmp);
gen3_align_vertex(sna, tmp);
return TRUE;
@ -3193,6 +3185,7 @@ gen3_render_composite_spans(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
gen3_emit_composite_state(sna, &tmp->base);
if (kgem_bo_is_dirty(tmp->base.src.bo)) {
if (tmp->base.src.bo == tmp->base.dst.bo) {
kgem_emit_flush(&sna->kgem);
@ -3202,9 +3195,9 @@ gen3_render_composite_spans(struct sna *sna,
PIPELINE_FLUSH_TEXTURE_CACHE);
kgem_clear_dirty(&sna->kgem);
}
assert(sna->kgem.mode == KGEM_RENDER);
}
gen3_emit_composite_state(sna, &tmp->base);
gen3_align_vertex(sna, &tmp->base);
return TRUE;