From ba43b66dc996988ec326d35395e9699ea4f66fdf Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 7 Jan 2020 14:40:53 -0600 Subject: [PATCH] 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: --- src/compiler/glsl/glsl_to_nir.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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); -- 2.30.2