summaryrefslogtreecommitdiffstats
path: root/src/amd
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2017-06-09 15:16:51 +0200
committerNicolai Hähnle <[email protected]>2017-07-31 14:55:38 +0200
commitb36b6f76fa44b8bb2c379ccd83ad07ec4ddd2870 (patch)
tree3e676a73631afa7373748e4c30c931cd9766dc1b /src/amd
parent677bd47cb96679cd6a75b0a11019797272fcba03 (diff)
ac/nir: add support for arrays-of-arrays to get_sampler_desc
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/amd')
-rw-r--r--src/amd/common/ac_nir_to_llvm.c25
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,