diff options
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader_internal.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader_nir.c | 15 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c | 22 |
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( |