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:
@@ -55,6 +55,20 @@ lower_cs_intrinsics_convert_block(struct lower_intrinsics_state *state,
|
|||||||
|
|
||||||
nir_ssa_def *sysval;
|
nir_ssa_def *sysval;
|
||||||
switch (intrinsic->intrinsic) {
|
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_index:
|
||||||
case nir_intrinsic_load_local_invocation_id: {
|
case nir_intrinsic_load_local_invocation_id: {
|
||||||
/* First time we are using those, so let's calculate them. */
|
/* First time we are using those, so let's calculate them. */
|
||||||
|
Reference in New Issue
Block a user