diff options
author | Nicolai Hähnle <[email protected]> | 2017-06-09 15:16:51 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2017-07-31 14:55:38 +0200 |
commit | b36b6f76fa44b8bb2c379ccd83ad07ec4ddd2870 (patch) | |
tree | 3e676a73631afa7373748e4c30c931cd9766dc1b /src | |
parent | 677bd47cb96679cd6a75b0a11019797272fcba03 (diff) |
ac/nir: add support for arrays-of-arrays to get_sampler_desc
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 6bf0845fee4..e6a4504418a 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -4224,17 +4224,32 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx, { LLVMValueRef index = NULL; unsigned constant_index = 0; + const nir_deref *tail = &deref->deref; - if (deref->deref.child) { - const nir_deref_array *child = - (const nir_deref_array *)deref->deref.child; + while (tail->child) { + const nir_deref_array *child = nir_deref_as_array(tail->child); + unsigned array_size = glsl_get_aoa_size(tail->child->type); + + if (!array_size) + array_size = 1; assert(child->deref_array_type != nir_deref_array_type_wildcard); + if (child->deref_array_type == nir_deref_array_type_indirect) { - index = get_src(ctx, child->indirect); + LLVMValueRef indirect = get_src(ctx, child->indirect); + + indirect = LLVMBuildMul(ctx->ac.builder, indirect, + LLVMConstInt(ctx->ac.i32, array_size, false), ""); + + if (!index) + index = indirect; + else + index = LLVMBuildAdd(ctx->ac.builder, index, indirect, ""); } - constant_index = child->base_offset; + constant_index += child->base_offset * array_size; + + tail = &child->deref; } return ctx->abi->load_sampler_desc(ctx->abi, |