From: Timothy Arceri Date: Mon, 19 Mar 2018 11:23:55 +0000 (+1100) Subject: st/nir: fix atomic lowering for gallium drivers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dfe2f198550b262186e2882d7e573f1f3759deb7;p=mesa.git st/nir: fix atomic lowering for gallium drivers i965 and gallium handle the atomic buffer index differently. It was just by luck that the single piglit test for this was passing. For gallium we use the atomic binding so that we match the handling in st_bind_atomics(). On radeonsi this fixes the CTS test: KHR-GL43.shader_storage_buffer_object.advanced-write-fragment It also fixes tressfx hair rendering in Tomb Raider. Reviewed-by: Marek Olšák --- 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");