Am Dienstag, den 10.10.2017, 13:57 +0200 schrieb Lucas Stach: > Am Samstag, den 30.09.2017, 10:11 +0200 schrieb Wladimir J. van der > Laan: > > If an RS blit is done with source exactly the same as destination, > > and > > the hardware supports this, do an in-place resolve. This only fills > > in > > tiles that have not been rendered to using information from the TS. > > > > This is the same as the blob does and potentially saves significant > > bandwidth when doing i.MX6qp scanout using PRE, and when rendering > > to > > textures (though here using sampler TS would be even better). > > > > Signed-off-by: Wladimir J. van der Laan <laa...@gmail.com> > > Reviewed-by: Lucas Stach <l.st...@pengutronix.de>
... and pushed into Mesa upstream. > > --- > > src/gallium/drivers/etnaviv/etnaviv_clear_blit.c | 1 + > > src/gallium/drivers/etnaviv/etnaviv_emit.c | 9 ++++++++- > > src/gallium/drivers/etnaviv/etnaviv_rs.c | 17 > > ++++++++++++++--- > > src/gallium/drivers/etnaviv/etnaviv_rs.h | 2 ++ > > 4 files changed, 25 insertions(+), 4 deletions(-) > > > > This depends (for updating the rnndb headers) on Lucas Stach's > > patch > > "etnaviv: update HW headers and fix provoking vertex". > > > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c > > b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c > > index c85ada9..c62287b 100644 > > --- a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c > > +++ b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c > > @@ -591,6 +591,7 @@ etna_try_rs_blit(struct pipe_context *pctx, > > .source = src->bo, > > .source_offset = src_offset, > > .source_stride = src_lev->stride, > > + .source_padded_width = src_lev->padded_width, > > .source_padded_height = src_lev->padded_height, > > .dest_format = translate_rs_format(dst_format), > > .dest_tiling = dst->layout, > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.c > > b/src/gallium/drivers/etnaviv/etnaviv_emit.c > > index c2117d5..707b1e7 100644 > > --- a/src/gallium/drivers/etnaviv/etnaviv_emit.c > > +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.c > > @@ -173,7 +173,14 @@ etna_submit_rs_state(struct etna_context *ctx, > > > > ctx->stats.rs_operations++; > > > > - if (screen->specs.pixel_pipes == 1) { > > + if (cs->RS_KICKER_INPLACE) { > > + etna_cmd_stream_reserve(stream, 6); > > + etna_coalesce_start(stream, &coalesce); > > + /* 0/1 */ EMIT_STATE(RS_EXTRA_CONFIG, cs->RS_EXTRA_CONFIG); > > + /* 2/3 */ EMIT_STATE(RS_SOURCE_STRIDE, cs- > > >RS_SOURCE_STRIDE); > > + /* 4/5 */ EMIT_STATE(RS_KICKER_INPLACE, cs- > > >RS_KICKER_INPLACE); > > + etna_coalesce_end(stream, &coalesce); > > + } else if (screen->specs.pixel_pipes == 1) { > > etna_cmd_stream_reserve(stream, 22); > > etna_coalesce_start(stream, &coalesce); > > /* 0/1 */ EMIT_STATE(RS_CONFIG, cs->RS_CONFIG); > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c > > b/src/gallium/drivers/etnaviv/etnaviv_rs.c > > index 5c108a6..c9072c2 100644 > > --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c > > +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c > > @@ -118,10 +118,21 @@ etna_compile_rs_state(struct etna_context > > *ctx, struct compiled_rs_state *cs, > > cs->RS_FILL_VALUE[3] = rs->clear_value[3]; > > cs->RS_EXTRA_CONFIG = VIVS_RS_EXTRA_CONFIG_AA(rs->aa) | > > VIVS_RS_EXTRA_CONFIG_ENDIAN(rs- > > >endian_mode); > > - /* TODO: cs->RS_UNK016B0 = s->size / 64 ? > > - * The blob does this consistently but there seems to be no > > currently supported > > - * model that needs it. > > + > > + /* If source the same as destination, and the hardware supports > > this, > > + * do an in-place resolve to fill in unrendered tiles. > > */ > > + if (ctx->specs.single_buffer && rs->source == rs->dest && > > + rs->source_offset == rs->dest_offset && > > + rs->source_format == rs->dest_format && > > + rs->source_tiling == rs->dest_tiling && > > + rs->source_stride == rs->dest_stride && > > + !rs->downsample_x && !rs->downsample_y && > > + !rs->swap_rb && !rs->flip && > > + !rs->clear_mode && rs->source_padded_width) { > > + /* Total number of tiles (same as for autodisable) */ > > + cs->RS_KICKER_INPLACE = rs->source_padded_width * rs- > > >source_padded_height / 16; > > + } > > } > > > > void > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.h > > b/src/gallium/drivers/etnaviv/etnaviv_rs.h > > index ec5b659..171d3fa 100644 > > --- a/src/gallium/drivers/etnaviv/etnaviv_rs.h > > +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.h > > @@ -43,6 +43,7 @@ struct rs_state { > > struct etna_bo *source; > > uint32_t source_offset; > > uint32_t source_stride; > > + uint32_t source_padded_width; /* total padded width (only > > needed for source) */ > > uint32_t source_padded_height; /* total padded height */ > > struct etna_bo *dest; > > uint32_t dest_offset; > > @@ -69,6 +70,7 @@ struct compiled_rs_state { > > uint32_t RS_FILL_VALUE[4]; > > uint32_t RS_EXTRA_CONFIG; > > uint32_t RS_PIPE_OFFSET[2]; > > + uint32_t RS_KICKER_INPLACE; /* Set if source is destination */ > > > > struct etna_reloc source[2]; > > struct etna_reloc dest[2]; > > _______________________________________________ > etnaviv mailing list > etna...@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/etnaviv _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev