nir/spirv: Handle derefs in vtn_ssa_value
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 23 Dec 2015 19:10:58 +0000 (11:10 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 23 Dec 2015 21:49:56 +0000 (13:49 -0800)
This is kind of a hack, but it makes vtn_ssa_value insert a load if the
value requested is actually a deref.  This shouldn't happen normally but,
thanks to the impedence mismatch of the NIR function parameter model vs.
the SPIR-V model, this can happen for function arguments.

src/glsl/nir/spirv_to_nir.c

index 1afa7eba5a98d12446f1a1ccd9a8debf9571abde..dc165252c25b3cf65ac26523f5887d7829fca95c 100644 (file)
@@ -109,6 +109,10 @@ vtn_const_ssa_value(struct vtn_builder *b, nir_constant *constant,
    return val;
 }
 
+static struct vtn_ssa_value *
+vtn_variable_load(struct vtn_builder *b, nir_deref_var *src,
+                  struct vtn_type *src_type);
+
 struct vtn_ssa_value *
 vtn_ssa_value(struct vtn_builder *b, uint32_t value_id)
 {
@@ -119,6 +123,11 @@ vtn_ssa_value(struct vtn_builder *b, uint32_t value_id)
 
    case vtn_value_type_ssa:
       return val->ssa;
+
+   case vtn_value_type_deref:
+      /* This is needed for function parameters */
+      return vtn_variable_load(b, val->deref, val->deref_type);
+
    default:
       unreachable("Invalid type for an SSA value");
    }