summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2017-03-30 16:55:58 +0200
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>2017-06-14 10:04:36 +0200
commit285ec4463b62636e792acd58aa63ea553062609f (patch)
treea99f2efe03e68d1b2835797d9b6449173b666f7a
parent950b5ffa31c1e67679ca960704a6d5eb22e6d00d (diff)
radeonsi: add support for loading bindless images
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
index 00f0a418746..e72052c4459 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
@@ -184,8 +184,6 @@ image_fetch_rsrc(
LLVMValueRef index;
bool dcc_off = is_store;
- assert(image->Register.File == TGSI_FILE_IMAGE);
-
if (!image->Register.Indirect) {
const struct tgsi_shader_info *info = bld_base->info;
unsigned images_writemask = info->images_store |
@@ -214,6 +212,18 @@ image_fetch_rsrc(
index, "");
}
+ if (image->Register.File != TGSI_FILE_IMAGE) {
+ struct gallivm_state *gallivm = &ctx->gallivm;
+ LLVMBuilderRef builder = gallivm->builder;
+
+ LLVMValueRef ptr =
+ lp_build_emit_fetch_src(bld_base, image,
+ TGSI_TYPE_UNSIGNED64, 0);
+ rsrc_ptr = LLVMBuildIntToPtr(builder, ptr,
+ si_const_array(ctx->v8i32, 0), "");
+ 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);
@@ -373,7 +383,8 @@ static void load_fetch_args(
buffer_append_args(ctx, emit_data, rsrc, ctx->i32_0,
offset, false, false);
- } else if (inst->Src[0].Register.File == TGSI_FILE_IMAGE) {
+ } else if (inst->Src[0].Register.File == TGSI_FILE_IMAGE ||
+ tgsi_is_bindless_image_file(inst->Src[0].Register.File)) {
LLVMValueRef coords;
image_fetch_rsrc(bld_base, &inst->Src[0], false, target, &rsrc);
@@ -537,8 +548,9 @@ static bool is_oneway_access_only(const struct tgsi_full_instruction *inst,
* images.
*/
if (inst->Src[0].Register.File == TGSI_FILE_BUFFER ||
- (inst->Src[0].Register.File == TGSI_FILE_IMAGE &&
- inst->Memory.Texture == TGSI_TEXTURE_BUFFER)) {
+ (inst->Memory.Texture == TGSI_TEXTURE_BUFFER &&
+ (inst->Src[0].Register.File == TGSI_FILE_IMAGE ||
+ tgsi_is_bindless_image_file(inst->Src[0].Register.File)))) {
if (!shader_buffers_reverse_access_mask &&
!(info->images_buffers & images_reverse_access_mask))
return true;
@@ -639,7 +651,8 @@ static void store_fetch_args(
buffer_append_args(ctx, emit_data, rsrc, ctx->i32_0,
offset, false, false);
- } else if (inst->Dst[0].Register.File == TGSI_FILE_IMAGE) {
+ } else if (inst->Dst[0].Register.File == TGSI_FILE_IMAGE ||
+ tgsi_is_bindless_image_file(inst->Dst[0].Register.File)) {
unsigned target = inst->Memory.Texture;
LLVMValueRef coords;
@@ -858,7 +871,8 @@ static void atomic_fetch_args(
buffer_append_args(ctx, emit_data, rsrc, ctx->i32_0,
offset, true, false);
- } else if (inst->Src[0].Register.File == TGSI_FILE_IMAGE) {
+ } else if (inst->Src[0].Register.File == TGSI_FILE_IMAGE ||
+ tgsi_is_bindless_image_file(inst->Src[0].Register.File)) {
unsigned target = inst->Memory.Texture;
LLVMValueRef coords;