From: Jason Ekstrand Date: Tue, 7 Jan 2020 20:40:53 +0000 (-0600) Subject: nir/glsl: Emit memory barriers as part of barrier() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ba43b66dc996988ec326d35395e9699ea4f66fdf;p=mesa.git nir/glsl: Emit memory barriers as part of barrier() The GLSL barrier() intrinsic does an implicit shared memory barrier in compute shaders and an implicit TCS patch output barrier in tessellation control shaders. We'd like NIR's barrier intrinsic to just be a control flow barrier and not have memory implications. To satisfy this, we need to add an extra memory barrier in front of each nir_intrinsic_barrier. Reviewed-by: Caio Marcelo de Oliveira Filho Reviewed-by: Eric Anholt Part-of: --- diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 479832b5ab0..4ab620142b0 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -2701,6 +2701,18 @@ nir_visitor::visit(ir_dereference_array *ir) void nir_visitor::visit(ir_barrier *) { + if (shader->info.stage == MESA_SHADER_COMPUTE) { + nir_intrinsic_instr *shared_barrier = + nir_intrinsic_instr_create(this->shader, + nir_intrinsic_memory_barrier_shared); + nir_builder_instr_insert(&b, &shared_barrier->instr); + } else if (shader->info.stage == MESA_SHADER_TESS_CTRL) { + nir_intrinsic_instr *patch_barrier = + nir_intrinsic_instr_create(this->shader, + nir_intrinsic_memory_barrier_tcs_patch); + nir_builder_instr_insert(&b, &patch_barrier->instr); + } + nir_intrinsic_instr *instr = nir_intrinsic_instr_create(this->shader, nir_intrinsic_barrier); nir_builder_instr_insert(&b, &instr->instr);