summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-06-09 17:48:11 +0200
committerNicolai Hähnle <nicolai.haehnle@amd.com>2017-07-05 12:33:54 +0200
commit9b5e45f32703a04aaea9ef85e1d8ec3b706c27eb (patch)
tree7926637040d6ae66ce3a2bdefa565638e784c86a
parenta8a72110b54745b6a15799ce283414ed5b904b28 (diff)
radeonsi/nir: add image descriptor loading
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_internal.h3
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_nir.c15
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c22
3 files changed, 32 insertions, 8 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
index e1212beed9..feaa82da8d 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -316,6 +316,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,
diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
index 9ad68f401b..f02abab151 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -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)
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
index dc69cbec3c..3dac14da84 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
@@ -150,22 +150,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;
}
/**
@@ -224,9 +230,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(