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. --- src/compiler/spirv/vtn_variables.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-)
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 0909af3..6a7cba4 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 */ + assert(!block_index); + assert(base->var); - if (glsl_type_is_array(type->type)) { - /* We need at least one element in the chain */ - 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 */ + 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: + unreachable("Invalid offset pointer mode"); } - - /* This is the first access chain so we also need an offset */ - assert(!offset); - offset = nir_imm_int(&b->nb, 0); } assert(offset); -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev