[Mesa-dev] [PATCH] glsl: add buffer block number information to atomic counter variables.
Timothy Arceri
timothy.arceri at collabora.com
Fri Oct 23 03:11:21 PDT 2015
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.
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.
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