diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index d7baabd6f6e..0d207d0ea54 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2710,7 +2710,8 @@ typedef struct nir_lower_bitmap_options { void nir_lower_bitmap(nir_shader *shader, const nir_lower_bitmap_options *options); bool nir_lower_atomics(nir_shader *shader, - const struct gl_shader_program *shader_program); + const struct gl_shader_program *shader_program, + bool use_binding_as_idx); bool nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset); bool nir_lower_to_source_mods(nir_shader *shader); diff --git a/src/compiler/nir/nir_lower_atomics.c b/src/compiler/nir/nir_lower_atomics.c index bdab4b87377..6b046bc426e 100644 --- a/src/compiler/nir/nir_lower_atomics.c +++ b/src/compiler/nir/nir_lower_atomics.c @@ -38,7 +38,7 @@ static bool lower_instr(nir_intrinsic_instr *instr, const struct gl_shader_program *shader_program, - nir_shader *shader) + nir_shader *shader, bool use_binding_as_idx) { nir_intrinsic_op op; switch (instr->intrinsic) { @@ -98,9 +98,12 @@ lower_instr(nir_intrinsic_instr *instr, void *mem_ctx = ralloc_parent(instr); unsigned uniform_loc = instr->variables[0]->var->data.location; + unsigned idx = use_binding_as_idx ? + instr->variables[0]->var->data.binding : + shader_program->data->UniformStorage[uniform_loc].opaque[shader->info.stage].index; + nir_intrinsic_instr *new_instr = nir_intrinsic_instr_create(mem_ctx, op); - nir_intrinsic_set_base(new_instr, - shader_program->data->UniformStorage[uniform_loc].opaque[shader->info.stage].index); + nir_intrinsic_set_base(new_instr, idx); nir_load_const_instr *offset_const = nir_load_const_instr_create(mem_ctx, 1, 32); @@ -174,7 +177,8 @@ lower_instr(nir_intrinsic_instr *instr, bool nir_lower_atomics(nir_shader *shader, - const struct gl_shader_program *shader_program) + const struct gl_shader_program *shader_program, + bool use_binding_as_idx) { bool progress = false; @@ -184,7 +188,8 @@ nir_lower_atomics(nir_shader *shader, nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_intrinsic) progress |= lower_instr(nir_instr_as_intrinsic(instr), - shader_program, shader); + shader_program, shader, + use_binding_as_idx); } } diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp index b08b56a9353..274a738cbbf 100644 --- a/src/mesa/drivers/dri/i965/brw_link.cpp +++ b/src/mesa/drivers/dri/i965/brw_link.cpp @@ -299,7 +299,7 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) brw_shader_gather_info(prog->nir, prog); NIR_PASS_V(prog->nir, nir_lower_samplers, shProg); - NIR_PASS_V(prog->nir, nir_lower_atomics, shProg); + NIR_PASS_V(prog->nir, nir_lower_atomics, shProg, false); NIR_PASS_V(prog->nir, nir_lower_atomics_to_ssbo, prog->nir->info.num_abos); diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 2eb2ece5b16..9bb99f30610 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -414,7 +414,7 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, st_set_prog_affected_state_flags(prog); NIR_PASS_V(nir, st_nir_lower_builtin); - NIR_PASS_V(nir, nir_lower_atomics, shader_program); + NIR_PASS_V(nir, nir_lower_atomics, shader_program, true); if (st->ctx->_Shader->Flags & GLSL_DUMP) { _mesa_log("\n");