summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir.h
diff options
context:
space:
mode:
authorCaio Marcelo de Oliveira Filho <[email protected]>2019-07-18 16:14:03 -0700
committerCaio Marcelo de Oliveira Filho <[email protected]>2019-10-24 11:39:55 -0700
commit73572abc2a7a15bc16d2e7e4df6aa6096fd1985b (patch)
tree3517c79eb13a1e0cf1ba2267ebca85f53a3c391d /src/compiler/nir/nir.h
parent0ebe89459cca8a3b50a97377a92c7fb194147051 (diff)
nir: Add scoped_memory_barrier intrinsic
Add a NIR instrinsic that represent a memory barrier in SPIR-V / Vulkan Memory Model, with extra attributes that describe the barrier: - Ordering: whether is an Acquire or Release; - "Cache control": availability ("ensure this gets written in the memory") and visibility ("ensure my cache is up to date when I'm reading"); - Variable modes: which memory types this barrier applies to; - Scope: how far this barrier applies. Note that unlike in SPIR-V, the "Storage Semantics" and the "Memory Semantics" are split into two different attributes so we can use variable modes for the former. NIR passes that took barriers in consideration were also changed - nir_opt_copy_prop_vars: clean up the values for the mode of an ACQUIRE barrier. Copy propagation effect is to "pull up a load" (by not performing it), which is what ACQUIRE restricts. - nir_opt_dead_write_vars and nir_opt_combine_writes: clean up the pending writes for the modes of an RELEASE barrier. Dead writes effect is to "push down a store", which is what RELEASE restricts. - nir_opt_access: treat the ACQUIRE and RELEASE as a full barrier for the modes. This is conservative, but since this is a GL-specific pass, doesn't make a difference for now. v2: Fix the scoped barrier handling in copy propagation. (Jason) Add scoped barrier handling to nir_opt_access and nir_opt_combine_writes. (Rhys) Reviewed-by: Jason Ekstrand <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir.h')
-rw-r--r--src/compiler/nir/nir.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 6496ad92b11..f5f9826a27c 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -1380,6 +1380,24 @@ nir_intrinsic_get_var(nir_intrinsic_instr *intrin, unsigned i)
return nir_deref_instr_get_variable(nir_src_as_deref(intrin->src[i]));
}
+typedef enum {
+ /* Memory ordering. */
+ NIR_MEMORY_ACQUIRE = 1 << 0,
+ NIR_MEMORY_RELEASE = 1 << 1,
+
+ /* Memory visibility operations. */
+ NIR_MEMORY_MAKE_AVAILABLE = 1 << 3,
+ NIR_MEMORY_MAKE_VISIBLE = 1 << 4,
+} nir_memory_semantics;
+
+typedef enum {
+ NIR_SCOPE_DEVICE,
+ NIR_SCOPE_QUEUE_FAMILY,
+ NIR_SCOPE_WORKGROUP,
+ NIR_SCOPE_SUBGROUP,
+ NIR_SCOPE_INVOCATION,
+} nir_scope;
+
/**
* \name NIR intrinsics semantic flags
*
@@ -1529,6 +1547,21 @@ typedef enum {
/* Driver location for nir_load_patch_location_ir3 */
NIR_INTRINSIC_DRIVER_LOCATION,
+ /**
+ * Mask of nir_memory_semantics, includes ordering and visibility.
+ */
+ NIR_INTRINSIC_MEMORY_SEMANTICS,
+
+ /**
+ * Mask of nir_variable_modes affected by the memory operation.
+ */
+ NIR_INTRINSIC_MEMORY_MODES,
+
+ /**
+ * Value of nir_scope.
+ */
+ NIR_INTRINSIC_MEMORY_SCOPE,
+
NIR_INTRINSIC_NUM_INDEX_FLAGS,
} nir_intrinsic_index_flag;
@@ -1638,6 +1671,9 @@ INTRINSIC_IDX_ACCESSORS(desc_type, DESC_TYPE, unsigned)
INTRINSIC_IDX_ACCESSORS(type, TYPE, nir_alu_type)
INTRINSIC_IDX_ACCESSORS(swizzle_mask, SWIZZLE_MASK, unsigned)
INTRINSIC_IDX_ACCESSORS(driver_location, DRIVER_LOCATION, unsigned)
+INTRINSIC_IDX_ACCESSORS(memory_semantics, MEMORY_SEMANTICS, nir_memory_semantics)
+INTRINSIC_IDX_ACCESSORS(memory_modes, MEMORY_MODES, nir_variable_mode)
+INTRINSIC_IDX_ACCESSORS(memory_scope, MEMORY_SCOPE, nir_scope)
static inline void
nir_intrinsic_set_align(nir_intrinsic_instr *intrin,