Marek
On Wed, Jan 9, 2019 at 3:54 AM Timothy Arceri <tarc...@itsqueeze.com
<mailto:tarc...@itsqueeze.com>> wrote:
---
src/gallium/drivers/radeonsi/si_shader_nir.c | 33 +++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c
b/src/gallium/drivers/radeonsi/si_shader_nir.c
index 2c95c62d99..256ef28bb1 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -912,6 +912,28 @@ si_nir_lookup_interp_param(struct ac_shader_abi
*abi,
LLVMGetParam(ctx->main_fn, interp_param_idx) : NULL;
}
+static LLVMValueRef
+get_bindless_index(struct ac_shader_abi *abi,
+ struct si_shader_context *ctx, unsigned base_index,
+ unsigned constant_index, LLVMValueRef dynamic_index)
+{
+ LLVMValueRef offset = LLVMConstInt(ctx->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->i32, 8, 0), "");
+ offset = LLVMBuildAdd(ctx->ac.builder, offset, index, "");
+
+ LLVMValueRef ubo_index = abi->load_ubo(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->i32, "");
+}
+
+
static LLVMValueRef
si_nir_load_sampler_desc(struct ac_shader_abi *abi,
unsigned descriptor_set, unsigned base_index,
@@ -937,8 +959,17 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi,
LLVMValueRef list =
LLVMGetParam(ctx->main_fn,
ctx->param_bindless_samplers_and_images);
- /* dynamic_index is the bindless handle */
+ dynamic_index = dynamic_index ? dynamic_index :
ctx->ac.i32_0;
+ dynamic_index = get_bindless_index(abi, ctx, base_index,
+ constant_index,
dynamic_index);
+
if (image) {
+ /* For simplicity, bindless image
descriptors use fixed
+ * 16-dword slots for now.
+ */
+ dynamic_index =
LLVMBuildMul(ctx->ac.builder, dynamic_index,
+ LLVMConstInt(ctx->i32,
2, 0), "");
+
return si_load_image_desc(ctx, list,
dynamic_index, desc_type,
dcc_off, true);
}
--
2.20.1
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org <mailto:mesa-dev@lists.freedesktop.org>
https://lists.freedesktop.org/mailman/listinfo/mesa-dev