summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <[email protected]>2017-12-03 15:35:39 +0100
committerBas Nieuwenhuizen <[email protected]>2017-12-10 01:43:26 +0100
commitb926da241a4221376afe195c476f6a05621e5c75 (patch)
tree22cf5a1d12e2cdbde2298e2358ea4c851f7ca560 /src/compiler
parent4c7af87fb9275787d2235595fb9edf0c51d99510 (diff)
spirv: Fix loading an entire block at once.
There is no chain, so checking the length ends with a SEGFAULT. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103579 Cc: <[email protected]> Reviewed-by: Emil Velikov <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/spirv/vtn_variables.c63
1 files changed, 33 insertions, 30 deletions
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index cf44ed31a6f..671f18a0339 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -615,38 +615,41 @@ vtn_pointer_to_offset(struct vtn_builder *b, struct vtn_pointer *ptr,
unsigned idx = 0;
struct vtn_type *type = ptr->var->type;
nir_ssa_def *offset = nir_imm_int(&b->nb, 0);
- for (; idx < ptr->chain->length; idx++) {
- enum glsl_base_type base_type = glsl_get_base_type(type->type);
- switch (base_type) {
- case GLSL_TYPE_UINT:
- case GLSL_TYPE_INT:
- case GLSL_TYPE_UINT16:
- case GLSL_TYPE_INT16:
- case GLSL_TYPE_UINT64:
- case GLSL_TYPE_INT64:
- case GLSL_TYPE_FLOAT:
- case GLSL_TYPE_FLOAT16:
- case GLSL_TYPE_DOUBLE:
- case GLSL_TYPE_BOOL:
- case GLSL_TYPE_ARRAY:
- offset = nir_iadd(&b->nb, offset,
- vtn_access_link_as_ssa(b, ptr->chain->link[idx],
- type->stride));
- type = type->array_element;
- break;
-
- case GLSL_TYPE_STRUCT: {
- vtn_assert(ptr->chain->link[idx].mode == vtn_access_mode_literal);
- unsigned member = ptr->chain->link[idx].id;
- offset = nir_iadd(&b->nb, offset,
- nir_imm_int(&b->nb, type->offsets[member]));
- type = type->members[member];
- break;
- }
+ if (ptr->chain) {
+ for (; idx < ptr->chain->length; idx++) {
+ enum glsl_base_type base_type = glsl_get_base_type(type->type);
+ switch (base_type) {
+ case GLSL_TYPE_UINT:
+ case GLSL_TYPE_INT:
+ case GLSL_TYPE_UINT16:
+ case GLSL_TYPE_INT16:
+ case GLSL_TYPE_UINT64:
+ case GLSL_TYPE_INT64:
+ case GLSL_TYPE_FLOAT:
+ case GLSL_TYPE_FLOAT16:
+ case GLSL_TYPE_DOUBLE:
+ case GLSL_TYPE_BOOL:
+ case GLSL_TYPE_ARRAY:
+ offset = nir_iadd(&b->nb, offset,
+ vtn_access_link_as_ssa(b, ptr->chain->link[idx],
+ type->stride));
+
+ type = type->array_element;
+ break;
+
+ case GLSL_TYPE_STRUCT: {
+ vtn_assert(ptr->chain->link[idx].mode == vtn_access_mode_literal);
+ unsigned member = ptr->chain->link[idx].id;
+ offset = nir_iadd(&b->nb, offset,
+ nir_imm_int(&b->nb, type->offsets[member]));
+ type = type->members[member];
+ break;
+ }
- default:
- vtn_fail("Invalid type for deref");
+ default:
+ vtn_fail("Invalid type for deref");
+ }
}
}