summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2015-12-23 11:10:58 -0800
committerJason Ekstrand <jason.ekstrand@intel.com>2015-12-23 13:49:56 -0800
commit6219a69589a78efd8a40832d5f71ffe42eda9f67 (patch)
tree039978c212325d227eb29455e0176f9257ee2504 /src
parent3ab1b7afa8fd59ada577573954830a409a667bc4 (diff)
downloadexternal_mesa3d-6219a69589a78efd8a40832d5f71ffe42eda9f67.zip
external_mesa3d-6219a69589a78efd8a40832d5f71ffe42eda9f67.tar.gz
external_mesa3d-6219a69589a78efd8a40832d5f71ffe42eda9f67.tar.bz2
nir/spirv: Handle derefs in vtn_ssa_value
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.
Diffstat (limited to 'src')
-rw-r--r--src/glsl/nir/spirv_to_nir.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/glsl/nir/spirv_to_nir.c b/src/glsl/nir/spirv_to_nir.c
index 1afa7eb..dc16525 100644
--- a/src/glsl/nir/spirv_to_nir.c
+++ b/src/glsl/nir/spirv_to_nir.c
@@ -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");
}