diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-14 01:48:11 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-14 18:13:47 +0000 |
commit | fb92818ba4dc81ce62d58a87b5af6cb1e3a96708 (patch) | |
tree | d75e67d3219dd2292607670a72c1a2d8e50dd978 | |
parent | a62429a1f79b8fa4a5ddaf61b2bc80fc8dbe576c (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.c | 39 | ||||
-rw-r--r-- | src/sna/gen3_render.c | 55 | ||||
-rw-r--r-- | src/sna/gen4_render.c | 56 | ||||
-rw-r--r-- | src/sna/gen5_render.c | 54 | ||||
-rw-r--r-- | src/sna/gen6_render.c | 53 | ||||
-rw-r--r-- | src/sna/gen7_render.c | 55 | ||||
-rw-r--r-- | src/sna/sna_render.h | 1 |
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 { |