[PATCH 03/11] etnaviv: add basic shader variant support

Lucas Stach l.stach at pengutronix.de
Mon Mar 27 08:56:44 UTC 2017


Am Sonntag, den 26.03.2017, 16:13 +0200 schrieb Christian Gmeiner:
> This commit adds some basic infrastructure to handle shader
> variants. We are still creating exactly one shader variant
> for each shader.
> 
> Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>

Nitpick inline, othwerwise:

Reviewed-by: Lucas Stach <l.stach at pengutronix.de>

> ---
>  src/gallium/drivers/etnaviv/etnaviv_compiler.h |  3 ++
>  src/gallium/drivers/etnaviv/etnaviv_shader.c   | 49 +++++++++++++++++++++++---
>  src/gallium/drivers/etnaviv/etnaviv_shader.h   | 12 +++++++
>  3 files changed, 60 insertions(+), 4 deletions(-)
> 
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
> index 2a3b4f4..8de0126 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h
> +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
> @@ -92,6 +92,9 @@ struct etna_shader_variant {
>  
>     /* unknown input property (XX_INPUT_COUNT, field UNK8) */
>     uint32_t input_count_unk8;
> +
> +   /* shader variants form a linked list */
> +   struct etna_shader_variant *next;
>  };
>  
>  struct etna_varying {
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.c b/src/gallium/drivers/etnaviv/etnaviv_shader.c
> index 35084e5..d6bc9bc 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_shader.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_shader.c
> @@ -31,6 +31,7 @@
>  #include "etnaviv_debug.h"
>  #include "etnaviv_util.h"
>  
> +#include "tgsi/tgsi_parse.h"
>  #include "util/u_math.h"
>  #include "util/u_memory.h"
>  
> @@ -266,25 +267,65 @@ etna_shader_update_vertex(struct etna_context *ctx)
>                                         ctx->vertex_elements);
>  }
>  
> +static struct etna_shader_variant *
> +create_variant(struct etna_shader *shader)
> +{
> +   struct etna_shader_variant *v;
> +
> +   v = etna_compile_shader(shader->specs, shader->tokens);
> +   if (!v) {
> +      debug_error("compile failed!");
> +      return NULL;
> +   }
> +
> +   v->id = ++shader->variant_count;
> +
> +   return v;
> +}
> +
>  static void *
>  etna_create_shader_state(struct pipe_context *pctx,
>                           const struct pipe_shader_state *pss)
>  {
>     struct etna_context *ctx = etna_context(pctx);
> -   struct etna_shader_variant *shader = etna_compile_shader(&ctx->specs, pss->tokens);
> +   struct etna_shader *shader = CALLOC_STRUCT(etna_shader);
> +
> +   if (!shader)
> +      return NULL;
>  
>     static uint32_t id;
>     shader->id = id++;
> +   shader->specs = &ctx->specs;
> +   shader->tokens = tgsi_dup_tokens(pss->tokens);
>  
> -   dump_shader_info(shader, &ctx->debug);
> +   /* compile new variant */
> +   struct etna_shader_variant *v;
>  
> -   return shader;
> +   v = create_variant(shader);
> +   if (v) {
> +      v->next = shader->variants;
> +      shader->variants = v;
> +      dump_shader_info(v, &ctx->debug);
> +   }
> +
> +   return v;
>  }
>  
>  static void
>  etna_delete_shader_state(struct pipe_context *pctx, void *ss)
>  {
> -   etna_destroy_shader(ss);
> +   struct etna_shader *shader = ss;
> +   struct etna_shader_variant *v, *t;
> +
> +   v = shader->variants;
> +   while (v) {
> +      t = v;
> +      v = v->next;
> +      etna_destroy_shader(t);
> +   }
> +
> +   FREE((void *)shader->tokens);

Is this cast really needed?

> +   FREE(shader);
>  }
>  
>  static void
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.h b/src/gallium/drivers/etnaviv/etnaviv_shader.h
> index 1dbd200..c613c17 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_shader.h
> +++ b/src/gallium/drivers/etnaviv/etnaviv_shader.h
> @@ -30,6 +30,18 @@
>  #include "pipe/p_state.h"
>  
>  struct etna_context;
> +struct etna_shader_variant;
> +
> +struct etna_shader {
> +    /* shader id (for debug): */
> +    uint32_t id;
> +    uint32_t variant_count;
> +
> +    struct tgsi_token *tokens;
> +    struct etna_specs *specs;
> +
> +    struct etna_shader_variant *variants;
> +};
>  
>  bool
>  etna_shader_link(struct etna_context *ctx);




More information about the etnaviv mailing list