summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2019-01-22 12:29:34 +1100
committerTimothy Arceri <[email protected]>2019-01-23 10:41:37 +1100
commit559e5b0408c3fda2aa05d477f2738746cb9d0d5d (patch)
treead9d4b7002bc556adba459b178ca48fc56a01d33 /src
parentf0ed59076f7e6e2bf8c6f5d42b6a8e8aac57d3e2 (diff)
ac/nir_to_llvm: add bindless support for uniform handles
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/amd/common/ac_nir_to_llvm.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index ddf18c4c572..686e8b4935e 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -3303,6 +3303,27 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
}
}
+static LLVMValueRef get_bindless_index_from_uniform(struct ac_nir_context *ctx,
+ unsigned base_index,
+ unsigned constant_index,
+ LLVMValueRef dynamic_index)
+{
+ LLVMValueRef offset = LLVMConstInt(ctx->ac.i32, base_index * 4, 0);
+ LLVMValueRef index = LLVMBuildAdd(ctx->ac.builder, dynamic_index,
+ LLVMConstInt(ctx->ac.i32, constant_index, 0), "");
+
+ /* Bindless uniforms are 64bit so multiple index by 8 */
+ index = LLVMBuildMul(ctx->ac.builder, index, LLVMConstInt(ctx->ac.i32, 8, 0), "");
+ offset = LLVMBuildAdd(ctx->ac.builder, offset, index, "");
+
+ LLVMValueRef ubo_index = ctx->abi->load_ubo(ctx->abi, ctx->ac.i32_0);
+
+ LLVMValueRef ret = ac_build_buffer_load(&ctx->ac, ubo_index, 1, NULL, offset,
+ NULL, 0, false, false, true, true);
+
+ return LLVMBuildBitCast(ctx->ac.builder, ret, ctx->ac.i32, "");
+}
+
static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,
nir_deref_instr *deref_instr,
enum ac_descriptor_type desc_type,
@@ -3353,8 +3374,15 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,
descriptor_set = deref_instr->var->data.descriptor_set;
if (deref_instr->var->data.bindless) {
+ /* For now just assert on unhandled variable types */
+ assert(deref_instr->var->data.mode == nir_var_uniform);
+
base_index = deref_instr->var->data.driver_location;
bindless = true;
+
+ index = index ? index : ctx->ac.i32_0;
+ index = get_bindless_index_from_uniform(ctx, base_index,
+ constant_index, index);
} else
base_index = deref_instr->var->data.binding;
}