spirv: Refactor the base case of offset_pointer_dereference
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 18 Oct 2017 23:40:39 +0000 (16:40 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 6 Dec 2017 04:56:14 +0000 (20:56 -0800)
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.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/compiler/spirv/vtn_variables.c

index 49d9d39962530efab2a9d4fff4d892b3eb8de489..c5a13c3bd343b8206d55ef973772c529d8126d3c 100644 (file)
@@ -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 */
+      vtn_assert(!block_index);
+
       vtn_assert(base->var);
-      if (glsl_type_is_array(type->type)) {
-         /* We need at least one element in the chain */
-         vtn_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 */
+            vtn_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:
+         vtn_fail("Invalid offset pointer mode");
       }
-
-      /* This is the first access chain so we also need an offset */
-      vtn_assert(!offset);
-      offset = nir_imm_int(&b->nb, 0);
    }
    vtn_assert(offset);