summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-14 01:48:11 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-14 18:13:47 +0000
commitfb92818ba4dc81ce62d58a87b5af6cb1e3a96708 (patch)
treed75e67d3219dd2292607670a72c1a2d8e50dd978
parenta62429a1f79b8fa4a5ddaf61b2bc80fc8dbe576c (diff)
sna: Pass render operation to flush and avoid the implicit flush-on-batch-end
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen2_render.c39
-rw-r--r--src/sna/gen3_render.c55
-rw-r--r--src/sna/gen4_render.c56
-rw-r--r--src/sna/gen5_render.c54
-rw-r--r--src/sna/gen6_render.c53
-rw-r--r--src/sna/gen7_render.c55
-rw-r--r--src/sna/sna_render.h1
7 files changed, 140 insertions, 173 deletions
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 87f9e8ce..ef32f011 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -510,6 +510,7 @@ gen2_get_batch(struct sna *sna)
__FUNCTION__, 30+40,
sna->kgem.surface-sna->kgem.nbatch));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->kgem.nreloc + 3 > KGEM_RELOC_SIZE(&sna->kgem)) {
@@ -518,6 +519,7 @@ gen2_get_batch(struct sna *sna)
sna->kgem.nreloc + 3,
(int)KGEM_RELOC_SIZE(&sna->kgem)));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->kgem.nexec + 3 > KGEM_EXEC_SIZE(&sna->kgem)) {
@@ -526,6 +528,7 @@ gen2_get_batch(struct sna *sna)
sna->kgem.nexec + 1,
(int)KGEM_EXEC_SIZE(&sna->kgem)));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->render_state.gen2.need_invariant)
@@ -936,7 +939,8 @@ static void gen2_magic_ca_pass(struct sna *sna,
*dst++ = *src++;
}
-static void gen2_vertex_flush(struct sna *sna)
+static void gen2_vertex_flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
if (sna->render.vertex_index == 0)
return;
@@ -944,8 +948,7 @@ static void gen2_vertex_flush(struct sna *sna)
sna->kgem.batch[sna->render_state.gen2.vertex_offset] |=
sna->render.vertex_index - 1;
- if (sna->render.op)
- gen2_magic_ca_pass(sna, sna->render.op);
+ gen2_magic_ca_pass(sna, op);
sna->render_state.gen2.vertex_offset = 0;
sna->render.vertex_index = 0;
@@ -971,7 +974,8 @@ inline static int gen2_get_rectangles(struct sna *sna,
DBG(("%s: want=%d, need=%d,size=%d, rem=%d\n",
__FUNCTION__, want, need, size, rem));
if (rem < need + size) {
- kgem_submit (&sna->kgem);
+ gen2_vertex_flush(sna, op);
+ kgem_submit(&sna->kgem);
return 0;
}
@@ -1073,9 +1077,7 @@ gen2_render_composite_boxes(struct sna *sna,
static void gen2_render_composite_done(struct sna *sna,
const struct sna_composite_op *op)
{
- gen2_vertex_flush(sna);
- sna->render.op = NULL;
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen2_vertex_flush(sna, op);
if (op->mask.bo)
kgem_bo_destroy(&sna->kgem, op->mask.bo);
@@ -1790,8 +1792,6 @@ gen2_render_composite(struct sna *sna,
}
gen2_emit_composite_state(sna, tmp);
-
- sna->render.op = tmp;
return TRUE;
cleanup_src:
@@ -2105,11 +2105,10 @@ fastcall static void
gen2_render_composite_spans_done(struct sna *sna,
const struct sna_composite_spans_op *op)
{
- gen2_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
-
DBG(("%s()\n", __FUNCTION__));
+ gen2_vertex_flush(sna, &op->base);
+
if (op->base.src.bo)
kgem_bo_destroy(&sna->kgem, op->base.src.bo);
@@ -2436,8 +2435,7 @@ gen2_render_fill_boxes(struct sna *sna,
} while (--n_this_time);
} while (n);
- gen2_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen2_vertex_flush(sna, &tmp);
return TRUE;
}
@@ -2540,8 +2538,7 @@ gen2_render_fill_op_boxes(struct sna *sna,
static void
gen2_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
{
- gen2_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen2_vertex_flush(sna, &op->base);
}
static Bool
@@ -2677,7 +2674,7 @@ gen2_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
VERTEX(y2);
VERTEX(x1);
VERTEX(y1);
- gen2_vertex_flush(sna);
+ gen2_vertex_flush(sna, &tmp);
return TRUE;
}
@@ -2862,8 +2859,7 @@ gen2_render_copy_boxes(struct sna *sna, uint8_t alu,
} while (--n_this_time);
} while (n);
- gen2_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen2_vertex_flush(sna, &tmp);
return TRUE;
}
@@ -2898,8 +2894,7 @@ gen2_render_copy_blt(struct sna *sna,
static void
gen2_render_copy_done(struct sna *sna, const struct sna_copy_op *op)
{
- gen2_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen2_vertex_flush(sna, &op->base);
}
static Bool
@@ -2984,7 +2979,7 @@ gen2_render_reset(struct sna *sna)
static void
gen2_render_flush(struct sna *sna)
{
- gen2_vertex_flush(sna);
+ assert(sna->render.vertex_index == 0);
}
static void
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index fc896d91..883e6223 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1218,6 +1218,7 @@ gen3_get_batch(struct sna *sna)
__FUNCTION__, 200,
sna->kgem.surface-sna->kgem.nbatch));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - MAX_OBJECTS) {
@@ -1226,6 +1227,7 @@ gen3_get_batch(struct sna *sna)
sna->kgem.nreloc,
(int)KGEM_RELOC_SIZE(&sna->kgem) - MAX_OBJECTS));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->kgem.nexec > KGEM_EXEC_SIZE(&sna->kgem) - MAX_OBJECTS - 1) {
@@ -1234,6 +1236,7 @@ gen3_get_batch(struct sna *sna)
sna->kgem.nexec,
(int)KGEM_EXEC_SIZE(&sna->kgem) - MAX_OBJECTS - 1));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->render_state.gen3.need_invariant)
@@ -1492,9 +1495,7 @@ static void gen3_magic_ca_pass(struct sna *sna,
static void gen3_vertex_flush(struct sna *sna)
{
- if (sna->render_state.gen3.vertex_offset == 0 ||
- sna->render.vertex_index == sna->render.vertex_start)
- return;
+ assert(sna->render_state.gen3.vertex_offset);
DBG(("%s[%x] = %d\n", __FUNCTION__,
4*sna->render_state.gen3.vertex_offset,
@@ -1506,9 +1507,6 @@ static void gen3_vertex_flush(struct sna *sna)
sna->kgem.batch[sna->render_state.gen3.vertex_offset + 1] =
sna->render.vertex_start;
- if (sna->render.op)
- gen3_magic_ca_pass(sna, sna->render.op);
-
sna->render_state.gen3.vertex_offset = 0;
}
@@ -1516,9 +1514,7 @@ static int gen3_vertex_finish(struct sna *sna)
{
struct kgem_bo *bo;
- gen3_vertex_flush(sna);
- if (!sna->render.vertex_used)
- return sna->render.vertex_size;
+ assert(sna->render.vertex_used);
bo = sna->render.vbo;
if (bo) {
@@ -1560,8 +1556,6 @@ static void gen3_vertex_close(struct sna *sna)
struct kgem_bo *bo;
int delta = 0;
- gen3_vertex_flush(sna);
-
if (!sna->render.vertex_used) {
assert(sna->render.vbo == NULL);
assert(sna->render.vertices == sna->render.vertex_data);
@@ -1656,9 +1650,15 @@ static bool gen3_rectangle_begin(struct sna *sna,
return true;
}
-static int gen3_get_rectangles__flush(struct sna *sna, bool ca)
+static int gen3_get_rectangles__flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
- if (!kgem_check_batch(&sna->kgem, ca ? 105: 5))
+ if (sna->render_state.gen3.vertex_offset) {
+ gen3_vertex_flush(sna);
+ gen3_magic_ca_pass(sna, op);
+ }
+
+ if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 105: 5))
return 0;
if (sna->kgem.nexec > KGEM_EXEC_SIZE(&sna->kgem) - 2)
return 0;
@@ -1681,7 +1681,7 @@ inline static int gen3_get_rectangles(struct sna *sna,
if (op->floats_per_rect > rem) {
DBG(("flushing vbo for %s: %d < %d\n",
__FUNCTION__, rem, op->floats_per_rect));
- rem = gen3_get_rectangles__flush(sna, op->need_magic_ca_pass);
+ rem = gen3_get_rectangles__flush(sna, op);
if (rem == 0)
return 0;
}
@@ -1791,14 +1791,13 @@ static void
gen3_render_composite_done(struct sna *sna,
const struct sna_composite_op *op)
{
- assert(sna->render.op == op);
-
- gen3_vertex_flush(sna);
- sna->render.op = NULL;
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
-
DBG(("%s()\n", __FUNCTION__));
+ if (sna->render_state.gen3.vertex_offset) {
+ gen3_vertex_flush(sna);
+ gen3_magic_ca_pass(sna, op);
+ }
+
if (op->mask.bo)
kgem_bo_destroy(&sna->kgem, op->mask.bo);
if (op->src.bo)
@@ -2767,8 +2766,6 @@ gen3_render_composite(struct sna *sna,
gen3_emit_composite_state(sna, tmp);
gen3_align_vertex(sna, tmp);
-
- sna->render.op = tmp;
return TRUE;
cleanup_mask:
@@ -3069,8 +3066,8 @@ fastcall static void
gen3_render_composite_spans_done(struct sna *sna,
const struct sna_composite_spans_op *op)
{
- gen3_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen3.vertex_offset)
+ gen3_vertex_flush(sna);
DBG(("%s()\n", __FUNCTION__));
@@ -3828,7 +3825,6 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
} while (n);
gen3_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3863,8 +3859,8 @@ gen3_render_copy_blt(struct sna *sna,
static void
gen3_render_copy_done(struct sna *sna, const struct sna_copy_op *op)
{
- gen3_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen3.vertex_offset)
+ gen3_vertex_flush(sna);
}
static Bool
@@ -4103,7 +4099,6 @@ gen3_render_fill_boxes(struct sna *sna,
} while (n);
gen3_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -4175,8 +4170,8 @@ gen3_render_fill_op_boxes(struct sna *sna,
static void
gen3_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
{
- gen3_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen3.vertex_offset)
+ gen3_vertex_flush(sna);
}
static Bool
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 942f8fb0..12281e3b 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -63,12 +63,12 @@
#define NO_FILL_BOXES 0
#if FLUSH_EVERY_VERTEX
-#define FLUSH() do { \
- gen4_vertex_flush(sna); \
+#define FLUSH(OP) do { \
+ gen4_vertex_flush(sna, OP); \
OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH); \
} while (0)
#else
-#define FLUSH()
+#define FLUSH(OP)
#endif
#define GEN4_GRF_BLOCKS(nreg) ((nreg + 15) / 16 - 1)
@@ -342,7 +342,8 @@ static void gen4_magic_ca_pass(struct sna *sna,
state->last_primitive = sna->kgem.nbatch;
}
-static void gen4_vertex_flush(struct sna *sna)
+static void gen4_vertex_flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
if (sna->render_state.gen4.vertex_offset == 0)
return;
@@ -354,8 +355,7 @@ static void gen4_vertex_flush(struct sna *sna)
sna->render.vertex_index - sna->render.vertex_start;
sna->render_state.gen4.vertex_offset = 0;
- if (sna->render.op)
- gen4_magic_ca_pass(sna, sna->render.op);
+ gen4_magic_ca_pass(sna, op);
}
static int gen4_vertex_finish(struct sna *sna)
@@ -363,9 +363,7 @@ static int gen4_vertex_finish(struct sna *sna)
struct kgem_bo *bo;
unsigned int i;
- gen4_vertex_flush(sna);
- if (!sna->render.vertex_used)
- return sna->render.vertex_size;
+ assert(sna->render.vertex_used);
/* Note: we only need dword alignment (currently) */
@@ -417,7 +415,6 @@ static void gen4_vertex_close(struct sna *sna)
struct kgem_bo *bo;
unsigned int i, delta = 0;
- gen4_vertex_flush(sna);
if (!sna->render.vertex_used) {
assert(sna->render.vbo == NULL);
assert(sna->render.vertices == sna->render.vertex_data);
@@ -1114,8 +1111,11 @@ static bool gen4_rectangle_begin(struct sna *sna,
return true;
}
-static int gen4_get_rectangles__flush(struct sna *sna)
+static int gen4_get_rectangles__flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
+ gen4_vertex_flush(sna, op);
+
if (!kgem_check_batch(&sna->kgem, 25))
return 0;
if (sna->kgem.nexec > KGEM_EXEC_SIZE(&sna->kgem) - 1)
@@ -1135,7 +1135,7 @@ inline static int gen4_get_rectangles(struct sna *sna,
if (rem < 3*op->floats_per_vertex) {
DBG(("flushing vbo for %s: %d < %d\n",
__FUNCTION__, rem, 3*op->floats_per_vertex));
- rem = gen4_get_rectangles__flush(sna);
+ rem = gen4_get_rectangles__flush(sna, op);
if (rem == 0)
return 0;
}
@@ -1262,6 +1262,7 @@ gen4_get_batch(struct sna *sna)
__FUNCTION__, sna->kgem.surface - sna->kgem.nbatch,
150, 4*8));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->render_state.gen4.needs_invariant)
@@ -1513,7 +1514,7 @@ gen4_render_composite_blt(struct sna *sna,
op->prim_emit(sna, op, r);
/* XXX are the shaders fubar? */
- FLUSH();
+ FLUSH(op);
}
fastcall static void
@@ -1751,7 +1752,7 @@ gen4_render_video(struct sna *sna,
OUT_VERTEX_F((box->x1 - dxo) * src_scale_x);
OUT_VERTEX_F((box->y1 - dyo) * src_scale_y);
- FLUSH();
+ FLUSH(&tmp);
if (!DAMAGE_IS_ALL(priv->gpu_damage)) {
sna_damage_add_box(&priv->gpu_damage, &r);
@@ -1760,8 +1761,7 @@ gen4_render_video(struct sna *sna,
box++;
}
- gen4_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen4_vertex_flush(sna, &tmp);
return TRUE;
}
@@ -1876,12 +1876,10 @@ static void
gen4_render_composite_done(struct sna *sna,
const struct sna_composite_op *op)
{
- gen4_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
- sna->render.op = NULL;
-
DBG(("%s()\n", __FUNCTION__));
+ gen4_vertex_flush(sna, op);
+
if (op->mask.bo)
kgem_bo_destroy(&sna->kgem, op->mask.bo);
if (op->src.bo)
@@ -2274,8 +2272,6 @@ gen4_render_composite(struct sna *sna,
gen4_bind_surfaces(sna, tmp);
gen4_align_vertex(sna, tmp);
-
- sna->render.op = tmp;
return TRUE;
cleanup_src:
@@ -2367,7 +2363,7 @@ gen4_render_copy_one(struct sna *sna,
OUT_VERTEX_F(sx*op->src.scale[0]);
OUT_VERTEX_F(sy*op->src.scale[1]);
- FLUSH();
+ FLUSH(op);
}
static Bool
@@ -2452,8 +2448,6 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
box->x1, box->y1);
box++;
} while (--n);
-
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -2470,8 +2464,7 @@ gen4_render_copy_blt(struct sna *sna,
static void
gen4_render_copy_done(struct sna *sna, const struct sna_copy_op *op)
{
- gen4_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ gen4_vertex_flush(sna, &op->base);
}
static Bool
@@ -2599,7 +2592,7 @@ gen4_render_fill_rectangle(struct sna *sna,
OUT_VERTEX_F(0);
OUT_VERTEX_F(0);
- FLUSH();
+ FLUSH(op);
}
static Bool
@@ -2706,7 +2699,6 @@ gen4_render_fill_boxes(struct sna *sna,
} while (--n);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -2744,9 +2736,8 @@ gen4_render_fill_op_boxes(struct sna *sna,
static void
gen4_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
{
- gen4_vertex_flush(sna);
+ gen4_vertex_flush(sna, &op->base);
kgem_bo_destroy(&sna->kgem, op->base.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
static Bool
@@ -2899,9 +2890,8 @@ gen4_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
gen4_render_fill_rectangle(sna, &tmp, x1, y1, x2 - x1, y2 - y1);
- gen4_vertex_flush(sna);
+ gen4_vertex_flush(sna, &tmp);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 573478d3..560830e1 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -312,6 +312,8 @@ static void gen5_magic_ca_pass(struct sna *sna,
if (!op->need_magic_ca_pass)
return;
+ assert(sna->render.vertex_index > sna->render.vertex_start);
+
DBG(("%s: CA fixup\n", __FUNCTION__));
gen5_emit_pipelined_pointers
@@ -335,8 +337,8 @@ static void gen5_magic_ca_pass(struct sna *sna,
static void gen5_vertex_flush(struct sna *sna)
{
- if (sna->render_state.gen5.vertex_offset == 0)
- return;
+ assert(sna->render_state.gen5.vertex_offset);
+ assert(sna->render.vertex_index > sna->render.vertex_start);
DBG(("%s[%x] = %d\n", __FUNCTION__,
4*sna->render_state.gen5.vertex_offset,
@@ -344,9 +346,6 @@ static void gen5_vertex_flush(struct sna *sna)
sna->kgem.batch[sna->render_state.gen5.vertex_offset] =
sna->render.vertex_index - sna->render.vertex_start;
sna->render_state.gen5.vertex_offset = 0;
-
- if (sna->render.op)
- gen5_magic_ca_pass(sna, sna->render.op);
}
static int gen5_vertex_finish(struct sna *sna)
@@ -354,9 +353,7 @@ static int gen5_vertex_finish(struct sna *sna)
struct kgem_bo *bo;
unsigned int i;
- gen5_vertex_flush(sna);
- if (!sna->render.vertex_used)
- return sna->render.vertex_size;
+ assert(sna->render.vertex_used);
/* Note: we only need dword alignment (currently) */
@@ -414,7 +411,6 @@ static void gen5_vertex_close(struct sna *sna)
struct kgem_bo *bo;
unsigned int i, delta = 0;
- gen5_vertex_flush(sna);
if (!sna->render.vertex_used) {
assert(sna->render.vbo == NULL);
assert(sna->render.vertices == sna->render.vertex_data);
@@ -1145,13 +1141,19 @@ static bool gen5_rectangle_begin(struct sna *sna,
return true;
}
-static int gen5_get_rectangles__flush(struct sna *sna)
+static int gen5_get_rectangles__flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
- if (!kgem_check_batch(&sna->kgem, 25))
+ if (sna->render_state.gen5.vertex_offset) {
+ gen5_vertex_flush(sna);
+ gen5_magic_ca_pass(sna, op);
+ }
+
+ if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 20 : 6))
return 0;
if (sna->kgem.nexec > KGEM_EXEC_SIZE(&sna->kgem) - 1)
return 0;
- if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 1)
+ if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 2)
return 0;
return gen5_vertex_finish(sna);
@@ -1166,7 +1168,7 @@ inline static int gen5_get_rectangles(struct sna *sna,
if (rem < op->floats_per_rect) {
DBG(("flushing vbo for %s: %d < %d\n",
__FUNCTION__, rem, op->floats_per_rect));
- rem = gen5_get_rectangles__flush(sna);
+ rem = gen5_get_rectangles__flush(sna, op);
if (rem == 0)
return 0;
}
@@ -1292,6 +1294,7 @@ gen5_get_batch(struct sna *sna)
__FUNCTION__, sna->kgem.surface - sna->kgem.nbatch,
150, 4*8));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->render_state.gen5.needs_invariant)
@@ -1810,7 +1813,6 @@ gen5_render_video(struct sna *sna,
}
gen5_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -1919,9 +1921,10 @@ static void
gen5_render_composite_done(struct sna *sna,
const struct sna_composite_op *op)
{
- gen5_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
- sna->render.op = NULL;
+ if (sna->render_state.gen5.vertex_offset) {
+ gen5_vertex_flush(sna);
+ gen5_magic_ca_pass(sna,op);
+ }
DBG(("%s()\n", __FUNCTION__));
@@ -2333,8 +2336,6 @@ gen5_render_composite(struct sna *sna,
gen5_bind_surfaces(sna, tmp);
gen5_align_vertex(sna, tmp);
-
- sna->render.op = tmp;
return TRUE;
cleanup_src:
@@ -2548,8 +2549,8 @@ fastcall static void
gen5_render_composite_spans_done(struct sna *sna,
const struct sna_composite_spans_op *op)
{
- gen5_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen5.vertex_offset)
+ gen5_vertex_flush(sna);
DBG(("%s()\n", __FUNCTION__));
@@ -2796,7 +2797,6 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
} while (n);
gen5_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -2832,8 +2832,8 @@ static void
gen5_render_copy_done(struct sna *sna,
const struct sna_copy_op *op)
{
- gen5_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen5.vertex_offset)
+ gen5_vertex_flush(sna);
DBG(("%s()\n", __FUNCTION__));
}
@@ -3071,7 +3071,6 @@ gen5_render_fill_boxes(struct sna *sna,
gen5_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3164,9 +3163,9 @@ static void
gen5_render_fill_op_done(struct sna *sna,
const struct sna_fill_op *op)
{
- gen5_vertex_flush(sna);
+ if (sna->render_state.gen5.vertex_offset)
+ gen5_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, op->base.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
DBG(("%s()\n", __FUNCTION__));
}
@@ -3340,7 +3339,6 @@ gen5_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
gen5_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 1ec6f065..1e9d9304 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -896,8 +896,7 @@ static void gen6_magic_ca_pass(struct sna *sna,
static void gen6_vertex_flush(struct sna *sna)
{
- if (sna->render_state.gen6.vertex_offset == 0)
- return;
+ assert(sna->render_state.gen6.vertex_offset);
DBG(("%s[%x] = %d\n", __FUNCTION__,
4*sna->render_state.gen6.vertex_offset,
@@ -905,9 +904,6 @@ static void gen6_vertex_flush(struct sna *sna)
sna->kgem.batch[sna->render_state.gen6.vertex_offset] =
sna->render.vertex_index - sna->render.vertex_start;
sna->render_state.gen6.vertex_offset = 0;
-
- if (sna->render.op)
- gen6_magic_ca_pass(sna, sna->render.op);
}
static int gen6_vertex_finish(struct sna *sna)
@@ -915,9 +911,7 @@ static int gen6_vertex_finish(struct sna *sna)
struct kgem_bo *bo;
unsigned int i;
- gen6_vertex_flush(sna);
- if (!sna->render.vertex_used)
- return sna->render.vertex_size;
+ assert(sna->render.vertex_used);
/* Note: we only need dword alignment (currently) */
@@ -976,7 +970,6 @@ static void gen6_vertex_close(struct sna *sna)
struct kgem_bo *bo;
unsigned int i, delta = 0;
- gen6_vertex_flush(sna);
if (!sna->render.vertex_used) {
assert(sna->render.vbo == NULL);
assert(sna->render.vertices == sna->render.vertex_data);
@@ -1541,13 +1534,19 @@ static bool gen6_rectangle_begin(struct sna *sna,
return true;
}
-static int gen6_get_rectangles__flush(struct sna *sna, bool ca)
+static int gen6_get_rectangles__flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
- if (!kgem_check_batch(&sna->kgem, ca ? 65 : 5))
+ if (sna->render_state.gen6.vertex_offset) {
+ gen6_vertex_flush(sna);
+ gen6_magic_ca_pass(sna, op);
+ }
+
+ if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 65 : 5))
return 0;
if (sna->kgem.nexec > KGEM_EXEC_SIZE(&sna->kgem) - 1)
return 0;
- if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 1)
+ if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 2)
return 0;
return gen6_vertex_finish(sna);
@@ -1562,7 +1561,7 @@ inline static int gen6_get_rectangles(struct sna *sna,
if (rem < op->floats_per_rect) {
DBG(("flushing vbo for %s: %d < %d\n",
__FUNCTION__, rem, op->floats_per_rect));
- rem = gen6_get_rectangles__flush(sna, op->need_magic_ca_pass);
+ rem = gen6_get_rectangles__flush(sna, op);
if (rem == 0)
return 0;
}
@@ -1613,6 +1612,7 @@ gen6_get_batch(struct sna *sna)
__FUNCTION__, sna->kgem.surface - sna->kgem.nbatch,
150, 4*8));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->render_state.gen6.needs_invariant)
@@ -1666,6 +1666,7 @@ gen6_align_vertex(struct sna *sna, const struct sna_composite_op *op)
assert (sna->render_state.gen6.vertex_offset == 0);
if (op->floats_per_vertex != sna->render_state.gen6.floats_per_vertex) {
if (sna->render.vertex_size - sna->render.vertex_used < 2*op->floats_per_rect)
+ /* XXX propagate failure */
gen6_vertex_finish(sna);
DBG(("aligning vertex: was %d, now %d floats per vertex, %d->%d\n",
@@ -2000,7 +2001,6 @@ gen6_render_video(struct sna *sna,
}
gen6_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -2119,9 +2119,10 @@ static void gen6_composite_channel_convert(struct sna_composite_channel *channel
static void gen6_render_composite_done(struct sna *sna,
const struct sna_composite_op *op)
{
- gen6_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
- sna->render.op = NULL;
+ if (sna->render_state.gen6.vertex_offset) {
+ gen6_vertex_flush(sna);
+ gen6_magic_ca_pass(sna, op);
+ }
if (op->mask.bo)
kgem_bo_destroy(&sna->kgem, op->mask.bo);
@@ -2546,8 +2547,6 @@ gen6_render_composite(struct sna *sna,
gen6_emit_composite_state(sna, tmp);
gen6_align_vertex(sna, tmp);
-
- sna->render.op = tmp;
return TRUE;
cleanup_src:
@@ -2841,8 +2840,8 @@ fastcall static void
gen6_render_composite_spans_done(struct sna *sna,
const struct sna_composite_spans_op *op)
{
- gen6_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen6.vertex_offset)
+ gen6_vertex_flush(sna);
DBG(("%s()\n", __FUNCTION__));
@@ -3158,7 +3157,6 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
} while (n);
gen6_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3190,8 +3188,8 @@ gen6_render_copy_blt(struct sna *sna,
static void
gen6_render_copy_done(struct sna *sna, const struct sna_copy_op *op)
{
- gen6_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen6.vertex_offset)
+ gen6_vertex_flush(sna);
}
static Bool
@@ -3439,7 +3437,6 @@ gen6_render_fill_boxes(struct sna *sna,
gen6_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3531,9 +3528,9 @@ gen6_render_op_fill_boxes(struct sna *sna,
static void
gen6_render_op_fill_done(struct sna *sna, const struct sna_fill_op *op)
{
- gen6_vertex_flush(sna);
+ if (sna->render_state.gen6.vertex_offset)
+ gen6_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, op->base.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
static Bool
@@ -3716,7 +3713,6 @@ gen6_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
gen6_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3812,7 +3808,6 @@ gen6_render_clear(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo)
gen6_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 16c389c6..b14bc708 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -999,8 +999,7 @@ static void gen7_magic_ca_pass(struct sna *sna,
static void gen7_vertex_flush(struct sna *sna)
{
- if (sna->render_state.gen7.vertex_offset == 0)
- return;
+ assert(sna->render_state.gen7.vertex_offset);
DBG(("%s[%x] = %d\n", __FUNCTION__,
4*sna->render_state.gen7.vertex_offset,
@@ -1008,9 +1007,6 @@ static void gen7_vertex_flush(struct sna *sna)
sna->kgem.batch[sna->render_state.gen7.vertex_offset] =
sna->render.vertex_index - sna->render.vertex_start;
sna->render_state.gen7.vertex_offset = 0;
-
- if (sna->render.op)
- gen7_magic_ca_pass(sna, sna->render.op);
}
static int gen7_vertex_finish(struct sna *sna)
@@ -1018,9 +1014,7 @@ static int gen7_vertex_finish(struct sna *sna)
struct kgem_bo *bo;
unsigned int i;
- gen7_vertex_flush(sna);
- if (!sna->render.vertex_used)
- return sna->render.vertex_size;
+ assert(sna->render.vertex_used);
/* Note: we only need dword alignment (currently) */
@@ -1079,7 +1073,6 @@ static void gen7_vertex_close(struct sna *sna)
struct kgem_bo *bo;
unsigned int i, delta = 0;
- gen7_vertex_flush(sna);
if (!sna->render.vertex_used) {
assert(sna->render.vbo == NULL);
assert(sna->render.vertices == sna->render.vertex_data);
@@ -1636,13 +1629,19 @@ static bool gen7_rectangle_begin(struct sna *sna,
return true;
}
-static int gen7_get_rectangles__flush(struct sna *sna, bool ca)
+static int gen7_get_rectangles__flush(struct sna *sna,
+ const struct sna_composite_op *op)
{
- if (!kgem_check_batch(&sna->kgem, ca ? 65 : 5))
+ if (sna->render_state.gen7.vertex_offset) {
+ gen7_vertex_flush(sna);
+ gen7_magic_ca_pass(sna, op);
+ }
+
+ if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 65 : 6))
return 0;
if (sna->kgem.nexec > KGEM_EXEC_SIZE(&sna->kgem) - 1)
return 0;
- if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 1)
+ if (sna->kgem.nreloc > KGEM_RELOC_SIZE(&sna->kgem) - 2)
return 0;
return gen7_vertex_finish(sna);
@@ -1657,7 +1656,7 @@ inline static int gen7_get_rectangles(struct sna *sna,
if (rem < op->floats_per_rect) {
DBG(("flushing vbo for %s: %d < %d\n",
__FUNCTION__, rem, op->floats_per_rect));
- rem = gen7_get_rectangles__flush(sna, op->need_magic_ca_pass);
+ rem = gen7_get_rectangles__flush(sna, op);
if (rem == 0)
return 0;
}
@@ -1708,6 +1707,7 @@ gen7_get_batch(struct sna *sna)
__FUNCTION__, sna->kgem.surface - sna->kgem.nbatch,
150, 4*8));
kgem_submit(&sna->kgem);
+ _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
if (sna->render_state.gen7.needs_invariant)
@@ -2093,7 +2093,6 @@ gen7_render_video(struct sna *sna,
}
gen7_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -2212,9 +2211,10 @@ static void gen7_composite_channel_convert(struct sna_composite_channel *channel
static void gen7_render_composite_done(struct sna *sna,
const struct sna_composite_op *op)
{
- gen7_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
- sna->render.op = NULL;
+ if (sna->render_state.gen7.vertex_offset) {
+ gen7_vertex_flush(sna);
+ gen7_magic_ca_pass(sna, op);
+ }
if (op->mask.bo)
kgem_bo_destroy(&sna->kgem, op->mask.bo);
@@ -2632,8 +2632,6 @@ gen7_render_composite(struct sna *sna,
gen7_emit_composite_state(sna, tmp);
gen7_align_vertex(sna, tmp);
-
- sna->render.op = tmp;
return TRUE;
cleanup_src:
@@ -2847,8 +2845,8 @@ fastcall static void
gen7_render_composite_spans_done(struct sna *sna,
const struct sna_composite_spans_op *op)
{
- gen7_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen7.vertex_offset)
+ gen7_vertex_flush(sna);
DBG(("%s()\n", __FUNCTION__));
@@ -3118,7 +3116,6 @@ gen7_render_copy_boxes(struct sna *sna, uint8_t alu,
} while (n);
gen7_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3150,8 +3147,8 @@ gen7_render_copy_blt(struct sna *sna,
static void
gen7_render_copy_done(struct sna *sna, const struct sna_copy_op *op)
{
- gen7_vertex_flush(sna);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
+ if (sna->render_state.gen7.vertex_offset)
+ gen7_vertex_flush(sna);
}
static Bool
@@ -3403,9 +3400,9 @@ gen7_render_fill_boxes(struct sna *sna,
} while (--n_this_time);
} while (n);
- gen7_vertex_flush(sna);
+ if (sna->render_state.gen7.vertex_offset)
+ gen7_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3497,9 +3494,9 @@ gen7_render_fill_op_boxes(struct sna *sna,
static void
gen7_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
{
- gen7_vertex_flush(sna);
+ if (sna->render_state.gen7.vertex_offset)
+ gen7_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, op->base.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
static Bool
@@ -3682,7 +3679,6 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
gen7_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
@@ -3778,7 +3774,6 @@ gen7_render_clear(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo)
gen7_vertex_flush(sna);
kgem_bo_destroy(&sna->kgem, tmp.src.bo);
- _kgem_set_mode(&sna->kgem, KGEM_RENDER);
return TRUE;
}
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index abb19dce..04543dec 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -278,7 +278,6 @@ struct sna_render {
float *vertices;
float vertex_data[1024];
- const struct sna_composite_op *op;
};
struct gen2_render_state {