[Mesa-dev] [PATCH V6 06/27] glsl: add AoA support for atmoic counters

Ian Romanick idr at freedesktop.org
Tue Oct 6 12:54:01 PDT 2015


This patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

On 09/28/2015 07:42 PM, Timothy Arceri wrote:
> This marks all counters in an AoA as active.
> 
> For AoA all but the innermost array are treated as separate
> counters/uniforms. The Nvidia binary also goes further and
> finds inactive counters in the AoA, in future we should do
> this too, however this gets things working for the time being.
> 
> This change also removes the use of UniformHash for atomic counters,
> this avoids having to generate name strings used as hash keys.
> ---
>  src/glsl/link_atomics.cpp | 77 +++++++++++++++++++++++++++++++++--------------
>  1 file changed, 54 insertions(+), 23 deletions(-)
> 
> diff --git a/src/glsl/link_atomics.cpp b/src/glsl/link_atomics.cpp
> index 100d03c..70ef0e1 100644
> --- a/src/glsl/link_atomics.cpp
> +++ b/src/glsl/link_atomics.cpp
> @@ -33,7 +33,7 @@ namespace {
>      * Atomic counter as seen by the program.
>      */
>     struct active_atomic_counter {
> -      unsigned id;
> +      unsigned uniform_loc;
>        ir_variable *var;
>     };
>  
> @@ -52,7 +52,7 @@ namespace {
>           free(counters);
>        }
>  
> -      void push_back(unsigned id, ir_variable *var)
> +      void push_back(unsigned uniform_loc, ir_variable *var)
>        {
>           active_atomic_counter *new_counters;
>  
> @@ -66,7 +66,7 @@ namespace {
>           }
>  
>           counters = new_counters;
> -         counters[num_counters].id = id;
> +         counters[num_counters].uniform_loc = uniform_loc;
>           counters[num_counters].var = var;
>           num_counters++;
>        }
> @@ -95,6 +95,50 @@ namespace {
>                 y->data.atomic.offset < x->data.atomic.offset + x->type->atomic_size()));
>     }
>  
> +   void
> +   process_atomic_variable(const glsl_type *t, struct gl_shader_program *prog,
> +                           unsigned *uniform_loc, ir_variable *var,
> +                           active_atomic_buffer *const buffers,
> +                           unsigned *num_buffers, int *offset,
> +                           const unsigned shader_stage)
> +   {
> +      /* FIXME: Arrays of arrays get counted separately. For example:
> +       * x1[3][3][2] = 9 counters
> +       * x2[3][2]    = 3 counters
> +       * x3[2]       = 1 counter
> +       *
> +       * However this code marks all the counters as active even when they
> +       * might not be used.
> +       */
> +      if (t->is_array() && t->fields.array->is_array()) {
> +         for (unsigned i = 0; i < t->length; i++) {
> +            process_atomic_variable(t->fields.array, prog, uniform_loc,
> +                                    var, buffers, num_buffers, offset,
> +                                    shader_stage);
> +         }
> +      } else {
> +         active_atomic_buffer *buf = &buffers[var->data.binding];
> +         gl_uniform_storage *const storage =
> +            &prog->UniformStorage[*uniform_loc];
> +
> +         /* If this is the first time the buffer is used, increment
> +          * the counter of buffers used.
> +          */
> +         if (buf->size == 0)
> +            (*num_buffers)++;
> +
> +         buf->push_back(*uniform_loc, var);
> +
> +         buf->stage_references[shader_stage]++;
> +         buf->size = MAX2(buf->size, *offset + t->atomic_size());
> +
> +         storage->offset = *offset;
> +         *offset += t->atomic_size();
> +
> +         (*uniform_loc)++;
> +      }
> +   }
> +
>     active_atomic_buffer *
>     find_active_atomic_counters(struct gl_context *ctx,
>                                 struct gl_shader_program *prog,
> @@ -114,23 +158,10 @@ namespace {
>              ir_variable *var = node->as_variable();
>  
>              if (var && var->type->contains_atomic()) {
> -               unsigned id = 0;
> -               bool found = prog->UniformHash->get(id, var->name);
> -               assert(found);
> -               (void) found;
> -               active_atomic_buffer *buf = &buffers[var->data.binding];
> -
> -               /* If this is the first time the buffer is used, increment
> -                * the counter of buffers used.
> -                */
> -               if (buf->size == 0)
> -                  (*num_buffers)++;
> -
> -               buf->push_back(id, var);
> -
> -               buf->stage_references[i]++;
> -               buf->size = MAX2(buf->size, var->data.atomic.offset +
> -                                var->type->atomic_size());
> +               int offset = var->data.atomic.offset;
> +               unsigned uniform_loc = var->data.location;
> +               process_atomic_variable(var->type, prog, &uniform_loc,
> +                                       var, buffers, num_buffers, &offset, i);
>              }
>           }
>        }
> @@ -197,10 +228,10 @@ link_assign_atomic_counter_resources(struct gl_context *ctx,
>        /* Assign counter-specific fields. */
>        for (unsigned j = 0; j < ab.num_counters; j++) {
>           ir_variable *const var = ab.counters[j].var;
> -         const unsigned id = ab.counters[j].id;
> -         gl_uniform_storage *const storage = &prog->UniformStorage[id];
> +         gl_uniform_storage *const storage =
> +            &prog->UniformStorage[ab.counters[j].uniform_loc];
>  
> -         mab.Uniforms[j] = id;
> +         mab.Uniforms[j] = ab.counters[j].uniform_loc;
>           if (!var->data.explicit_binding)
>              var->data.binding = i;
>  
> 



More information about the mesa-dev mailing list