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

Christian Gmeiner christian.gmeiner at gmail.com
Tue Mar 28 19:23:37 UTC 2017


Hi Lucas,


2017-03-27 10:56 GMT+02:00 Lucas Stach <l.stach at pengutronix.de>:
> 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?
>

It is not needed - I have corrected that locally.

greets
--
Christian Gmeiner, MSc

https://www.youtube.com/user/AloryOFFICIAL
https://soundcloud.com/christian-gmeiner


More information about the etnaviv mailing list