---
 src/gallium/drivers/radeonsi/si_shader_nir.c | 41 +++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c 
b/src/gallium/drivers/radeonsi/si_shader_nir.c
index c2036a1509..e3e71c6eb6 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -771,6 +771,21 @@ 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, LLVMValueRef index)
+{
+       LLVMValueRef offset =
+               LLVMBuildMul(ctx->ac.builder, index, LLVMConstInt(ctx->i32, 16, 
0), "");
+
+       index = abi->load_ubo(abi, ctx->ac.i32_0);
+
+       LLVMValueRef ret = ac_build_buffer_load(&ctx->ac, 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,
@@ -780,8 +795,10 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi,
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        LLVMBuilderRef builder = ctx->ac.builder;
-       LLVMValueRef list = LLVMGetParam(ctx->main_fn, 
ctx->param_samplers_and_images);
        LLVMValueRef index = dynamic_index;
+       LLVMValueRef list = bindless ?
+               LLVMGetParam(ctx->main_fn, 
ctx->param_bindless_samplers_and_images) :
+               LLVMGetParam(ctx->main_fn, ctx->param_samplers_and_images);
 
        assert(!descriptor_set);
 
@@ -794,14 +811,24 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi,
 
        if (image) {
                assert(desc_type == AC_DESC_IMAGE || desc_type == 
AC_DESC_BUFFER);
-               assert(base_index + constant_index < ctx->num_images);
 
-               if (dynamic_index)
-                       index = si_llvm_bound_index(ctx, index, 
ctx->num_images);
+               if (bindless) {
+                       LLVMValueRef ret = get_bindless_index(abi, ctx, index);
 
-               index = LLVMBuildSub(ctx->gallivm.builder,
-                                    LLVMConstInt(ctx->i32, SI_NUM_IMAGES - 1, 
0),
-                                    index, "");
+                       /* For simplicity, bindless image descriptors use fixed
+                        * 16-dword slots for now.
+                        */
+                       index = LLVMBuildMul(ctx->ac.builder, ret,
+                                            LLVMConstInt(ctx->i32, 2, 0), "");
+               } else {
+                       assert(base_index + constant_index < ctx->num_images);
+                       if (dynamic_index)
+                               index = si_llvm_bound_index(ctx, index, 
ctx->num_images);
+
+                       index = LLVMBuildSub(ctx->gallivm.builder,
+                                            LLVMConstInt(ctx->i32, 
SI_NUM_IMAGES - 1, 0),
+                                            index, "");
+               }
 
                /* TODO: be smarter about when we use dcc_off */
                return si_load_image_desc(ctx, list, index, desc_type, write);
-- 
2.14.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to