ac/nir: Handle const array offsets in get_deref_offset()

Some users of this function (e.g. GS inputs) currently only work with
constant offsets. We got lucky since all the tests used an array index
of 0, so the non-constant part was always 0. But we still need to handle
this.

This doesn't fix any CTS test, but was noticed while debugging one.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Connor Abbott 2019-08-20 12:31:55 +02:00
parent 97d592c855
commit bb42c896fe
1 changed files with 11 additions and 6 deletions

View File

@ -1939,12 +1939,17 @@ get_deref_offset(struct ac_nir_context *ctx, nir_deref_instr *instr,
}
} else if(path.path[idx_lvl]->deref_type == nir_deref_type_array) {
unsigned size = glsl_count_attribute_slots(path.path[idx_lvl]->type, vs_in);
LLVMValueRef array_off = LLVMBuildMul(ctx->ac.builder, LLVMConstInt(ctx->ac.i32, size, 0),
get_src(ctx, path.path[idx_lvl]->arr.index), "");
if (offset)
offset = LLVMBuildAdd(ctx->ac.builder, offset, array_off, "");
else
offset = array_off;
if (nir_src_is_const(path.path[idx_lvl]->arr.index)) {
const_offset += size *
nir_src_as_uint(path.path[idx_lvl]->arr.index);
} else {
LLVMValueRef array_off = LLVMBuildMul(ctx->ac.builder, LLVMConstInt(ctx->ac.i32, size, 0),
get_src(ctx, path.path[idx_lvl]->arr.index), "");
if (offset)
offset = LLVMBuildAdd(ctx->ac.builder, offset, array_off, "");
else
offset = array_off;
}
} else
unreachable("Uhandled deref type in get_deref_instr_offset");
}