diff options
author | Bas Nieuwenhuizen <[email protected]> | 2017-12-03 15:35:39 +0100 |
---|---|---|
committer | Bas Nieuwenhuizen <[email protected]> | 2017-12-10 01:43:26 +0100 |
commit | b926da241a4221376afe195c476f6a05621e5c75 (patch) | |
tree | 22cf5a1d12e2cdbde2298e2358ea4c851f7ca560 /src | |
parent | 4c7af87fb9275787d2235595fb9edf0c51d99510 (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')
-rw-r--r-- | src/compiler/spirv/vtn_variables.c | 63 |
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"); + } } } |