diff options
author | Russell King <rmk@armlinux.org.uk> | 2018-06-09 09:34:46 +0100 |
---|---|---|
committer | Russell King <rmk@armlinux.org.uk> | 2018-06-09 09:40:48 +0100 |
commit | efacd3e4c1ef5d5305e52503f432a069c6e4a046 (patch) | |
tree | 6f9b6a59e4ef9b8c85075980442de2f9d0245f5d | |
parent | 04748ff4fb30370086cc97b9487a32951c5600ba (diff) |
etnaviv: clean up GC320 workaround
Re-use the etnaviv_de_start() code for the GC320 workaround to ensure
that all relevant 2D GPU states get emitted for the operation.
Signed-off-by: Russell King <rmk@armlinux.org.uk>
-rw-r--r-- | etnaviv/etnaviv_accel.c | 11 | ||||
-rw-r--r-- | etnaviv/etnaviv_accel.h | 3 | ||||
-rw-r--r-- | etnaviv/etnaviv_op.c | 23 |
3 files changed, 20 insertions, 17 deletions
diff --git a/etnaviv/etnaviv_accel.c b/etnaviv/etnaviv_accel.c index b97b5f6..b1b14d4 100644 --- a/etnaviv/etnaviv_accel.c +++ b/etnaviv/etnaviv_accel.c @@ -1013,11 +1013,18 @@ Bool etnaviv_accel_init(struct etnaviv *etnaviv) struct etnaviv_format fmt = { .format = DE_FORMAT_A1R5G5B5 }; xPoint offset = { 0, -1 }; struct etna_bo *bo; + static const BoxRec gc320_box = { 0, 1, 1, 2 }; bo = etna_bo_new(etnaviv->conn, 4096, DRM_ETNA_GEM_TYPE_BMP); etnaviv->gc320_etna_bo = bo; - etnaviv->gc320_wa_src = INIT_BLIT_BO(bo, 64, fmt, offset); - etnaviv->gc320_wa_dst = INIT_BLIT_BO(bo, 64, fmt, ZERO_OFFSET); + etnaviv->gc320_wa.src = INIT_BLIT_BO(bo, 64, fmt, offset); + etnaviv->gc320_wa.dst = INIT_BLIT_BO(bo, 64, fmt, ZERO_OFFSET); + etnaviv->gc320_wa.blend_op = NULL; + etnaviv->gc320_wa.clip = &gc320_box; + etnaviv->gc320_wa.src_origin_mode = SRC_ORIGIN_RELATIVE; + etnaviv->gc320_wa.rop = 0xcc; + etnaviv->gc320_wa.cmd = VIVS_DE_DEST_CONFIG_COMMAND_BIT_BLT; + etnaviv->gc320_wa.brush = FALSE; /* reserve some additional batch space */ etnaviv->batch_de_high_watermark -= BATCH_WA_GC320_SIZE; diff --git a/etnaviv/etnaviv_accel.h b/etnaviv/etnaviv_accel.h index 5098bf9..bb163dc 100644 --- a/etnaviv/etnaviv_accel.h +++ b/etnaviv/etnaviv_accel.h @@ -85,8 +85,7 @@ struct etnaviv { Bool force_fallback; struct drm_armada_bufmgr *bufmgr; uint32_t bugs[1]; - struct etnaviv_blit_buf gc320_wa_src; - struct etnaviv_blit_buf gc320_wa_dst; + struct etnaviv_de_op gc320_wa; struct etna_bo *gc320_etna_bo; int scrnIndex; #ifdef HAVE_DRI2 diff --git a/etnaviv/etnaviv_op.c b/etnaviv/etnaviv_op.c index 6bd03e2..6668561 100644 --- a/etnaviv/etnaviv_op.c +++ b/etnaviv/etnaviv_op.c @@ -239,10 +239,8 @@ static void etnaviv_emit_2d_draw(struct etnaviv *etnaviv, const BoxRec *pbox, EL_END(); } -void etnaviv_de_start(struct etnaviv *etnaviv, const struct etnaviv_de_op *op) +static void de_start(struct etnaviv *etnaviv, const struct etnaviv_de_op *op) { - BATCH_SETUP_START(etnaviv); - if (op->src.bo) etnaviv_set_source_bo(etnaviv, &op->src, op->src_origin_mode); etnaviv_set_dest_bo(etnaviv, &op->dst, op->cmd); @@ -251,23 +249,22 @@ void etnaviv_de_start(struct etnaviv *etnaviv, const struct etnaviv_de_op *op) etnaviv_emit_brush(etnaviv, op->fg_colour); etnaviv_emit_rop_clip(etnaviv, op->rop, op->rop, op->clip, op->dst.offset); +} +void etnaviv_de_start(struct etnaviv *etnaviv, const struct etnaviv_de_op *op) +{ + BATCH_SETUP_START(etnaviv); + de_start(etnaviv, op); BATCH_SETUP_END(etnaviv); } void etnaviv_de_end(struct etnaviv *etnaviv) { if (etnaviv->gc320_etna_bo) { - BoxRec box = { 0, 1, 1, 2 }; - - /* Append the GC320 workaround - 6 + 6 + 2 + 4 + 4 */ - etnaviv_set_source_bo(etnaviv, &etnaviv->gc320_wa_src, - SRC_ORIGIN_RELATIVE); - etnaviv_set_dest_bo(etnaviv, &etnaviv->gc320_wa_dst, - VIVS_DE_DEST_CONFIG_COMMAND_BIT_BLT); - etnaviv_set_blend(etnaviv, NULL); - etnaviv_emit_rop_clip(etnaviv, 0xcc, 0xcc, &box, ZERO_OFFSET); - etnaviv_emit_2d_draw(etnaviv, &box, 1, ZERO_OFFSET); + /* Append the GC320 workaround - 6 + 6 + 2 + 4 + 4 + 4 */ + de_start(etnaviv, &etnaviv->gc320_wa); + etnaviv_emit_2d_draw(etnaviv, etnaviv->gc320_wa.clip, 1, + ZERO_OFFSET); } /* Append a flush, semaphore and stall to ensure that the FE */ |