radeonsi: add load_image_desc()
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 30 Mar 2017 17:58:02 +0000 (19:58 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sat, 1 Apr 2017 16:07:49 +0000 (18:07 +0200)
Similar to load_sampler_desc(). Same deal for bindless.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c

index 2ca53dec70abf4869a6f73ad65fdade1a230684f..38760109f0ab389df9ef59967c912346a9757b9b 100644 (file)
@@ -3249,6 +3249,24 @@ static LLVMTypeRef const_array(LLVMTypeRef elem_type, int num_elements)
                               CONST_ADDR_SPACE);
 }
 
+static LLVMValueRef load_image_desc(struct si_shader_context *ctx,
+                                   LLVMValueRef list, LLVMValueRef index,
+                                   unsigned target)
+{
+       LLVMBuilderRef builder = ctx->gallivm.builder;
+
+       if (target == TGSI_TEXTURE_BUFFER) {
+               index = LLVMBuildMul(builder, index,
+                                    LLVMConstInt(ctx->i32, 2, 0), "");
+               index = LLVMBuildAdd(builder, index,
+                                    LLVMConstInt(ctx->i32, 1, 0), "");
+               list = LLVMBuildPointerCast(builder, list,
+                                           const_array(ctx->v4i32, 0), "");
+       }
+
+       return ac_build_indexed_load_const(&ctx->ac, list, index);
+}
+
 /**
  * Load the resource descriptor for \p image.
  */
@@ -3262,8 +3280,8 @@ image_fetch_rsrc(
        struct si_shader_context *ctx = si_shader_context(bld_base);
        LLVMValueRef rsrc_ptr = LLVMGetParam(ctx->main_fn,
                                             SI_PARAM_IMAGES);
-       LLVMValueRef index, tmp;
-       bool dcc_off = target != TGSI_TEXTURE_BUFFER && is_store;
+       LLVMValueRef index;
+       bool dcc_off = is_store;
 
        assert(image->Register.File == TGSI_FILE_IMAGE);
 
@@ -3274,8 +3292,7 @@ image_fetch_rsrc(
 
                index = LLVMConstInt(ctx->i32, image->Register.Index, 0);
 
-               if (images_writemask & (1 << image->Register.Index) &&
-                   target != TGSI_TEXTURE_BUFFER)
+               if (images_writemask & (1 << image->Register.Index))
                        dcc_off = true;
        } else {
                /* From the GL_ARB_shader_image_load_store extension spec:
@@ -3292,23 +3309,9 @@ image_fetch_rsrc(
                                                   SI_NUM_IMAGES);
        }
 
-       if (target == TGSI_TEXTURE_BUFFER) {
-               LLVMBuilderRef builder = ctx->gallivm.builder;
-
-               rsrc_ptr = LLVMBuildPointerCast(builder, rsrc_ptr,
-                                               const_array(ctx->v4i32, 0), "");
-               index = LLVMBuildMul(builder, index,
-                                    LLVMConstInt(ctx->i32, 2, 0), "");
-               index = LLVMBuildAdd(builder, index,
-                                    LLVMConstInt(ctx->i32, 1, 0), "");
-               *rsrc = ac_build_indexed_load_const(&ctx->ac, rsrc_ptr, index);
-               return;
-       }
-
-       tmp = ac_build_indexed_load_const(&ctx->ac, rsrc_ptr, index);
-       if (dcc_off)
-               tmp = force_dcc_off(ctx, tmp);
-       *rsrc = tmp;
+       *rsrc = load_image_desc(ctx, rsrc_ptr, index, target);
+       if (dcc_off && target != TGSI_TEXTURE_BUFFER)
+               *rsrc = force_dcc_off(ctx, *rsrc);
 }
 
 static LLVMValueRef image_fetch_coords(