intel/nir: Add a memory barrier before barrier()

Our barrier instruction does not implicitly do a memory fence but the
GLSL barrier() intrinsic is supposed to.  The easiest back-portable
solution is to just add the NIR barriers.  We'll sort this out more
properly in later commits.

Cc: mesa-stable@lists.freedesktop.org
Closes: #2138
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
Jason Ekstrand 2020-01-07 13:20:10 -06:00
parent 7cc0702bbb
commit 803fad43c3
1 changed files with 14 additions and 0 deletions

View File

@ -55,6 +55,20 @@ lower_cs_intrinsics_convert_block(struct lower_intrinsics_state *state,
nir_ssa_def *sysval;
switch (intrinsic->intrinsic) {
case nir_intrinsic_barrier: {
/* Our HW barrier instruction doesn't do a memory barrier for us but
* the GLSL barrier() intrinsic does for shared memory. Insert a
* shared memory barrier before every barrier().
*/
b->cursor = nir_before_instr(&intrinsic->instr);
nir_intrinsic_instr *shared_barrier =
nir_intrinsic_instr_create(b->shader,
nir_intrinsic_memory_barrier_shared);
nir_builder_instr_insert(b, &shared_barrier->instr);
continue;
}
case nir_intrinsic_load_local_invocation_index:
case nir_intrinsic_load_local_invocation_id: {
/* First time we are using those, so let's calculate them. */