radeonsi/nir: add image descriptor loading
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 9 Jun 2017 15:48:11 +0000 (17:48 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:39 +0000 (14:55 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader_internal.h
src/gallium/drivers/radeonsi/si_shader_nir.c
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c

index 1483ebc..26d7d09 100644 (file)
@@ -317,6 +317,9 @@ void si_shader_context_init_mem(struct si_shader_context *ctx);
 LLVMValueRef si_load_sampler_desc(struct si_shader_context *ctx,
                                  LLVMValueRef list, LLVMValueRef index,
                                  enum ac_descriptor_type type);
+LLVMValueRef si_load_image_desc(struct si_shader_context *ctx,
+                               LLVMValueRef list, LLVMValueRef index,
+                               enum ac_descriptor_type desc_type, bool dcc_off);
 
 void si_llvm_load_input_vs(
        struct si_shader_context *ctx,
index d9893bc..076fce8 100644 (file)
@@ -363,6 +363,21 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi,
                             LLVMConstInt(ctx->ac.i32, base_index + constant_index, false),
                             "");
 
+       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);
+
+               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);
+       }
+
        assert(base_index + constant_index < ctx->num_samplers);
 
        if (dynamic_index)
index e5afeb0..e04a879 100644 (file)
@@ -143,22 +143,28 @@ static LLVMValueRef force_dcc_off(struct si_shader_context *ctx,
        }
 }
 
-static LLVMValueRef load_image_desc(struct si_shader_context *ctx,
-                                   LLVMValueRef list, LLVMValueRef index,
-                                   unsigned target)
+LLVMValueRef si_load_image_desc(struct si_shader_context *ctx,
+                               LLVMValueRef list, LLVMValueRef index,
+                               enum ac_descriptor_type desc_type, bool dcc_off)
 {
        LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMValueRef rsrc;
 
-       if (target == TGSI_TEXTURE_BUFFER) {
+       if (desc_type == AC_DESC_BUFFER) {
                index = LLVMBuildMul(builder, index,
                                     LLVMConstInt(ctx->i32, 2, 0), "");
                index = LLVMBuildAdd(builder, index,
                                     ctx->i32_1, "");
                list = LLVMBuildPointerCast(builder, list,
                                            si_const_array(ctx->v4i32, 0), "");
+       } else {
+               assert(desc_type == AC_DESC_IMAGE);
        }
 
-       return ac_build_indexed_load_const(&ctx->ac, list, index);
+       rsrc = ac_build_indexed_load_const(&ctx->ac, list, index);
+       if (dcc_off)
+               rsrc = force_dcc_off(ctx, rsrc);
+       return rsrc;
 }
 
 /**
@@ -217,9 +223,9 @@ image_fetch_rsrc(
                index = LLVMConstInt(ctx->i32, 0, 0);
        }
 
-       *rsrc = load_image_desc(ctx, rsrc_ptr, index, target);
-       if (dcc_off && target != TGSI_TEXTURE_BUFFER)
-               *rsrc = force_dcc_off(ctx, *rsrc);
+       *rsrc = si_load_image_desc(ctx, rsrc_ptr, index,
+                                  target == TGSI_TEXTURE_BUFFER ? AC_DESC_BUFFER : AC_DESC_IMAGE,
+                                  dcc_off);
 }
 
 static LLVMValueRef image_fetch_coords(