From 41c465046fd4e97cc72fde3bf9eed6b82ffff881 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Sat, 11 Jan 2014 19:32:02 +0000 Subject: PE: Depending on the number of pixel pipes we need to emit different values. Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/driver/etna_pipe.c b/src/driver/etna_pipe.c index 372b835..eced3b7 100644 --- a/src/driver/etna_pipe.c +++ b/src/driver/etna_pipe.c @@ -195,7 +195,6 @@ static void reset_context(struct pipe_context *restrict pipe) /*01404*/ EMIT_STATE(PE_DEPTH_NEAR, PE_DEPTH_NEAR); /*01408*/ EMIT_STATE(PE_DEPTH_FAR, PE_DEPTH_FAR); /*0140C*/ EMIT_STATE(PE_DEPTH_NORMALIZE, PE_DEPTH_NORMALIZE); - /*01410*/ EMIT_STATE(PE_DEPTH_ADDR, PE_DEPTH_ADDR); /*01414*/ EMIT_STATE(PE_DEPTH_STRIDE, PE_DEPTH_STRIDE); /*01418*/ EMIT_STATE(PE_STENCIL_OP, PE_STENCIL_OP); /*0141C*/ EMIT_STATE(PE_STENCIL_CONFIG, PE_STENCIL_CONFIG); @@ -203,16 +202,23 @@ static void reset_context(struct pipe_context *restrict pipe) /*01424*/ EMIT_STATE(PE_ALPHA_BLEND_COLOR, PE_ALPHA_BLEND_COLOR); /*01428*/ EMIT_STATE(PE_ALPHA_CONFIG, PE_ALPHA_CONFIG); /*0142C*/ EMIT_STATE(PE_COLOR_FORMAT, PE_COLOR_FORMAT); - /*01430*/ EMIT_STATE(PE_COLOR_ADDR, PE_COLOR_ADDR); /*01434*/ EMIT_STATE(PE_COLOR_STRIDE, PE_COLOR_STRIDE); /*01454*/ EMIT_STATE(PE_HDEPTH_CONTROL, PE_HDEPTH_CONTROL); - for(int x=0; x<8; ++x) + if (ctx->conn->chip.pixel_pipes == 1) { - /*01460*/ EMIT_STATE(PE_PIPE_COLOR_ADDR(x), PE_PIPE_COLOR_ADDR[x]); + /*01430*/ EMIT_STATE(PE_COLOR_ADDR, PE_COLOR_ADDR); + /*01410*/ EMIT_STATE(PE_DEPTH_ADDR, PE_DEPTH_ADDR); } - for(int x=0; x<8; ++x) + else { - /*01480*/ EMIT_STATE(PE_PIPE_DEPTH_ADDR(x), PE_PIPE_DEPTH_ADDR[x]); + for(int x=0; xconn->chip.pixel_pipes; ++x) + { + /*01460*/ EMIT_STATE(PE_PIPE_COLOR_ADDR(x), PE_PIPE_COLOR_ADDR[x]); + } + for(int x=0; xconn->chip.pixel_pipes; ++x) + { + /*01480*/ EMIT_STATE(PE_PIPE_DEPTH_ADDR(x), PE_PIPE_DEPTH_ADDR[x]); + } } /*014A0*/ EMIT_STATE(PE_STENCIL_CONFIG_EXT, PE_STENCIL_CONFIG_EXT); /*014A4*/ EMIT_STATE(PE_LOGIC_OP, PE_LOGIC_OP); -- cgit From 3e5bb71a47669a1f725713188c341feea1b3374e Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Sat, 18 Jan 2014 23:40:56 +0000 Subject: set correct address for PE_PIPE_COLOR_ADDR[1] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is what the binary blob does: ADDR_I: 0x38910000 allocated: 0x73000 gcvSURF_RENDER_TARGET used for: TS.COLOR_SURFACE_BASE

