diff options
author | Russell King <rmk@arm.linux.org.uk> | 2015-12-02 11:51:26 +0000 |
---|---|---|
committer | Russell King <rmk@arm.linux.org.uk> | 2015-12-02 12:38:36 +0000 |
commit | 0a88716af901c5e4137dfa89e50ece12e1e5ae28 (patch) | |
tree | d88e21b5dfb0c905594c39043bf72295f842480e | |
parent | ae1e60b2186cc509bb367e0cd0409ff011508629 (diff) |
etnaviv: more efficient state buffer building
Analysis shows that we can gain some additional performance by building
the GPU state buffer more efficiently - most of the overhead comes from
the assert() calls on each emission to the state buffer. Avoid this by
pre-checking and post-checking the state size, and doing as few of
these checks as possible.
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
-rw-r--r-- | etnaviv/etnaviv_op.c | 355 |
1 files changed, 178 insertions, 177 deletions
diff --git a/etnaviv/etnaviv_op.c b/etnaviv/etnaviv_op.c index 5612c23..0d6931f 100644 --- a/etnaviv/etnaviv_op.c +++ b/etnaviv/etnaviv_op.c @@ -44,57 +44,42 @@ __et->reloc_size = __et->reloc_setup_size; \ } while (0) -#define EMIT(etp, val) \ +#define EL_START(etp, max_sz) \ do { \ struct etnaviv *_et = etp; \ - assert(_et->batch_size < MAX_BATCH_SIZE); \ - _et->batch[_et->batch_size++] = val; \ + unsigned int _batch_size = _et->batch_size; \ + unsigned int _batch_max = _batch_size + 4 * max_sz; \ + uint32_t *_batch = &_et->batch[_batch_size]; \ + assert(_batch_max <= MAX_BATCH_SIZE) + +#define EL_END() \ + _batch_size = _batch - _et->batch; \ + _batch_size += _batch_size & 1; \ + assert(_batch_size <= _batch_max); \ + _et->batch_size = _batch_size; \ } while (0) -#define EMIT_RELOC(etp, _bo, _off, _wr) \ - do { \ - struct etnaviv *__et = etp; \ - etnaviv_add_reloc(__et, _bo, _wr, __et->batch_size); \ - EMIT(__et, _off); \ - } while (0) +#define EL_ALIGN() _batch += (_batch - _et->batch) & 1 +#define EL_SKIP() _batch++ +#define EL(val) *_batch++ = val -#define EMIT_LOADSTATE(etp, st, num) \ +#define EL_RELOC(_bo, _off, _wr) \ do { \ - struct etnaviv *__et = etp; \ - assert(!(__et->batch_size & 1)); \ - EMIT(__et, LOADSTATE(st, num)); \ + etnaviv_add_reloc(_et, _bo, _wr, _batch - _et->batch); \ + EL(_off); \ } while (0) -#define EMIT_DRAW_2D(etp, count) \ +#define EL_NOP() \ do { \ - struct etnaviv *__et = etp; \ - assert(!(__et->batch_size & 1)); \ - EMIT(__et, DRAW2D(count)); \ - /* next word is unused */ \ - __et->batch_size ++; \ - } while (0) - -#define EMIT_STALL(etp, from, to) \ - do { \ - struct etnaviv *__et = etp; \ - assert(!(__et->batch_size & 1)); \ - EMIT(__et, VIV_FE_STALL_HEADER_OP_STALL); \ - EMIT(__et, VIV_FE_STALL_TOKEN_FROM(from) | \ - VIV_FE_STALL_TOKEN_TO(to)); \ - } while (0) - -#define EMIT_NOP(etp) \ - do { \ - struct etnaviv *__et = etp; \ - assert(!(__et->batch_size & 1)); \ - EMIT(__et, VIV_FE_NOP_HEADER_OP_NOP); \ - EMIT(__et, 0); \ + EL(VIV_FE_NOP_HEADER_OP_NOP); \ + EL_SKIP(); \ } while (0) -#define EMIT_ALIGN(etp) \ +#define EL_STALL(_from, _to) \ do { \ - struct etnaviv *__et = etp; \ - __et->batch_size += __et->batch_size & 1; \ + EL(VIV_FE_STALL_HEADER_OP_STALL); \ + EL(VIV_FE_STALL_TOKEN_FROM(_from) | \ + VIV_FE_STALL_TOKEN_TO(_to)); \ } while (0) static void etnaviv_add_reloc(struct etnaviv *etnaviv, struct etna_bo *bo, @@ -134,14 +119,15 @@ static void etnaviv_set_source_bo(struct etnaviv *etnaviv, uint32_t src_cfg = etnaviv_src_config(buf->format, src_origin_mode == SRC_ORIGIN_RELATIVE); - EMIT_LOADSTATE(etnaviv, VIVS_DE_SRC_ADDRESS, 5); - EMIT_RELOC(etnaviv, buf->bo, 0, FALSE); - EMIT(etnaviv, VIVS_DE_SRC_STRIDE_STRIDE(buf->pitch)); - EMIT(etnaviv, VIVS_DE_SRC_ROTATION_CONFIG_ROTATION_DISABLE); - EMIT(etnaviv, src_cfg); - EMIT(etnaviv, VIVS_DE_SRC_ORIGIN_X(buf->offset.x) | - VIVS_DE_SRC_ORIGIN_Y(buf->offset.y)); - EMIT_ALIGN(etnaviv); + 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(src_cfg); + EL(VIVS_DE_SRC_ORIGIN_X(buf->offset.x) | + VIVS_DE_SRC_ORIGIN_Y(buf->offset.y)); + EL_END(); } static void etnaviv_set_dest_bo(struct etnaviv *etnaviv, @@ -155,71 +141,79 @@ static void etnaviv_set_dest_bo(struct etnaviv *etnaviv, if (buf->format.tile) dst_cfg |= VIVS_DE_DEST_CONFIG_TILED_ENABLE; - EMIT_LOADSTATE(etnaviv, VIVS_DE_DEST_ADDRESS, 4); - EMIT_RELOC(etnaviv, buf->bo, 0, TRUE); - EMIT(etnaviv, VIVS_DE_DEST_STRIDE_STRIDE(buf->pitch)); - EMIT(etnaviv, VIVS_DE_DEST_ROTATION_CONFIG_ROTATION_DISABLE); - EMIT(etnaviv, dst_cfg); - EMIT_ALIGN(etnaviv); + EL_START(etnaviv, 6); + EL(LOADSTATE(VIVS_DE_DEST_ADDRESS, 4)); + EL_RELOC(buf->bo, 0, TRUE); + EL(VIVS_DE_DEST_STRIDE_STRIDE(buf->pitch)); + EL(VIVS_DE_DEST_ROTATION_CONFIG_ROTATION_DISABLE); + EL(dst_cfg); + EL_END(); } static void etnaviv_emit_rop_clip(struct etnaviv *etnaviv, unsigned fg_rop, unsigned bg_rop, const BoxRec *clip, xPoint offset) { - EMIT_LOADSTATE(etnaviv, VIVS_DE_ROP, clip ? 3 : 1); - EMIT(etnaviv, VIVS_DE_ROP_ROP_FG(fg_rop) | - VIVS_DE_ROP_ROP_BG(bg_rop) | - VIVS_DE_ROP_TYPE_ROP4); + EL_START(etnaviv, 4); + EL(LOADSTATE(VIVS_DE_ROP, clip ? 3 : 1)); + EL(VIVS_DE_ROP_ROP_FG(fg_rop) | + VIVS_DE_ROP_ROP_BG(bg_rop) | + VIVS_DE_ROP_TYPE_ROP4); if (clip) { - EMIT(etnaviv, - VIVS_DE_CLIP_TOP_LEFT_X(clip->x1 + offset.x) | - VIVS_DE_CLIP_TOP_LEFT_Y(clip->y1 + offset.y)); - EMIT(etnaviv, - VIVS_DE_CLIP_BOTTOM_RIGHT_X(clip->x2 + offset.x) | - VIVS_DE_CLIP_BOTTOM_RIGHT_Y(clip->y2 + offset.y)); + EL(VIVS_DE_CLIP_TOP_LEFT_X(clip->x1 + offset.x) | + VIVS_DE_CLIP_TOP_LEFT_Y(clip->y1 + offset.y)); + EL(VIVS_DE_CLIP_BOTTOM_RIGHT_X(clip->x2 + offset.x) | + VIVS_DE_CLIP_BOTTOM_RIGHT_Y(clip->y2 + offset.y)); } + EL_END(); } static void etnaviv_emit_brush(struct etnaviv *etnaviv, uint32_t fg) { - EMIT_LOADSTATE(etnaviv, VIVS_DE_PATTERN_MASK_LOW, 4); - EMIT(etnaviv, ~0); - EMIT(etnaviv, ~0); - EMIT(etnaviv, 0); - EMIT(etnaviv, fg); - EMIT_ALIGN(etnaviv); - EMIT_LOADSTATE(etnaviv, VIVS_DE_PATTERN_CONFIG, 1); - EMIT(etnaviv, VIVS_DE_PATTERN_CONFIG_INIT_TRIGGER(3)); + EL_START(etnaviv, 8); + EL(LOADSTATE(VIVS_DE_PATTERN_MASK_LOW, 4)); + EL(~0); + EL(~0); + EL(0); + EL(fg); + EL_ALIGN(); + EL(LOADSTATE(VIVS_DE_PATTERN_CONFIG, 1)); + EL(VIVS_DE_PATTERN_CONFIG_INIT_TRIGGER(3)); + EL_END(); } static void etnaviv_set_blend(struct etnaviv *etnaviv, const struct etnaviv_blend_op *op) { + EL_START(etnaviv, 8); if (!op) { - EMIT_LOADSTATE(etnaviv, VIVS_DE_ALPHA_CONTROL, 1); - EMIT(etnaviv, VIVS_DE_ALPHA_CONTROL_ENABLE_OFF); + EL(LOADSTATE(VIVS_DE_ALPHA_CONTROL, 1)); + EL(VIVS_DE_ALPHA_CONTROL_ENABLE_OFF); } else { Bool pe20 = VIV_FEATURE(etnaviv->conn, chipMinorFeatures0, 2DPE20); - EMIT_LOADSTATE(etnaviv, VIVS_DE_ALPHA_CONTROL, 2); - EMIT(etnaviv, - VIVS_DE_ALPHA_CONTROL_ENABLE_ON | - VIVS_DE_ALPHA_CONTROL_PE10_GLOBAL_SRC_ALPHA(op->src_alpha) | - VIVS_DE_ALPHA_CONTROL_PE10_GLOBAL_DST_ALPHA(op->dst_alpha)); - EMIT(etnaviv, op->alpha_mode); - EMIT_ALIGN(etnaviv); + EL(LOADSTATE(VIVS_DE_ALPHA_CONTROL, 2)); + EL(VIVS_DE_ALPHA_CONTROL_ENABLE_ON | + VIVS_DE_ALPHA_CONTROL_PE10_GLOBAL_SRC_ALPHA(op->src_alpha) | + VIVS_DE_ALPHA_CONTROL_PE10_GLOBAL_DST_ALPHA(op->dst_alpha)); + EL(op->alpha_mode); + EL_ALIGN(); if (pe20) { - EMIT_LOADSTATE(etnaviv, VIVS_DE_GLOBAL_SRC_COLOR, 3); - EMIT(etnaviv, op->src_alpha << 24); - EMIT(etnaviv, op->dst_alpha << 24); - EMIT(etnaviv, - VIVS_DE_COLOR_MULTIPLY_MODES_SRC_PREMULTIPLY_DISABLE | - VIVS_DE_COLOR_MULTIPLY_MODES_DST_PREMULTIPLY_DISABLE | - VIVS_DE_COLOR_MULTIPLY_MODES_SRC_GLOBAL_PREMULTIPLY_DISABLE | - VIVS_DE_COLOR_MULTIPLY_MODES_DST_DEMULTIPLY_DISABLE); + EL(LOADSTATE(VIVS_DE_GLOBAL_SRC_COLOR, 3)); + EL(op->src_alpha << 24); + EL(op->dst_alpha << 24); + EL(VIVS_DE_COLOR_MULTIPLY_MODES_SRC_PREMULTIPLY_DISABLE | + VIVS_DE_COLOR_MULTIPLY_MODES_DST_PREMULTIPLY_DISABLE | + VIVS_DE_COLOR_MULTIPLY_MODES_SRC_GLOBAL_PREMULTIPLY_DISABLE | + VIVS_DE_COLOR_MULTIPLY_MODES_DST_DEMULTIPLY_DISABLE); } } + EL_END(); +} + +static size_t etnaviv_size_2d_draw(struct etnaviv *etnaviv, size_t n) +{ + return 2 + 2 * n; } static void etnaviv_emit_2d_draw(struct etnaviv *etnaviv, const BoxRec *pbox, @@ -227,21 +221,17 @@ static void etnaviv_emit_2d_draw(struct etnaviv *etnaviv, const BoxRec *pbox, { size_t i; - EMIT_DRAW_2D(etnaviv, n == 256 ? 0 : n); + EL_START(etnaviv, etnaviv_size_2d_draw(etnaviv, n)); + EL(DRAW2D(n & 255)); + EL_SKIP(); for (i = 0; i < n; i++, pbox++) { - EMIT(etnaviv, - VIV_FE_DRAW_2D_TOP_LEFT_X(offset.x + pbox->x1) | - VIV_FE_DRAW_2D_TOP_LEFT_Y(offset.y + pbox->y1)); - EMIT(etnaviv, - VIV_FE_DRAW_2D_BOTTOM_RIGHT_X(offset.x + pbox->x2) | - VIV_FE_DRAW_2D_BOTTOM_RIGHT_Y(offset.y + pbox->y2)); + EL(VIV_FE_DRAW_2D_TOP_LEFT_X(offset.x + pbox->x1) | + VIV_FE_DRAW_2D_TOP_LEFT_Y(offset.y + pbox->y1)); + EL(VIV_FE_DRAW_2D_BOTTOM_RIGHT_X(offset.x + pbox->x2) | + VIV_FE_DRAW_2D_BOTTOM_RIGHT_Y(offset.y + pbox->y2)); } -} - -static size_t etnaviv_size_2d_draw(struct etnaviv *etnaviv, size_t n) -{ - return 2 + 2 * n; + EL_END(); } void etnaviv_de_start(struct etnaviv *etnaviv, const struct etnaviv_de_op *op) @@ -276,19 +266,21 @@ void etnaviv_de_end(struct etnaviv *etnaviv) } /* Append a flush, semaphore and stall to ensure that the FE */ - EMIT_LOADSTATE(etnaviv, VIVS_GL_FLUSH_CACHE, 1); - EMIT(etnaviv, VIVS_GL_FLUSH_CACHE_PE2D); - EMIT_LOADSTATE(etnaviv, VIVS_GL_SEMAPHORE_TOKEN, 1); - EMIT(etnaviv, VIVS_GL_SEMAPHORE_TOKEN_FROM(SYNC_RECIPIENT_FE) | - VIVS_GL_SEMAPHORE_TOKEN_TO(SYNC_RECIPIENT_PE)); - EMIT_STALL(etnaviv, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); + EL_START(etnaviv, 46); + EL(LOADSTATE(VIVS_GL_FLUSH_CACHE, 1)); + EL(VIVS_GL_FLUSH_CACHE_PE2D); + EL(LOADSTATE(VIVS_GL_SEMAPHORE_TOKEN, 1)); + EL(VIVS_GL_SEMAPHORE_TOKEN_FROM(SYNC_RECIPIENT_FE) | + VIVS_GL_SEMAPHORE_TOKEN_TO(SYNC_RECIPIENT_PE)); + EL_STALL(SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); if (etnaviv->gc320_etna_bo) { int i; for (i = 0; i < 20; i++) - EMIT_NOP(etnaviv); + EL_NOP(); } + EL_END(); etnaviv_emit(etnaviv); } @@ -305,22 +297,23 @@ void etnaviv_de_op_src_origin(struct etnaviv *etnaviv, BATCH_OP_START(etnaviv); } - EMIT_LOADSTATE(etnaviv, VIVS_DE_SRC_ORIGIN, 1); - EMIT(etnaviv, VIVS_DE_SRC_ORIGIN_X(src_origin.x) | - VIVS_DE_SRC_ORIGIN_Y(src_origin.y)); - EMIT_DRAW_2D(etnaviv, 1); - EMIT(etnaviv, - VIV_FE_DRAW_2D_TOP_LEFT_X(offset.x + dest->x1) | - VIV_FE_DRAW_2D_TOP_LEFT_Y(offset.y + dest->y1)); - EMIT(etnaviv, - VIV_FE_DRAW_2D_BOTTOM_RIGHT_X(offset.x + dest->x2) | - VIV_FE_DRAW_2D_BOTTOM_RIGHT_Y(offset.y + dest->y2)); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); + EL_START(etnaviv, 12); + EL(LOADSTATE(VIVS_DE_SRC_ORIGIN, 1)); + EL(VIVS_DE_SRC_ORIGIN_X(src_origin.x) | + VIVS_DE_SRC_ORIGIN_Y(src_origin.y)); + EL(DRAW2D(1)); + EL_SKIP(); + EL(VIV_FE_DRAW_2D_TOP_LEFT_X(offset.x + dest->x1) | + VIV_FE_DRAW_2D_TOP_LEFT_Y(offset.y + dest->y1)); + EL(VIV_FE_DRAW_2D_BOTTOM_RIGHT_X(offset.x + dest->x2) | + VIV_FE_DRAW_2D_BOTTOM_RIGHT_Y(offset.y + dest->y2)); + EL(LOADSTATE(4, 1)); + EL(0); + EL(LOADSTATE(4, 1)); + EL(0); + EL(LOADSTATE(4, 1)); + EL(0); + EL_END(); } void etnaviv_de_op(struct etnaviv *etnaviv, const struct etnaviv_de_op *op, @@ -341,15 +334,22 @@ void etnaviv_de_op(struct etnaviv *etnaviv, const struct etnaviv_de_op *op, BATCH_OP_START(etnaviv); } - etnaviv_emit_2d_draw(etnaviv, pBox++, 1, offset); - - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - } + EL_START(etnaviv, 10); + EL(DRAW2D(1)); + EL_SKIP(); + EL(VIV_FE_DRAW_2D_TOP_LEFT_X(offset.x + pBox->x1) | + VIV_FE_DRAW_2D_TOP_LEFT_Y(offset.y + pBox->y1)); + EL(VIV_FE_DRAW_2D_BOTTOM_RIGHT_X(offset.x + pBox->x2) | + VIV_FE_DRAW_2D_BOTTOM_RIGHT_Y(offset.y + pBox->y2)); + EL(LOADSTATE(4, 1)); + EL(0); + EL(LOADSTATE(4, 1)); + EL(0); + EL(LOADSTATE(4, 1)); + EL(0); + EL_END(); + pBox++; + } } else { unsigned int n; @@ -373,12 +373,14 @@ void etnaviv_de_op(struct etnaviv *etnaviv, const struct etnaviv_de_op *op, pBox += n; nBox -= n; - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); - EMIT_LOADSTATE(etnaviv, 4, 1); - EMIT(etnaviv, 0); + EL_START(etnaviv, 6); + EL(LOADSTATE(4, 1)); + EL(0); + EL(LOADSTATE(4, 1)); + EL(0); + EL(LOADSTATE(4, 1)); + EL(0); + EL_END(); } while (nBox); } } @@ -394,43 +396,44 @@ void etnaviv_vr_op(struct etnaviv *etnaviv, struct etnaviv_vr_op *op, pitch = op->src_pitches ? op->src_pitches[0] : op->src.pitch; BATCH_SETUP_START(etnaviv); - EMIT_LOADSTATE(etnaviv, VIVS_DE_SRC_ADDRESS, 4); - EMIT_RELOC(etnaviv, op->src.bo, offset, FALSE); - EMIT(etnaviv, VIVS_DE_SRC_STRIDE_STRIDE(pitch)); - EMIT(etnaviv, VIVS_DE_SRC_ROTATION_CONFIG_ROTATION_DISABLE); - EMIT(etnaviv, cfg); - EMIT_ALIGN(etnaviv); + EL_START(etnaviv, 12); + EL(LOADSTATE(VIVS_DE_SRC_ADDRESS, 4)); + EL_RELOC(op->src.bo, offset, FALSE); + EL(VIVS_DE_SRC_STRIDE_STRIDE(pitch)); + EL(VIVS_DE_SRC_ROTATION_CONFIG_ROTATION_DISABLE); + EL(cfg); + EL_ALIGN(); if (op->src.format.planes > 1) { unsigned u = op->src.format.u; unsigned v = op->src.format.v; - EMIT_LOADSTATE(etnaviv, VIVS_DE_UPLANE_ADDRESS, 4); - EMIT_RELOC(etnaviv, op->src.bo, op->src_offsets[u], FALSE); - EMIT(etnaviv, VIVS_DE_UPLANE_STRIDE_STRIDE(op->src_pitches[u])); - EMIT_RELOC(etnaviv, op->src.bo, op->src_offsets[v], FALSE); - EMIT(etnaviv, VIVS_DE_VPLANE_STRIDE_STRIDE(op->src_pitches[v])); - EMIT_ALIGN(etnaviv); + EL(LOADSTATE(VIVS_DE_UPLANE_ADDRESS, 4)); + EL_RELOC(op->src.bo, op->src_offsets[u], FALSE); + EL(VIVS_DE_UPLANE_STRIDE_STRIDE(op->src_pitches[u])); + EL_RELOC(op->src.bo, op->src_offsets[v], FALSE); + EL(VIVS_DE_VPLANE_STRIDE_STRIDE(op->src_pitches[v])); + EL_ALIGN(); } + EL_END(); etnaviv_set_dest_bo(etnaviv, &op->dst, op->cmd); - EMIT_LOADSTATE(etnaviv, VIVS_DE_ALPHA_CONTROL, 1); - EMIT(etnaviv, VIVS_DE_ALPHA_CONTROL_ENABLE_OFF); + EL_START(etnaviv, 10 * 8 * n); + EL(LOADSTATE(VIVS_DE_ALPHA_CONTROL, 1)); + EL(VIVS_DE_ALPHA_CONTROL_ENABLE_OFF); - EMIT_LOADSTATE(etnaviv, VIVS_DE_STRETCH_FACTOR_LOW, 2); - EMIT(etnaviv, op->h_scale); - EMIT(etnaviv, op->v_scale); - EMIT_ALIGN(etnaviv); + EL(LOADSTATE(VIVS_DE_STRETCH_FACTOR_LOW, 2)); + EL(op->h_scale); + EL(op->v_scale); + EL_ALIGN(); - EMIT_LOADSTATE(etnaviv, VIVS_DE_VR_SOURCE_IMAGE_LOW, 2); - EMIT(etnaviv, - VIVS_DE_VR_SOURCE_IMAGE_LOW_LEFT(op->src_bounds.x1) | - VIVS_DE_VR_SOURCE_IMAGE_LOW_TOP(op->src_bounds.y1)); - EMIT(etnaviv, - VIVS_DE_VR_SOURCE_IMAGE_HIGH_RIGHT(op->src_bounds.x2) | - VIVS_DE_VR_SOURCE_IMAGE_HIGH_BOTTOM(op->src_bounds.y2)); - EMIT_ALIGN(etnaviv); + EL(LOADSTATE(VIVS_DE_VR_SOURCE_IMAGE_LOW, 2)); + EL(VIVS_DE_VR_SOURCE_IMAGE_LOW_LEFT(op->src_bounds.x1) | + 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(); while (n--) { BoxRec box = *boxes++; @@ -446,22 +449,20 @@ void etnaviv_vr_op(struct etnaviv *etnaviv, struct etnaviv_vr_op *op, box.y2 += op->dst.offset.y; /* 6 */ - EMIT_LOADSTATE(etnaviv, VIVS_DE_VR_SOURCE_ORIGIN_LOW, 4); - EMIT(etnaviv, VIVS_DE_VR_SOURCE_ORIGIN_LOW_X(x)); - EMIT(etnaviv, VIVS_DE_VR_SOURCE_ORIGIN_HIGH_Y(y)); - - EMIT(etnaviv, - VIVS_DE_VR_TARGET_WINDOW_LOW_LEFT(box.x1) | - VIVS_DE_VR_TARGET_WINDOW_LOW_TOP(box.y1)); - EMIT(etnaviv, - VIVS_DE_VR_TARGET_WINDOW_HIGH_RIGHT(box.x2) | - VIVS_DE_VR_TARGET_WINDOW_HIGH_BOTTOM(box.y2)); - EMIT_ALIGN(etnaviv); + EL(LOADSTATE(VIVS_DE_VR_SOURCE_ORIGIN_LOW, 4)); + EL(VIVS_DE_VR_SOURCE_ORIGIN_LOW_X(x)); + EL(VIVS_DE_VR_SOURCE_ORIGIN_HIGH_Y(y)); + EL(VIVS_DE_VR_TARGET_WINDOW_LOW_LEFT(box.x1) | + VIVS_DE_VR_TARGET_WINDOW_LOW_TOP(box.y1)); + EL(VIVS_DE_VR_TARGET_WINDOW_HIGH_RIGHT(box.x2) | + VIVS_DE_VR_TARGET_WINDOW_HIGH_BOTTOM(box.y2)); + EL_ALIGN(); /* 2 */ - EMIT_LOADSTATE(etnaviv, VIVS_DE_VR_CONFIG, 1); - EMIT(etnaviv, op->vr_op); + EL(LOADSTATE(VIVS_DE_VR_CONFIG, 1)); + EL(op->vr_op); } + EL_END(); etnaviv_emit(etnaviv); } |