[Mesa-dev] [PATCH] glsl: add buffer block number information to atomic counter variables.

Samuel Iglesias Gonsálvez siglesias at igalia.com
Fri Oct 23 03:15:55 PDT 2015



On 23/10/15 12:11, Timothy Arceri wrote:
> On Fri, 2015-10-23 at 08:57 +0200, Samuel Iglesias Gonsalvez wrote:
>> Atomic counter variables can have a 'binding' layout modifier.
>> Unfortunately,
>> the atomic counter buffers are not sorted by binding value in
>> gl_shader_program's AtomicBuffers.
>>
>> Save the atomic counter buffer block index into the variable, so we
>> can use it inside the drivers.
>>
>> Fixes 298 dEQP-GLES31.functional.atomic_counter.* tests and
>> 9 dEQP-GLES31.functional.synchronization.inter_call.
>>   without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_*
>> tests for i965 driver.
> 
> Hi Samuel,
> 
> I've sent a number of patches trying to fix the problem with the
> binding without reintroducing the buffer_index field.
> 

Great!

> You can see the latest attempt here [1] based on feedback from curro
> and Ilia, also see the bug for a history of the problem.
> 

I will take a look at it later.

Thanks!

Sam

> Tim
> 
> [1] http://patchwork.freedesktop.org/patch/60989/
> 
> 
> 
>>
>> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>> ---
>>  src/glsl/ir.h                |  1 +
>>  src/glsl/link_atomics.cpp    | 32 ++++++++++++++++++++++++++++++++
>>  src/glsl/linker.cpp          |  1 +
>>  src/glsl/linker.h            |  3 +++
>>  src/glsl/nir/glsl_to_nir.cpp |  3 +--
>>  5 files changed, 38 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
>> index 9c9f22d..d120203 100644
>> --- a/src/glsl/ir.h
>> +++ b/src/glsl/ir.h
>> @@ -851,6 +851,7 @@ public:
>>         * Location an atomic counter is stored at.
>>         */
>>        struct {
>> +         unsigned buffer_index;
>>           unsigned offset;
>>        } atomic;
>>  
>> diff --git a/src/glsl/link_atomics.cpp b/src/glsl/link_atomics.cpp
>> index 70ef0e1..d19cd81 100644
>> --- a/src/glsl/link_atomics.cpp
>> +++ b/src/glsl/link_atomics.cpp
>> @@ -193,6 +193,38 @@ namespace {
>>     }
>>  }
>>  
>> +/**
>> + * Scan the program for atomic counters and store buffer index
>> + * information into the variable data structure.
>> + */
>> +void
>> +link_assign_atomic_counter_variable_buffer_index(struct
>> gl_shader_program *prog)
>> +{
>> +   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
>> +      gl_shader *sh = prog->_LinkedShaders[i];
>> +
>> +      if (sh == NULL)
>> +	 continue;
>> +
>> +      foreach_in_list(ir_instruction, node, sh->ir) {
>> +	 ir_variable *var = node->as_variable();
>> +
>> +         if (var && var->data.mode == ir_var_uniform &&
>> +             var->type->contains_atomic()) {
>> +            for(unsigned i = 0; i < prog->NumAtomicBuffers; i++) {
>> +               if (prog->AtomicBuffers[i].Binding ==  (unsigned) var
>> ->data.binding) {
>> +                  /* Save the buffer block index that corresponds to
>> variable's
>> +                   * binding.
>> +                   */
>> +                  var->data.atomic.buffer_index = i;
>> +                  break;
>> +               }
>> +            }
>> +         }
>> +      }
>> +   }
>> +}
>> +
>>  void
>>  link_assign_atomic_counter_resources(struct gl_context *ctx,
>>                                       struct gl_shader_program *prog)
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index 424b92a..c8334f6 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -4361,6 +4361,7 @@ link_shaders(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>>     update_array_sizes(prog);
>>     link_assign_uniform_locations(prog, ctx
>> ->Const.UniformBooleanTrue);
>>     link_assign_atomic_counter_resources(ctx, prog);
>> +   link_assign_atomic_counter_variable_buffer_index(prog);
>>     store_fragdepth_layout(prog);
>>  
>>     link_calculate_subroutine_compat(prog);
>> diff --git a/src/glsl/linker.h b/src/glsl/linker.h
>> index c80be1c..f16dd64 100644
>> --- a/src/glsl/linker.h
>> +++ b/src/glsl/linker.h
>> @@ -79,6 +79,9 @@ validate_interstage_uniform_blocks(struct
>> gl_shader_program *prog,
>>                                     gl_shader **stages, int
>> num_stages);
>>  
>>  extern void
>> +link_assign_atomic_counter_variable_buffer_index(struct
>> gl_shader_program *prog);
>> +
>> +extern void
>>  link_assign_atomic_counter_resources(struct gl_context *ctx,
>>                                       struct gl_shader_program
>> *prog);
>>  
>> diff --git a/src/glsl/nir/glsl_to_nir.cpp
>> b/src/glsl/nir/glsl_to_nir.cpp
>> index 9b50a93..aaeb53b 100644
>> --- a/src/glsl/nir/glsl_to_nir.cpp
>> +++ b/src/glsl/nir/glsl_to_nir.cpp
>> @@ -392,8 +392,7 @@ nir_visitor::visit(ir_variable *ir)
>>  
>>     var->data.index = ir->data.index;
>>     var->data.binding = ir->data.binding;
>> -   /* XXX Get rid of buffer_index */
>> -   var->data.atomic.buffer_index = ir->data.binding;
>> +   var->data.atomic.buffer_index = ir->data.atomic.buffer_index;
>>     var->data.atomic.offset = ir->data.atomic.offset;
>>     var->data.image.read_only = ir->data.image_read_only;
>>     var->data.image.write_only = ir->data.image_write_only;
> 


More information about the mesa-dev mailing list