[Mesa-dev] [PATCH 05/12] spirv: Refactor the base case of offset_pointer_dereference

Jason Ekstrand jason at jlekstrand.net
Thu Oct 19 18:04:07 UTC 2017


This makes us key off of !offset instead of !block_index.  It also puts
the guts inside a switch statement so that we can handle more than just
UBOs and SSBOs.
---
 src/compiler/spirv/vtn_variables.c | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 0909af3..6a7cba4 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -161,24 +161,32 @@ vtn_ssa_offset_pointer_dereference(struct vtn_builder *b,
       idx++;
    }
 
-   if (!block_index) {
+   if (!offset) {
+      /* This is the first access chain so we don't have a block index */
+      assert(!block_index);
+
       assert(base->var);
-      if (glsl_type_is_array(type->type)) {
-         /* We need at least one element in the chain */
-         assert(deref_chain->length >= 1);
+      switch (base->mode) {
+      case vtn_variable_mode_ubo:
+      case vtn_variable_mode_ssbo:
+         if (glsl_type_is_array(type->type)) {
+            /* We need at least one element in the chain */
+            assert(deref_chain->length >= 1);
+
+            nir_ssa_def *desc_arr_idx =
+               vtn_access_link_as_ssa(b, deref_chain->link[0], 1);
+            block_index = vtn_variable_resource_index(b, base->var, desc_arr_idx);
+            type = type->array_element;
+            idx++;
+         } else {
+            block_index = vtn_variable_resource_index(b, base->var, NULL);
+         }
+         offset = nir_imm_int(&b->nb, 0);
+         break;
 
-         nir_ssa_def *desc_arr_idx =
-            vtn_access_link_as_ssa(b, deref_chain->link[0], 1);
-         block_index = vtn_variable_resource_index(b, base->var, desc_arr_idx);
-         type = type->array_element;
-         idx++;
-      } else {
-         block_index = vtn_variable_resource_index(b, base->var, NULL);
+      default:
+         unreachable("Invalid offset pointer mode");
       }
-
-      /* This is the first access chain so we also need an offset */
-      assert(!offset);
-      offset = nir_imm_int(&b->nb, 0);
    }
    assert(offset);
 
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list