From 9f934e922df65b42f9d77990086f1f80cb0165c5 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 13 Aug 2020 18:38:25 -0400 Subject: [PATCH] compiler, nir: Add and set barrier metadata Useful for determining whether certain optimizations are legal for a compute shader (e.g. optimizing workgroup size in the driver). Signed-off-by: Alyssa Rosenzweig Reviewed-by: Jason Ekstrand Part-of: --- src/compiler/nir/nir_gather_info.c | 22 ++++++++++++++++++++++ src/compiler/shader_info.h | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index f8edfbd5a1e..7cc0fb9e590 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -712,6 +712,28 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader, update_memory_written_for_deref(shader, nir_src_as_deref(instr->src[0])); break; + case nir_intrinsic_control_barrier: + shader->info.uses_control_barrier = true; + break; + + case nir_intrinsic_scoped_barrier: + shader->info.uses_control_barrier |= + nir_intrinsic_execution_scope(instr) != NIR_SCOPE_NONE; + + shader->info.uses_memory_barrier |= + nir_intrinsic_memory_scope(instr) != NIR_SCOPE_NONE; + break; + + case nir_intrinsic_memory_barrier: + case nir_intrinsic_group_memory_barrier: + case nir_intrinsic_memory_barrier_atomic_counter: + case nir_intrinsic_memory_barrier_buffer: + case nir_intrinsic_memory_barrier_image: + case nir_intrinsic_memory_barrier_shared: + case nir_intrinsic_memory_barrier_tcs_patch: + shader->info.uses_memory_barrier = true; + break; + default: break; } diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 7a73dcc8c19..0d7183f96e8 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -226,6 +226,10 @@ typedef struct shader_info { /* Whether gl_Layer is viewport-relative */ bool layer_viewport_relative:1; + /* Whether explicit barriers are used */ + bool uses_control_barrier : 1; + bool uses_memory_barrier : 1; + union { struct { /* Which inputs are doubles */