---
 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
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to