summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@armlinux.org.uk>2018-06-20 21:14:42 +0100
committerRussell King <rmk@armlinux.org.uk>2018-06-25 16:07:46 +0100
commite41e405a8e03f88c614b1b42db4aa838acf9063c (patch)
treeac6f6a392e6844aaca5b06f60efe0de9cca10807
parentefacd3e4c1ef5d5305e52503f432a069c6e4a046 (diff)
etnaviv: add backend support for source rotations
Add backend support for generating source rotations while blitting. Signed-off-by: Russell King <rmk@armlinux.org.uk>
-rw-r--r--etnaviv/etnaviv_accel.c9
-rw-r--r--etnaviv/etnaviv_op.c24
-rw-r--r--etnaviv/etnaviv_op.h29
3 files changed, 51 insertions, 11 deletions
diff --git a/etnaviv/etnaviv_accel.c b/etnaviv/etnaviv_accel.c
index b1b14d4..3dd0a54 100644
--- a/etnaviv/etnaviv_accel.c
+++ b/etnaviv/etnaviv_accel.c
@@ -151,6 +151,9 @@ static Bool etnaviv_init_dstsrc_drawable(struct etnaviv *etnaviv,
op->src.bo = op->src.pixmap->etna_bo;
op->src.pitch = op->src.pixmap->pitch;
op->src.format = op->src.pixmap->format;
+ op->src.width = pSrc->width;
+ op->src.height = pSrc->height;
+ op->src.rotate = DE_ROT_MODE_ROT0;
return TRUE;
}
@@ -172,6 +175,9 @@ static Bool etnaviv_init_src_pixmap(struct etnaviv *etnaviv,
op->src.pitch = op->src.pixmap->pitch;
op->src.format = op->src.pixmap->format;
op->src.offset = ZERO_OFFSET;
+ op->src.width = pix->drawable.width;
+ op->src.height = pix->drawable.height;
+ op->src.rotate = DE_ROT_MODE_ROT0;
return TRUE;
}
@@ -1029,6 +1035,9 @@ Bool etnaviv_accel_init(struct etnaviv *etnaviv)
/* reserve some additional batch space */
etnaviv->batch_de_high_watermark -= BATCH_WA_GC320_SIZE;
+ if (VIV_FEATURE(etnaviv->conn, chipMinorFeatures0, 2DPE20))
+ etnaviv->batch_de_high_watermark -= 4;
+
etnaviv_enable_bugfix(etnaviv, BUGFIX_SINGLE_BITBLT_DRAW_OP);
}
diff --git a/etnaviv/etnaviv_op.c b/etnaviv/etnaviv_op.c
index 6668561..4ac886f 100644
--- a/etnaviv/etnaviv_op.c
+++ b/etnaviv/etnaviv_op.c
@@ -118,12 +118,16 @@ static void etnaviv_set_source_bo(struct etnaviv *etnaviv,
{
uint32_t src_cfg = etnaviv_src_config(buf->format, src_origin_mode ==
SRC_ORIGIN_RELATIVE);
+ uint32_t rot_cfg = buf->rotate == DE_ROT_MODE_ROT90 &&
+ !VIV_FEATURE(etnaviv->conn, chipMinorFeatures0, 2DPE20) ?
+ VIVS_DE_SRC_ROTATION_CONFIG_ROTATION_ENABLE :
+ VIVS_DE_SRC_ROTATION_CONFIG_ROTATION_DISABLE;
EL_START(etnaviv, 6);
EL(LOADSTATE(VIVS_DE_SRC_ADDRESS, 5));
EL_RELOC(buf->bo, 0, FALSE);
EL(VIVS_DE_SRC_STRIDE_STRIDE(buf->pitch));
- EL(VIVS_DE_SRC_ROTATION_CONFIG_ROTATION_DISABLE);
+ EL(VIVS_DE_SRC_ROTATION_CONFIG_WIDTH(buf->width) | rot_cfg);
EL(src_cfg);
EL(VIVS_DE_SRC_ORIGIN_X(buf->offset.x) |
VIVS_DE_SRC_ORIGIN_Y(buf->offset.y));
@@ -216,6 +220,23 @@ static void etnaviv_set_blend(struct etnaviv *etnaviv,
EL_END();
}
+static void etnaviv_emit_src_rotate(struct etnaviv *etnaviv,
+ const struct etnaviv_blit_buf *src)
+{
+ if (VIV_FEATURE(etnaviv->conn, chipMinorFeatures0, 2DPE20)) {
+ EL_START(etnaviv, 4);
+ EL(LOADSTATE(VIVS_DE_SRC_ROTATION_HEIGHT, 2));
+ EL(VIVS_DE_SRC_ROTATION_HEIGHT_HEIGHT(src->height));
+ EL(VIVS_DE_ROT_ANGLE_SRC(src->rotate) |
+ VIVS_DE_ROT_ANGLE_DST(DE_ROT_MODE_ROT0) |
+ (~VIVS_DE_ROT_ANGLE_SRC_MASK &
+ ~VIVS_DE_ROT_ANGLE_DST_MASK &
+ ~VIVS_DE_ROT_ANGLE_SRC__MASK &
+ ~VIVS_DE_ROT_ANGLE_DST__MASK));
+ EL_END();
+ }
+}
+
static size_t etnaviv_size_2d_draw(struct etnaviv *etnaviv, size_t n)
{
return 2 + 2 * n;
@@ -249,6 +270,7 @@ static void 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);
+ etnaviv_emit_src_rotate(etnaviv, &op->src);
}
void etnaviv_de_start(struct etnaviv *etnaviv, const struct etnaviv_de_op *op)
diff --git a/etnaviv/etnaviv_op.h b/etnaviv/etnaviv_op.h
index 7f95c29..f409902 100644
--- a/etnaviv/etnaviv_op.h
+++ b/etnaviv/etnaviv_op.h
@@ -40,25 +40,34 @@ struct etnaviv_blit_buf {
struct etna_bo *bo;
unsigned pitch;
xPoint offset;
+ unsigned short width;
+ unsigned short height;
+ unsigned rotate;
};
-#define INIT_BLIT_BUF(_fmt,_pix,_bo,_pitch,_off) \
- ((struct etnaviv_blit_buf){ \
- .format = _fmt, \
- .pixmap = _pix, \
- .bo = _bo, \
- .pitch = _pitch, \
- .offset = _off, \
+#define INIT_BLIT_BUF(_fmt,_pix,_bo,_pitch,_off,_w,_h,_r) \
+ ((struct etnaviv_blit_buf){ \
+ .format = _fmt, \
+ .pixmap = _pix, \
+ .bo = _bo, \
+ .pitch = _pitch, \
+ .offset = _off, \
+ .width = _w, \
+ .height = _h, \
+ .rotate = _r, \
})
+#define INIT_BLIT_PIX_ROT(_pix, _fmt, _off, _rot) \
+ INIT_BLIT_BUF((_fmt), (_pix), (_pix)->etna_bo, (_pix)->pitch, (_off), \
+ (_pix)->width, (_pix)->height, _rot)
#define INIT_BLIT_PIX(_pix, _fmt, _off) \
- INIT_BLIT_BUF((_fmt), (_pix), (_pix)->etna_bo, (_pix)->pitch, (_off))
+ INIT_BLIT_PIX_ROT(_pix, _fmt, _off, DE_ROT_MODE_ROT0)
#define INIT_BLIT_BO(_bo, _pitch, _fmt, _off) \
- INIT_BLIT_BUF((_fmt), NULL, (_bo), (_pitch), (_off))
+ INIT_BLIT_BUF((_fmt), NULL, (_bo), (_pitch), (_off), 0, 0, DE_ROT_MODE_ROT0)
#define INIT_BLIT_NULL \
- INIT_BLIT_BUF({ }, NULL, NULL, 0, ZERO_OFFSET)
+ INIT_BLIT_BUF({ }, NULL, NULL, 0, ZERO_OFFSET, 0, 0, DE_ROT_MODE_ROT0)
#define ZERO_OFFSET ((xPoint){ 0, 0 })