[PATCH v2 04/17] etnaviv: Use only DRAW_INSTANCED on GC3000+

Lucas Stach l.stach at pengutronix.de
Wed Nov 22 13:29:33 UTC 2017


Hi Wladimir,

Am Samstag, den 18.11.2017, 10:44 +0100 schrieb Wladimir J. van der Laan:
> The blob does this, as DRAW_INSTANCED can replace fully all the other
> draw commands. It is also required to handle integer vertex formats.
> The other path is only there for compatibility and might go away (or at
> least rot to become buggy due to dis-use) in newer hardware.
> 
> As a by-effect this changes the behavior for GC3000-, by no longer using
> the index offset for DRAW_INDEXED but instead adding it to INDEX_ADDR.
> This should make no difference.
> 
> Preparation for GC7000 support.

I haven't looked into it much yet, but this commit breaks QT5 GUI
rendering on GC3000 for me. It seems like the DRAWs get dropped on the
floor with nothing being rendered. I didn't spot anything obviously
wrong in this patch from a quick look, so would be glad if you could
look into this.

Regards,
Lucas

> Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>
> > Reviewed-by: Philipp Zabel <p.zabel at pengutronix.de>
> ---
>  src/gallium/drivers/etnaviv/etnaviv_context.c | 16 ++++++++++++----
>  src/gallium/drivers/etnaviv/etnaviv_emit.h    | 21 +++++++++++++++++++++
>  2 files changed, 33 insertions(+), 4 deletions(-)
> 
> Unchanged since v1, only commit message updated as noted by Philipp Zabel.
> 
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c
> index 65c20d2..5aa9c66 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_context.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
> @@ -188,6 +188,8 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
>           BUG("Index buffer upload failed.");
>           return;
>        }
> +      /* Add start to index offset, when rendering indexed */
> +      index_offset += info->start * info->index_size;
>  
>        ctx->index_buffer.FE_INDEX_STREAM_BASE_ADDR.bo = etna_resource(indexbuf)->bo;
>        ctx->index_buffer.FE_INDEX_STREAM_BASE_ADDR.offset = index_offset;
> @@ -273,10 +275,16 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
>     /* First, sync state, then emit DRAW_PRIMITIVES or DRAW_INDEXED_PRIMITIVES */
>     etna_emit_state(ctx);
>  
> -   if (info->index_size)
> -      etna_draw_indexed_primitives(ctx->stream, draw_mode, info->start, prims, info->index_bias);
> -   else
> -      etna_draw_primitives(ctx->stream, draw_mode, info->start, prims);
> +   if (ctx->specs.halti >= 2) {
> +      /* On HALTI2+ (GC3000 and higher) only use instanced drawing commands, as the blob does */
> +      etna_draw_instanced(ctx->stream, info->index_size, draw_mode, 1,
> +         info->count, info->index_size ? info->index_bias : info->start);
> +   } else {
> +      if (info->index_size)
> +         etna_draw_indexed_primitives(ctx->stream, draw_mode, 0, prims, info->index_bias);
> +      else
> +         etna_draw_primitives(ctx->stream, draw_mode, info->start, prims);
> +   }
>  
>     if (DBG_ENABLED(ETNA_DBG_DRAW_STALL)) {
>        /* Stall the FE after every draw operation.  This allows better
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.h b/src/gallium/drivers/etnaviv/etnaviv_emit.h
> index e0c0eda..3c3d129 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_emit.h
> +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.h
> @@ -117,6 +117,27 @@ etna_draw_indexed_primitives(struct etna_cmd_stream *stream,
>     etna_cmd_stream_emit(stream, 0);
>  }
>  
> +/* important: this takes a vertex count, not a primitive count */
> +static inline void
> +etna_draw_instanced(struct etna_cmd_stream *stream,
> +                    uint32_t indexed, uint32_t primitive_type,
> +                    uint32_t instance_count,
> +                    uint32_t vertex_count, uint32_t offset)
> +{
> +   etna_cmd_stream_reserve(stream, 3 + 1);
> +   etna_cmd_stream_emit(stream,
> +      VIV_FE_DRAW_INSTANCED_HEADER_OP_DRAW_INSTANCED |
> +      COND(indexed, VIV_FE_DRAW_INSTANCED_HEADER_INDEXED) |
> +      VIV_FE_DRAW_INSTANCED_HEADER_TYPE(primitive_type) |
> +      VIV_FE_DRAW_INSTANCED_HEADER_INSTANCE_COUNT_LO(instance_count & 0xffff));
> +   etna_cmd_stream_emit(stream,
> +      VIV_FE_DRAW_INSTANCED_COUNT_INSTANCE_COUNT_HI(instance_count >> 16) |
> +      VIV_FE_DRAW_INSTANCED_COUNT_VERTEX_COUNT(vertex_count));
> +   etna_cmd_stream_emit(stream,
> +      VIV_FE_DRAW_INSTANCED_START_INDEX(offset));
> +   etna_cmd_stream_emit(stream, 0);
> +}
> +
>  void
>  etna_emit_state(struct etna_context *ctx);
>  


More information about the etnaviv mailing list