[Mesa-dev] [RFC 19/16] nir: add atomic lowering support for AoA

Timothy Arceri t_arceri at yahoo.com.au
Wed Jul 22 15:32:00 PDT 2015


---
 src/glsl/nir/nir_lower_atomics.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/glsl/nir/nir_lower_atomics.c b/src/glsl/nir/nir_lower_atomics.c
index ce3615a..e5ec008 100644
--- a/src/glsl/nir/nir_lower_atomics.c
+++ b/src/glsl/nir/nir_lower_atomics.c
@@ -72,15 +72,17 @@ lower_instr(nir_intrinsic_instr *instr, nir_function_impl *impl)
 
    nir_ssa_def *offset_def = &offset_const->def;
 
-   if (instr->variables[0]->deref.child != NULL) {
-      assert(instr->variables[0]->deref.child->deref_type ==
-             nir_deref_type_array);
-      nir_deref_array *deref_array =
-         nir_deref_as_array(instr->variables[0]->deref.child);
-      assert(deref_array->deref.child == NULL);
-
-      offset_const->value.u[0] +=
-         deref_array->base_offset * ATOMIC_COUNTER_SIZE;
+   nir_deref *tail = &instr->variables[0]->deref;
+   while (tail->child != NULL) {
+      assert(tail->child->deref_type == nir_deref_type_array);
+      nir_deref_array *deref_array = nir_deref_as_array(tail->child);
+      tail = tail->child;
+
+      unsigned child_array_elements = tail != NULL ?
+         glsl_get_aoa_size(tail->type) : 1;
+
+      offset_const->value.u[0] += deref_array->base_offset *
+         child_array_elements * ATOMIC_COUNTER_SIZE;
 
       if (deref_array->deref_array_type == nir_deref_array_type_indirect) {
          nir_load_const_instr *atomic_counter_size =
-- 
2.4.3



More information about the mesa-dev mailing list