[Mesa-dev] [PATCH v2] etnaviv: Do GC3000 resolve-in-place when possible

Lucas Stach l.stach at pengutronix.de
Thu Oct 12 14:05:16 UTC 2017


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 <laanwj at gmail.com>
> 
> Reviewed-by: Lucas Stach <l.stach at 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
> etnaviv at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/etnaviv


More information about the mesa-dev mailing list