summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@armlinux.org.uk>2018-06-09 09:34:46 +0100
committerRussell King <rmk@armlinux.org.uk>2018-06-09 09:40:48 +0100
commitefacd3e4c1ef5d5305e52503f432a069c6e4a046 (patch)
tree6f9b6a59e4ef9b8c85075980442de2f9d0245f5d
parent04748ff4fb30370086cc97b9487a32951c5600ba (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.c11
-rw-r--r--etnaviv/etnaviv_accel.h3
-rw-r--r--etnaviv/etnaviv_op.c23
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 */