PE.PIPE[0].COLOR_ADDR ADDR_27:0x3894b000 used for: PE.PIPE[1].COLOR_ADDR Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/driver/etna_pipe.c b/src/driver/etna_pipe.c index eced3b7..96acf82 100644 --- a/src/driver/etna_pipe.c +++ b/src/driver/etna_pipe.c @@ -983,7 +983,7 @@ static void etna_pipe_set_framebuffer_state(struct pipe_context *pipe, else if (priv->ctx->conn->chip.pixel_pipes == 2) { cs->PE_PIPE_COLOR_ADDR[0] = etna_bo_gpu_address(bo) + cbuf->surf.offset; - cs->PE_PIPE_COLOR_ADDR[1] = etna_bo_gpu_address(bo) + cbuf->surf.offset; /* TODO */ + cs->PE_PIPE_COLOR_ADDR[1] = etna_bo_gpu_address(bo) + cbuf->surf.offset + (cbuf->surf.size / 2); } cs->PE_COLOR_STRIDE = cbuf->surf.stride; if(cbuf->surf.ts_size) -- cgit From 61980e0757156dd3290b11453729ff7e88cb9fae Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Tue, 28 Jan 2014 21:05:03 +0000 Subject: rs: make it possible to define if dest/source is multi pipe Signed-off-by: Christian Gmeiner --- src/etnaviv/etna_rs.c | 8 ++++++-- src/etnaviv/etna_rs.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/etnaviv/etna_rs.c b/src/etnaviv/etna_rs.c index a03662a..a686df7 100644 --- a/src/etnaviv/etna_rs.c +++ b/src/etnaviv/etna_rs.c @@ -69,11 +69,15 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta SET_STATE(RS_SOURCE_ADDR, rs->source_addr); SET_STATE(RS_PIPE_SOURCE_ADDR[0], rs->source_addr); SET_STATE(RS_PIPE_SOURCE_ADDR[1], rs->source_addr); /* TODO */ - SET_STATE(RS_SOURCE_STRIDE, (rs->source_stride << source_stride_shift) | ((rs->source_tiling&2)?VIVS_RS_SOURCE_STRIDE_TILING:0)); + SET_STATE(RS_SOURCE_STRIDE, (rs->source_stride << source_stride_shift) | + ((rs->source_tiling&2)?VIVS_RS_SOURCE_STRIDE_TILING:0) | + ((rs->source_multi)?VIVS_RS_SOURCE_STRIDE_MULTI:0)); SET_STATE(RS_DEST_ADDR, rs->dest_addr); SET_STATE(RS_PIPE_DEST_ADDR[0], rs->dest_addr); SET_STATE(RS_PIPE_DEST_ADDR[1], rs->dest_addr); /* TODO */ - SET_STATE(RS_DEST_STRIDE, (rs->dest_stride << dest_stride_shift) | ((rs->dest_tiling&2)?VIVS_RS_DEST_STRIDE_TILING:0)); + SET_STATE(RS_DEST_STRIDE, (rs->dest_stride << dest_stride_shift) | + ((rs->dest_tiling&2)?VIVS_RS_DEST_STRIDE_TILING:0) | + ((rs->dest_multi)?VIVS_RS_DEST_STRIDE_MULTI:0)); if (ctx->conn->chip.pixel_pipes == 1) { SET_STATE(RS_WINDOW_SIZE, VIVS_RS_WINDOW_SIZE_WIDTH(rs->width) | VIVS_RS_WINDOW_SIZE_HEIGHT(rs->height)); diff --git a/src/etnaviv/etna_rs.h b/src/etnaviv/etna_rs.h index b660a10..403823f 100644 --- a/src/etnaviv/etna_rs.h +++ b/src/etnaviv/etna_rs.h @@ -29,6 +29,8 @@ struct rs_state { uint8_t downsample_x:1; // Downsample in x direction uint8_t downsample_y:1; // Downsample in y direction + uint8_t source_multi:1; + uint8_t dest_multi:1; uint8_t source_format; // RS_FORMAT_XXX uint8_t source_tiling; // ETNA_LAYOUT_XXX -- cgit From 53f9e5786c00485d7bbaadedc28ca35b4f4dd9cc Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Tue, 28 Jan 2014 21:19:06 +0000 Subject: bo: print human readable type info if DEBUG is defined Signed-off-by: Christian Gmeiner --- src/etnaviv/etna_bo.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/etnaviv/etna_bo.c b/src/etnaviv/etna_bo.c index 8c6069e..655e856 100644 --- a/src/etnaviv/etna_bo.c +++ b/src/etnaviv/etna_bo.c @@ -55,6 +55,68 @@ struct etna_bo { viv_usermem_t usermem_info; }; +#ifdef DEBUG +static const char *etna_bo_surf_type(struct etna_bo *mem) +{ + const char *ret = NULL; + + switch (mem->type) { + case VIV_SURF_UNKNOWN: + ret = "VIV_SURF_UNKNOWN"; + break; + + case VIV_SURF_INDEX: + ret = "VIV_SURF_INDEX"; + break; + + case VIV_SURF_VERTEX: + ret = "VIV_SURF_VERTEX"; + break; + + case VIV_SURF_TEXTURE: + ret = "VIV_SURF_TEXTURE"; + break; + + case VIV_SURF_RENDER_TARGET: + ret = "VIV_SURF_RENDER_TARGET"; + break; + + case VIV_SURF_DEPTH: + ret = "VIV_SURF_DEPTH"; + break; + + case VIV_SURF_BITMAP: + ret = "VIV_SURF_BITMAP"; + break; + + case VIV_SURF_TILE_STATUS: + ret = "VIV_SURF_TILE_STATUS"; + break; + + case VIV_SURF_IMAGE: + ret = "VIV_SURF_IMAGE"; + break; + + case VIV_SURF_MASK: + ret = "VIV_SURF_MASK"; + break; + + case VIV_SURF_SCISSOR: + ret = "VIV_SURF_SCISSOR"; + break; + + case VIV_SURF_HIERARCHICAL_DEPTH: + ret = "VIV_SURF_HIERARCHICAL_DEPTH"; + break; + + default: + ret = "hmmmm?"; + break; + } + return ret; +} +#endif + /* Lock (map) memory into both CPU and GPU memory space. */ static int etna_bo_lock(struct viv_conn *conn, struct etna_bo *mem) { @@ -157,7 +219,7 @@ struct etna_bo* etna_bo_new(struct viv_conn *conn, size_t bytes, uint32_t flags) return NULL; } #ifdef DEBUG - printf("Allocated: mem=%p node=%08x size=%08x\n", mem, (uint32_t)mem->node, mem->size); + printf("Allocated: type:%s mem=%p node=%08x size=%08x\n", etna_bo_surf_type(mem), mem, (uint32_t)mem->node, mem->size); #endif int status = etna_bo_lock(conn, mem); if(status != ETNA_OK) -- cgit From e248c02727d658843d7ea2c8c420b2589e7f1fed Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Wed, 29 Jan 2014 10:36:18 +0100 Subject: pe: keep the state updates in order of address Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/driver/etna_pipe.c b/src/driver/etna_pipe.c index 96acf82..5d94ee6 100644 --- a/src/driver/etna_pipe.c +++ b/src/driver/etna_pipe.c @@ -195,6 +195,10 @@ static void reset_context(struct pipe_context *restrict pipe) /*01404*/ EMIT_STATE(PE_DEPTH_NEAR, PE_DEPTH_NEAR); /*01408*/ EMIT_STATE(PE_DEPTH_FAR, PE_DEPTH_FAR); /*0140C*/ EMIT_STATE(PE_DEPTH_NORMALIZE, PE_DEPTH_NORMALIZE); + if (ctx->conn->chip.pixel_pipes == 1) + { + /*01410*/ EMIT_STATE(PE_DEPTH_ADDR, PE_DEPTH_ADDR); + } /*01414*/ EMIT_STATE(PE_DEPTH_STRIDE, PE_DEPTH_STRIDE); /*01418*/ EMIT_STATE(PE_STENCIL_OP, PE_STENCIL_OP); /*0141C*/ EMIT_STATE(PE_STENCIL_CONFIG, PE_STENCIL_CONFIG); @@ -202,14 +206,13 @@ static void reset_context(struct pipe_context *restrict pipe) /*01424*/ EMIT_STATE(PE_ALPHA_BLEND_COLOR, PE_ALPHA_BLEND_COLOR); /*01428*/ EMIT_STATE(PE_ALPHA_CONFIG, PE_ALPHA_CONFIG); /*0142C*/ EMIT_STATE(PE_COLOR_FORMAT, PE_COLOR_FORMAT); - /*01434*/ EMIT_STATE(PE_COLOR_STRIDE, PE_COLOR_STRIDE); - /*01454*/ EMIT_STATE(PE_HDEPTH_CONTROL, PE_HDEPTH_CONTROL); if (ctx->conn->chip.pixel_pipes == 1) { /*01430*/ EMIT_STATE(PE_COLOR_ADDR, PE_COLOR_ADDR); - /*01410*/ EMIT_STATE(PE_DEPTH_ADDR, PE_DEPTH_ADDR); } - else + /*01434*/ EMIT_STATE(PE_COLOR_STRIDE, PE_COLOR_STRIDE); + /*01454*/ EMIT_STATE(PE_HDEPTH_CONTROL, PE_HDEPTH_CONTROL); + if (ctx->conn->chip.pixel_pipes != 1) { for(int x=0; xconn->chip.pixel_pipes; ++x) { -- cgit From b93d8f202e436a68010267a5529936fbbffb0db2 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Wed, 29 Jan 2014 19:33:44 +0000 Subject: rs: pipe addresses for second pipe depnds on STRIDE_MULTI Signed-off-by: Christian Gmeiner --- src/etnaviv/etna_rs.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/etnaviv/etna_rs.c b/src/etnaviv/etna_rs.c index a686df7..f535e5e 100644 --- a/src/etnaviv/etna_rs.c +++ b/src/etnaviv/etna_rs.c @@ -68,13 +68,11 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta ((rs->flip)?VIVS_RS_CONFIG_FLIP:0)); SET_STATE(RS_SOURCE_ADDR, rs->source_addr); SET_STATE(RS_PIPE_SOURCE_ADDR[0], rs->source_addr); - SET_STATE(RS_PIPE_SOURCE_ADDR[1], rs->source_addr); /* TODO */ SET_STATE(RS_SOURCE_STRIDE, (rs->source_stride << source_stride_shift) | ((rs->source_tiling&2)?VIVS_RS_SOURCE_STRIDE_TILING:0) | ((rs->source_multi)?VIVS_RS_SOURCE_STRIDE_MULTI:0)); SET_STATE(RS_DEST_ADDR, rs->dest_addr); SET_STATE(RS_PIPE_DEST_ADDR[0], rs->dest_addr); - SET_STATE(RS_PIPE_DEST_ADDR[1], rs->dest_addr); /* TODO */ SET_STATE(RS_DEST_STRIDE, (rs->dest_stride << dest_stride_shift) | ((rs->dest_tiling&2)?VIVS_RS_DEST_STRIDE_TILING:0) | ((rs->dest_multi)?VIVS_RS_DEST_STRIDE_MULTI:0)); @@ -84,6 +82,14 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta } else if (ctx->conn->chip.pixel_pipes == 2) { + if (rs->source_multi) + { + SET_STATE(RS_PIPE_SOURCE_ADDR[1], rs->source_addr); /* TODO */ + } + if (rs->dest_multi) + { + SET_STATE(RS_PIPE_DEST_ADDR[1], rs->dest_addr); /* TODO */ + } SET_STATE(RS_WINDOW_SIZE, VIVS_RS_WINDOW_SIZE_WIDTH(rs->width) | VIVS_RS_WINDOW_SIZE_HEIGHT(rs->height / 2)); } SET_STATE(RS_PIPE_OFFSET[0], VIVS_RS_PIPE_OFFSET_X(0) | VIVS_RS_PIPE_OFFSET_Y(0)); -- cgit From 57a08413f36d8a0711cf25d01ae0a7eafea86361 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Wed, 29 Jan 2014 20:26:08 +0000 Subject: rs: only emit pipe addresses which are really used excerpt from cmd buffer generated by binary blob: 0x08010581, /* LOAD_STATE (1) Base: 0x01604 Size: 1 Fixp: 0 */ 0x20000686, /* [01604] RS.CONFIG := SOURCE_FORMAT=A8R8G8B8,DOWNSAMPLE_X=0,DOWNSAMPLE_Y=0,SOURCE_TILED=1,DEST_FORMAT=A8R8G8B8,DEST_TILED=0,SWAP_RB=1,FLIP=0 */ 0x08010583, /* LOAD_STATE (1) Base: 0x0160C Size: 1 Fixp: 0 */ 0xc0001c00, /* [0160C] RS.SOURCE_STRIDE := STRIDE=0x1c00,MULTI=1,TILING=1 */ 0x08010585, /* LOAD_STATE (1) Base: 0x01614 Size: 1 Fixp: 0 */ 0x00000700, /* [01614] RS.DEST_STRIDE := STRIDE=0x700,MULTI=0,TILING=0 */ 0x0802058c, /* LOAD_STATE (1) Base: 0x01630 Size: 2 Fixp: 0 */ 0xffffffff, /* [01630] RS.DITHER[0] := 0xffffffff */ 0xffffffff, /* [01634] RS.DITHER[1] := 0xffffffff */ 0x00000000, /* PAD */ 0x0801058f, /* LOAD_STATE (1) Base: 0x0163C Size: 1 Fixp: 0 */ 0x00000000, /* [0163C] RS.CLEAR_CONTROL := BITS=0x0,MODE=DISABLED */ 0x080105a8, /* LOAD_STATE (1) Base: 0x016A0 Size: 1 Fixp: 0 */ 0x00000000, /* [016A0] RS.EXTRA_CONFIG := AA=0x0,ENDIAN=NO_SWAP */ 0x080205b0, /* LOAD_STATE (1) Base: 0x016C0 Size: 2 Fixp: 0 */ 0x38910000, /* [016C0] RS.PIPE[0].SOURCE_ADDR := ADDR_I */ 0x3894b000, /* [016C4] RS.PIPE[1].SOURCE_ADDR := ADDR_27 */ 0x00000000, /* PAD */ 0x080105b8, /* LOAD_STATE (1) Base: 0x016E0 Size: 1 Fixp: 0 */ 0x38a37c00, /* [016E0] RS.PIPE[0].DEST_ADDR := ADDR_P */ 0x08010588, /* LOAD_STATE (1) Base: 0x01620 Size: 1 Fixp: 0 */ Signed-off-by: Christian Gmeiner --- src/etnaviv/etna_rs.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/etnaviv/etna_rs.c b/src/etnaviv/etna_rs.c index f535e5e..dd6b1dc 100644 --- a/src/etnaviv/etna_rs.c +++ b/src/etnaviv/etna_rs.c @@ -136,21 +136,37 @@ void etna_submit_rs_state(struct etna_ctx *restrict ctx, const struct compiled_r } else if (ctx->conn->chip.pixel_pipes == 2) { - etna_reserve(ctx, 34); + etna_reserve(ctx, 34); /* worst case - both pipes multi=1 */ /*0 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_CONFIG>>2, 1, 0); /*1 */ ETNA_EMIT(ctx, cs->RS_CONFIG); /*2 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_SOURCE_STRIDE>>2, 1, 0); /*3 */ ETNA_EMIT(ctx, cs->RS_SOURCE_STRIDE); /*4 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_DEST_STRIDE>>2, 1, 0); /*5 */ ETNA_EMIT(ctx, cs->RS_DEST_STRIDE); - /*6 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_SOURCE_ADDR(0)>>2, 2, 0); - /*7 */ ETNA_EMIT(ctx, cs->RS_PIPE_SOURCE_ADDR[0]); - /*8 */ ETNA_EMIT(ctx, cs->RS_PIPE_SOURCE_ADDR[1]); - /*9 */ ETNA_EMIT(ctx, 0x00000000); /* pad */ - /*10*/ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_DEST_ADDR(0)>>2, 2, 0); - /*11*/ ETNA_EMIT(ctx, cs->RS_PIPE_DEST_ADDR[0]); - /*12*/ ETNA_EMIT(ctx, cs->RS_PIPE_DEST_ADDR[1]); - /*13*/ ETNA_EMIT(ctx, 0x00000000); /* pad */ + if (cs->RS_SOURCE_STRIDE & VIVS_RS_SOURCE_STRIDE_MULTI) + { + /*6 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_SOURCE_ADDR(0)>>2, 2, 0); + /*7 */ ETNA_EMIT(ctx, cs->RS_PIPE_SOURCE_ADDR[0]); + /*8 */ ETNA_EMIT(ctx, cs->RS_PIPE_SOURCE_ADDR[1]); + /*9 */ ETNA_EMIT(ctx, 0x00000000); /* pad */ + } + else + { + /*6 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_SOURCE_ADDR(0)>>2, 1, 0); + /*7 */ ETNA_EMIT(ctx, cs->RS_PIPE_SOURCE_ADDR[0]); + } + if (cs->RS_DEST_STRIDE & VIVS_RS_DEST_STRIDE_MULTI) + { + /*10*/ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_DEST_ADDR(0)>>2, 2, 0); + /*11*/ ETNA_EMIT(ctx, cs->RS_PIPE_DEST_ADDR[0]); + /*12*/ ETNA_EMIT(ctx, cs->RS_PIPE_DEST_ADDR[1]); + /*13*/ ETNA_EMIT(ctx, 0x00000000); /* pad */ + } + else + { + /*10 */ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_DEST_ADDR(0)>>2, 1, 0); + /*11 */ ETNA_EMIT(ctx, cs->RS_PIPE_DEST_ADDR[0]); + } /*14*/ ETNA_EMIT_LOAD_STATE(ctx, VIVS_RS_PIPE_OFFSET(0)>>2, 2, 0); /*15*/ ETNA_EMIT(ctx, cs->RS_PIPE_OFFSET[0]); /*16*/ ETNA_EMIT(ctx, cs->RS_PIPE_OFFSET[1]); -- cgit From 0e9a253c56fd04e39c141ed58c99d65465f16298 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Sat, 1 Feb 2014 09:14:19 +0000 Subject: rs: make use of xxx_tiling to determine multi pipe usage We can detect via source and dest tiling if we need to use multi pipes. So we can get rid of the extra tow mutli variables in rs_state. Signed-off-by: Christian Gmeiner --- src/etnaviv/etna_rs.c | 13 +++++++++---- src/etnaviv/etna_rs.h | 2 -- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/etnaviv/etna_rs.c b/src/etnaviv/etna_rs.c index dd6b1dc..8716992 100644 --- a/src/etnaviv/etna_rs.c +++ b/src/etnaviv/etna_rs.c @@ -57,6 +57,11 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta /* TILED and SUPERTILED layout have their strides multiplied with 4 in RS */ unsigned source_stride_shift = (rs->source_tiling != ETNA_LAYOUT_LINEAR) ? 2 : 0; unsigned dest_stride_shift = (rs->dest_tiling != ETNA_LAYOUT_LINEAR) ? 2 : 0; + + /* tiling == ETNA_LAYOUT_MULTI_TILED or ETNA_LAYOUT_MULTI_SUPERTILED? */ + bool source_multi = (rs->source_tiling & 0x4)?true:false; + bool dest_multi = (rs->dest_tiling & 0x4)?true:false; + /* TODO could just pre-generate command buffer, would simply submit to one memcpy */ SET_STATE(RS_CONFIG, VIVS_RS_CONFIG_SOURCE_FORMAT(rs->source_format) | (rs->downsample_x?VIVS_RS_CONFIG_DOWNSAMPLE_X:0) | @@ -70,23 +75,23 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta SET_STATE(RS_PIPE_SOURCE_ADDR[0], rs->source_addr); SET_STATE(RS_SOURCE_STRIDE, (rs->source_stride << source_stride_shift) | ((rs->source_tiling&2)?VIVS_RS_SOURCE_STRIDE_TILING:0) | - ((rs->source_multi)?VIVS_RS_SOURCE_STRIDE_MULTI:0)); + ((source_multi)?VIVS_RS_SOURCE_STRIDE_MULTI:0)); SET_STATE(RS_DEST_ADDR, rs->dest_addr); SET_STATE(RS_PIPE_DEST_ADDR[0], rs->dest_addr); SET_STATE(RS_DEST_STRIDE, (rs->dest_stride << dest_stride_shift) | ((rs->dest_tiling&2)?VIVS_RS_DEST_STRIDE_TILING:0) | - ((rs->dest_multi)?VIVS_RS_DEST_STRIDE_MULTI:0)); + ((dest_multi)?VIVS_RS_DEST_STRIDE_MULTI:0)); if (ctx->conn->chip.pixel_pipes == 1) { SET_STATE(RS_WINDOW_SIZE, VIVS_RS_WINDOW_SIZE_WIDTH(rs->width) | VIVS_RS_WINDOW_SIZE_HEIGHT(rs->height)); } else if (ctx->conn->chip.pixel_pipes == 2) { - if (rs->source_multi) + if (source_multi) { SET_STATE(RS_PIPE_SOURCE_ADDR[1], rs->source_addr); /* TODO */ } - if (rs->dest_multi) + if (dest_multi) { SET_STATE(RS_PIPE_DEST_ADDR[1], rs->dest_addr); /* TODO */ } diff --git a/src/etnaviv/etna_rs.h b/src/etnaviv/etna_rs.h index 403823f..b660a10 100644 --- a/src/etnaviv/etna_rs.h +++ b/src/etnaviv/etna_rs.h @@ -29,8 +29,6 @@ struct rs_state { uint8_t downsample_x:1; // Downsample in x direction uint8_t downsample_y:1; // Downsample in y direction - uint8_t source_multi:1; - uint8_t dest_multi:1; uint8_t source_format; // RS_FORMAT_XXX uint8_t source_tiling; // ETNA_LAYOUT_XXX -- cgit From fb3ca6cdaa2e66742ed2a0741c362b9a90ab0df5 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Sat, 1 Feb 2014 09:21:03 +0000 Subject: driver: add support for multi tiled formats Signed-off-by: Christian Gmeiner --- src/driver/etna_resource.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/driver/etna_resource.c b/src/driver/etna_resource.c index 4782804..31c15d3 100644 --- a/src/driver/etna_resource.c +++ b/src/driver/etna_resource.c @@ -146,7 +146,15 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc else layout = ETNA_LAYOUT_TILED; } - /* XXX multi tiled formats */ + + /* multi tiled formats */ + if (priv->dev->chip.pixel_pipes > 1) + { + if (layout == ETNA_LAYOUT_TILED) + layout = ETNA_LAYOUT_MULTI_TILED; + if (layout == ETNA_LAYOUT_SUPER_TILED) + layout = ETNA_LAYOUT_MULTI_SUPERTILED; + } /* Determine scaling for antialiasing, allow override using debug flag */ int nr_samples = templat->nr_samples; -- cgit From 568d290514b6e61428bb73281ac596b0404c8f70 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Sat, 1 Feb 2014 09:31:00 +0000 Subject: rs: add some debug output Signed-off-by: Christian Gmeiner --- src/etnaviv/etna_rs.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/etnaviv/etna_rs.c b/src/etnaviv/etna_rs.c index 8716992..2be0853 100644 --- a/src/etnaviv/etna_rs.c +++ b/src/etnaviv/etna_rs.c @@ -26,6 +26,11 @@ #include #include +//#define DEBUG +#ifdef DEBUG +# include +#endif + /* Some kind of RS flush, used in the older drivers */ void etna_warm_up_rs(struct etna_ctx *cmdbuf, viv_addr_t aux_rt_physical, viv_addr_t aux_rt_ts_physical) { @@ -107,6 +112,18 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta SET_STATE(RS_FILL_VALUE[2], rs->clear_value[2]); SET_STATE(RS_FILL_VALUE[3], rs->clear_value[3]); SET_STATE(RS_EXTRA_CONFIG, VIVS_RS_EXTRA_CONFIG_AA(rs->aa) | VIVS_RS_EXTRA_CONFIG_ENDIAN(rs->endian_mode)); + +#ifdef DEBUG + printf("cs->dest_addr1: 0x%08x\n", cs->RS_PIPE_DEST_ADDR[0]); + printf("cs->dest_addr2: 0x%08x\n", cs->RS_PIPE_DEST_ADDR[1]); + printf("cs->source_addr1 0x%08x\n", cs->RS_PIPE_SOURCE_ADDR[0]); + printf("cs->source_addr2: 0x%08x\n", cs->RS_PIPE_SOURCE_ADDR[1]); + printf("rs->dest_tiling: 0x%08x\n", rs->dest_tiling); + printf("rs->source_tiling: 0x%08x\n", rs->source_tiling); + printf("cs->dest_stride: 0x%08x\n", cs->RS_DEST_STRIDE); + printf("cs->source_stride: 0x%08x\n", cs->RS_SOURCE_STRIDE); + printf("\n"); +#endif } /* submit RS state, without any processing and no dependence on context -- cgit From abfcb445b9246e658b64ba43abc6eb618971a546 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 6 Feb 2014 18:10:36 +0000 Subject: rs: change struct rs_state to contain all pipe addresses Signed-off-by: Christian Gmeiner --- src/driver/etna_screen.c | 4 ++-- src/driver/etna_surface.c | 2 +- src/etnaviv/etna_rs.c | 12 ++++++------ src/etnaviv/etna_rs.h | 4 ++-- src/lib/fbdemos.c | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/driver/etna_screen.c b/src/driver/etna_screen.c index f381c7d..98e8f5a 100644 --- a/src/driver/etna_screen.c +++ b/src/driver/etna_screen.c @@ -474,11 +474,11 @@ static void etna_screen_flush_frontbuffer( struct pipe_screen *screen, etna_compile_rs_state(ctx, ©_to_screen, &(struct rs_state){ .source_format = translate_rt_format(rt_resource->base.format, false), .source_tiling = rt_resource->layout, - .source_addr = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset, + .source_addr[0] = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset, .source_stride = rt_resource->levels[level].stride, .dest_format = drawable->rs_format, .dest_tiling = ETNA_LAYOUT_LINEAR, - .dest_addr = etna_bo_gpu_address(drawable->bo), + .dest_addr[0] = etna_bo_gpu_address(drawable->bo), .dest_stride = drawable->stride, .downsample_x = msaa_xscale > 1, .downsample_y = msaa_yscale > 1, diff --git a/src/driver/etna_surface.c b/src/driver/etna_surface.c index 2442758..81ff249 100644 --- a/src/driver/etna_surface.c +++ b/src/driver/etna_surface.c @@ -92,7 +92,7 @@ static struct pipe_surface *etna_pipe_create_surface(struct pipe_context *pipe, etna_compile_rs_state(priv->ctx, &surf->clear_command, &(struct rs_state){ .source_format = RS_FORMAT_A8R8G8B8, .dest_format = RS_FORMAT_A8R8G8B8, - .dest_addr = etna_bo_gpu_address(ts_bo) + surf->surf.ts_offset, + .dest_addr[0] = etna_bo_gpu_address(ts_bo) + surf->surf.ts_offset, .dest_stride = 0x40, .dest_tiling = ETNA_LAYOUT_TILED, .dither = {0xffffffff, 0xffffffff}, diff --git a/src/etnaviv/etna_rs.c b/src/etnaviv/etna_rs.c index 2be0853..45321a5 100644 --- a/src/etnaviv/etna_rs.c +++ b/src/etnaviv/etna_rs.c @@ -76,13 +76,13 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta ((rs->dest_tiling&1)?VIVS_RS_CONFIG_DEST_TILED:0) | ((rs->swap_rb)?VIVS_RS_CONFIG_SWAP_RB:0) | ((rs->flip)?VIVS_RS_CONFIG_FLIP:0)); - SET_STATE(RS_SOURCE_ADDR, rs->source_addr); - SET_STATE(RS_PIPE_SOURCE_ADDR[0], rs->source_addr); + SET_STATE(RS_SOURCE_ADDR, rs->source_addr[0]); + SET_STATE(RS_PIPE_SOURCE_ADDR[0], rs->source_addr[0]); SET_STATE(RS_SOURCE_STRIDE, (rs->source_stride << source_stride_shift) | ((rs->source_tiling&2)?VIVS_RS_SOURCE_STRIDE_TILING:0) | ((source_multi)?VIVS_RS_SOURCE_STRIDE_MULTI:0)); - SET_STATE(RS_DEST_ADDR, rs->dest_addr); - SET_STATE(RS_PIPE_DEST_ADDR[0], rs->dest_addr); + SET_STATE(RS_DEST_ADDR, rs->dest_addr[0]); + SET_STATE(RS_PIPE_DEST_ADDR[0], rs->dest_addr[0]); SET_STATE(RS_DEST_STRIDE, (rs->dest_stride << dest_stride_shift) | ((rs->dest_tiling&2)?VIVS_RS_DEST_STRIDE_TILING:0) | ((dest_multi)?VIVS_RS_DEST_STRIDE_MULTI:0)); @@ -94,11 +94,11 @@ void etna_compile_rs_state(struct etna_ctx *restrict ctx, struct compiled_rs_sta { if (source_multi) { - SET_STATE(RS_PIPE_SOURCE_ADDR[1], rs->source_addr); /* TODO */ + SET_STATE(RS_PIPE_SOURCE_ADDR[1], rs->source_addr[1]); } if (dest_multi) { - SET_STATE(RS_PIPE_DEST_ADDR[1], rs->dest_addr); /* TODO */ + SET_STATE(RS_PIPE_DEST_ADDR[1], rs->dest_addr[1]); } SET_STATE(RS_WINDOW_SIZE, VIVS_RS_WINDOW_SIZE_WIDTH(rs->width) | VIVS_RS_WINDOW_SIZE_HEIGHT(rs->height / 2)); } diff --git a/src/etnaviv/etna_rs.h b/src/etnaviv/etna_rs.h index b660a10..a4b26c0 100644 --- a/src/etnaviv/etna_rs.h +++ b/src/etnaviv/etna_rs.h @@ -36,9 +36,9 @@ struct rs_state uint8_t dest_format; // RS_FORMAT_XXX uint8_t swap_rb; uint8_t flip; - uint32_t source_addr; + uint32_t source_addr[2]; uint32_t source_stride; - uint32_t dest_addr; + uint32_t dest_addr[2]; uint32_t dest_stride; uint16_t width; // source width uint16_t height; // source height diff --git a/src/lib/fbdemos.c b/src/lib/fbdemos.c index 3d3d55b..e619cc9 100644 --- a/src/lib/fbdemos.c +++ b/src/lib/fbdemos.c @@ -292,7 +292,7 @@ int etna_fb_bind_resource(struct fbdemos_scaffold *fbs, struct pipe_resource *rt etna_compile_rs_state(fbs->ctx, &fb->copy_to_screen[bi], &(struct rs_state){ .source_format = translate_rt_format(rt_resource->base.format, false), .source_tiling = rt_resource->layout, - .source_addr = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[0].offset, + .source_addr[0] = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[0].offset, .source_stride = rt_resource->levels[0].stride, .dest_format = fb->rs_format, .dest_tiling = ETNA_LAYOUT_LINEAR, -- cgit From 34ebe5c57c1677e7394c0f747af43b941e6c6281 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 6 Feb 2014 18:23:32 +0000 Subject: driver: store calculated pipe addresses in struct etna_resource Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.h | 2 ++ src/driver/etna_resource.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/driver/etna_pipe.h b/src/driver/etna_pipe.h index 54a113a..c9d59b1 100644 --- a/src/driver/etna_pipe.h +++ b/src/driver/etna_pipe.h @@ -87,6 +87,8 @@ struct etna_resource struct etna_resource_level levels[ETNA_NUM_LOD]; struct etna_pipe_context *last_ctx; /* Last bound context */ + + uint32_t pipe_addr[2]; }; struct etna_surface diff --git a/src/driver/etna_resource.c b/src/driver/etna_resource.c index 31c15d3..4389a2f 100644 --- a/src/driver/etna_resource.c +++ b/src/driver/etna_resource.c @@ -245,6 +245,10 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc resource->ts_bo = 0; /* TS is only created when first bound to surface */ pipe_reference_init(&resource->base.reference, 1); + /* calculate pipe addresses */ + resource->pipe_addr[0] = etna_bo_gpu_address(resource->bo) + resource->levels[0].offset; + resource->pipe_addr[1] = etna_bo_gpu_address(resource->bo) + resource->levels[0].offset + (resource->levels[0].size / 2); + if(DBG_ENABLED(ETNA_DBG_ZERO)) { void *map = etna_bo_map(bo); -- cgit From a7845b56a927a6cfe2432134c161633b4248973f Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 6 Feb 2014 18:35:16 +0000 Subject: driver: make use of calculated addresses Signed-off-by: Christian Gmeiner --- src/driver/etna_screen.c | 3 ++- src/lib/fbdemos.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/driver/etna_screen.c b/src/driver/etna_screen.c index 98e8f5a..e86025e 100644 --- a/src/driver/etna_screen.c +++ b/src/driver/etna_screen.c @@ -474,7 +474,8 @@ static void etna_screen_flush_frontbuffer( struct pipe_screen *screen, etna_compile_rs_state(ctx, ©_to_screen, &(struct rs_state){ .source_format = translate_rt_format(rt_resource->base.format, false), .source_tiling = rt_resource->layout, - .source_addr[0] = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset, + .source_addr[0] = rt_resource->pipe_addr[0], + .source_addr[1] = rt_resource->pipe_addr[1], .source_stride = rt_resource->levels[level].stride, .dest_format = drawable->rs_format, .dest_tiling = ETNA_LAYOUT_LINEAR, diff --git a/src/lib/fbdemos.c b/src/lib/fbdemos.c index e619cc9..c8a9128 100644 --- a/src/lib/fbdemos.c +++ b/src/lib/fbdemos.c @@ -292,7 +292,8 @@ int etna_fb_bind_resource(struct fbdemos_scaffold *fbs, struct pipe_resource *rt etna_compile_rs_state(fbs->ctx, &fb->copy_to_screen[bi], &(struct rs_state){ .source_format = translate_rt_format(rt_resource->base.format, false), .source_tiling = rt_resource->layout, - .source_addr[0] = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[0].offset, + .source_addr[0] = rt_resource->pipe_addr[0], + .source_addr[1] = rt_resource->pipe_addr[1], .source_stride = rt_resource->levels[0].stride, .dest_format = fb->rs_format, .dest_tiling = ETNA_LAYOUT_LINEAR, -- cgit From c0ad08414527ae370c2832813d25de97e012d116 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 6 Feb 2014 18:37:17 +0000 Subject: pe: make us of calculated addresses With this commit the PE pipe addresses and the RS pipe addresses are the same --> on a GC2000 the image is combined correctly. Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/driver/etna_pipe.c b/src/driver/etna_pipe.c index 5d94ee6..54b4632 100644 --- a/src/driver/etna_pipe.c +++ b/src/driver/etna_pipe.c @@ -978,15 +978,15 @@ static void etna_pipe_set_framebuffer_state(struct pipe_context *pipe, cbuf->surf.offset, cbuf->surf.stride*4); } - struct etna_bo *bo = etna_resource(cbuf->base.texture)->bo; + struct etna_resource *res = etna_resource(cbuf->base.texture); if (priv->ctx->conn->chip.pixel_pipes == 1) { - cs->PE_COLOR_ADDR = etna_bo_gpu_address(bo) + cbuf->surf.offset; + cs->PE_COLOR_ADDR = res->pipe_addr[0]; } else if (priv->ctx->conn->chip.pixel_pipes == 2) { - cs->PE_PIPE_COLOR_ADDR[0] = etna_bo_gpu_address(bo) + cbuf->surf.offset; - cs->PE_PIPE_COLOR_ADDR[1] = etna_bo_gpu_address(bo) + cbuf->surf.offset + (cbuf->surf.size / 2); + cs->PE_PIPE_COLOR_ADDR[0] = res->pipe_addr[0]; + cs->PE_PIPE_COLOR_ADDR[1] = res->pipe_addr[1]; } cs->PE_COLOR_STRIDE = cbuf->surf.stride; if(cbuf->surf.ts_size) -- cgit From fc1807c4ee2527eb3af0ca96fa24862288c72c46 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 6 Feb 2014 18:39:51 +0000 Subject: driver: use calulated address for TS_COLOR_SURFACE_BASE Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/driver/etna_pipe.c b/src/driver/etna_pipe.c index 54b4632..82eb610 100644 --- a/src/driver/etna_pipe.c +++ b/src/driver/etna_pipe.c @@ -995,7 +995,7 @@ static void etna_pipe_set_framebuffer_state(struct pipe_context *pipe, ts_mem_config |= VIVS_TS_MEM_CONFIG_COLOR_FAST_CLEAR; cs->TS_COLOR_CLEAR_VALUE = cbuf->level->clear_value; cs->TS_COLOR_STATUS_BASE = etna_bo_gpu_address(ts_bo) + cbuf->surf.ts_offset; - cs->TS_COLOR_SURFACE_BASE = etna_bo_gpu_address(bo) + cbuf->surf.offset; + cs->TS_COLOR_SURFACE_BASE = res->pipe_addr[0]; } /* MSAA */ if(cbuf->base.texture->nr_samples > 1) -- cgit From cb9f312272973aeb4ba3d62056fe3c56099f5d8e Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Fri, 7 Feb 2014 12:43:20 +0000 Subject: driver: make use of calculated addresses for PE/TS DEPTH_ADDR Signed-off-by: Christian Gmeiner --- src/driver/etna_pipe.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/driver/etna_pipe.c b/src/driver/etna_pipe.c index 82eb610..216b86f 100644 --- a/src/driver/etna_pipe.c +++ b/src/driver/etna_pipe.c @@ -1020,15 +1020,15 @@ static void etna_pipe_set_framebuffer_state(struct pipe_context *pipe, VIVS_PE_DEPTH_CONFIG_DEPTH_MODE_Z; /* VIVS_PE_DEPTH_CONFIG_ONLY_DEPTH */ /* merged with depth_stencil_alpha */ - struct etna_bo *bo = etna_resource(zsbuf->base.texture)->bo; + struct etna_resource *res = etna_resource(zsbuf->base.texture); if (priv->ctx->conn->chip.pixel_pipes == 1) { - cs->PE_DEPTH_ADDR = etna_bo_gpu_address(bo) + zsbuf->surf.offset; + cs->PE_DEPTH_ADDR = res->pipe_addr[0]; } else if (priv->ctx->conn->chip.pixel_pipes == 2) { - cs->PE_PIPE_DEPTH_ADDR[0] = etna_bo_gpu_address(bo) + zsbuf->surf.offset; - cs->PE_PIPE_DEPTH_ADDR[1] = etna_bo_gpu_address(bo) + zsbuf->surf.offset; /* TODO */ + cs->PE_PIPE_DEPTH_ADDR[0] = res->pipe_addr[0]; + cs->PE_PIPE_DEPTH_ADDR[1] = res->pipe_addr[1]; } cs->PE_DEPTH_STRIDE = zsbuf->surf.stride; cs->PE_HDEPTH_CONTROL = VIVS_PE_HDEPTH_CONTROL_FORMAT_DISABLED; @@ -1039,7 +1039,7 @@ static void etna_pipe_set_framebuffer_state(struct pipe_context *pipe, ts_mem_config |= VIVS_TS_MEM_CONFIG_DEPTH_FAST_CLEAR; cs->TS_DEPTH_CLEAR_VALUE = zsbuf->level->clear_value; cs->TS_DEPTH_STATUS_BASE = etna_bo_gpu_address(ts_bo) + zsbuf->surf.ts_offset; - cs->TS_DEPTH_SURFACE_BASE = etna_bo_gpu_address(bo) + zsbuf->surf.offset; + cs->TS_DEPTH_SURFACE_BASE = res->pipe_addr[0]; } ts_mem_config |= (depth_bits == 16 ? VIVS_TS_MEM_CONFIG_DEPTH_16BPP : 0); /* MSAA */ -- cgit