summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-10-18 16:40:39 -0700
committerJason Ekstrand <[email protected]>2017-12-05 20:56:14 -0800
commit93646fb503342ecac3e5df247b90c15ca65c1e0a (patch)
tree2bb9096cf0ff699ce8e652708e5bfc7aa9c26bdd /src
parent98edf6bca4ba626cd0ab5da71bf09eaf3e90e444 (diff)
spirv: Refactor the base case of offset_pointer_dereference
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 <[email protected]> Reviewed-by: Kristian H. Kristensen <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/spirv/vtn_variables.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 49d9d399625..c5a13c3bd34 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -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);