diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2016-12-13 20:19:43 +0100 |
---|---|---|
committer | Russell King <rmk@armlinux.org.uk> | 2017-02-04 12:26:04 +0000 |
commit | 40723af04e726655c567c931cbfbe913c8304de4 (patch) | |
tree | 5ce81ace8f2d8dd8548040471c96dcd6fbec010d | |
parent | 89ea230ed870c7f9a7d2a20ec74394dc96fc9acf (diff) |
etnaviv: implement handling for large number of clip rects in vr_op
Unlike de_op, vr_op had no way to deal with a large number of clip rects
which would make the draw operation overflow a single command stream
buffer.
Implement splitting the draw operation into multiple chunks, to be able
to submit them to the kernel in several pieces.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Russell King <rmk@armlinux.org.uk>
-rw-r--r-- | etnaviv/etnaviv_op.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/etnaviv/etnaviv_op.c b/etnaviv/etnaviv_op.c index 53d0c05..6bd03e2 100644 --- a/etnaviv/etnaviv_op.c +++ b/etnaviv/etnaviv_op.c @@ -424,7 +424,7 @@ void etnaviv_vr_op(struct etnaviv *etnaviv, struct etnaviv_vr_op *op, etnaviv_set_dest_bo(etnaviv, &op->dst, op->cmd); - EL_START(etnaviv, 10 + 8 * n); + EL_START(etnaviv, 10); EL(LOADSTATE(VIVS_DE_ALPHA_CONTROL, 1)); EL(VIVS_DE_ALPHA_CONTROL_ENABLE_OFF); @@ -438,12 +438,18 @@ void etnaviv_vr_op(struct etnaviv *etnaviv, struct etnaviv_vr_op *op, VIVS_DE_VR_SOURCE_IMAGE_LOW_TOP(op->src_bounds.y1)); EL(VIVS_DE_VR_SOURCE_IMAGE_HIGH_RIGHT(op->src_bounds.x2) | VIVS_DE_VR_SOURCE_IMAGE_HIGH_BOTTOM(op->src_bounds.y2)); - EL_ALIGN(); + EL_END(); + BATCH_SETUP_END(etnaviv); while (n--) { - BoxRec box = *boxes++; + BoxRec box = *boxes; uint32_t x, y; + if (8 > MAX_BATCH_SIZE - etnaviv->batch_size) { + etnaviv_emit(etnaviv); + BATCH_OP_START(etnaviv); + } + x = x1 + (box.x1 - dst->x1) * op->h_scale; y = y1 + (box.y1 - dst->y1) * op->v_scale; @@ -453,6 +459,7 @@ void etnaviv_vr_op(struct etnaviv *etnaviv, struct etnaviv_vr_op *op, box.x2 += op->dst.offset.x; box.y2 += op->dst.offset.y; + EL_START(etnaviv, 8); /* 6 */ EL(LOADSTATE(VIVS_DE_VR_SOURCE_ORIGIN_LOW, 4)); EL(VIVS_DE_VR_SOURCE_ORIGIN_LOW_X(x)); @@ -466,8 +473,9 @@ void etnaviv_vr_op(struct etnaviv *etnaviv, struct etnaviv_vr_op *op, /* 2 */ EL(LOADSTATE(VIVS_DE_VR_CONFIG, 1)); EL(op->vr_op); + EL_END(); + boxes++; } - EL_END(); etnaviv_emit(etnaviv); } |