diff options
author | Russell King <rmk@armlinux.org.uk> | 2018-06-20 21:14:42 +0100 |
---|---|---|
committer | Russell King <rmk@armlinux.org.uk> | 2018-06-25 16:07:46 +0100 |
commit | e41e405a8e03f88c614b1b42db4aa838acf9063c (patch) | |
tree | ac6f6a392e6844aaca5b06f60efe0de9cca10807 | |
parent | efacd3e4c1ef5d5305e52503f432a069c6e4a046 (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.c | 9 | ||||
-rw-r--r-- | etnaviv/etnaviv_op.c | 24 | ||||
-rw-r--r-- | etnaviv/etnaviv_op.h | 29 |
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 }) |