Browse Source

radeonsi/nir: add image descriptor loading

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
tags/17.3-branchpoint
Nicolai Hähnle 8 years ago
parent
commit
8d23575c96

+ 3
- 0
src/gallium/drivers/radeonsi/si_shader_internal.h View File

LLVMValueRef si_load_sampler_desc(struct si_shader_context *ctx, LLVMValueRef si_load_sampler_desc(struct si_shader_context *ctx,
LLVMValueRef list, LLVMValueRef index, LLVMValueRef list, LLVMValueRef index,
enum ac_descriptor_type type); 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( void si_llvm_load_input_vs(
struct si_shader_context *ctx, struct si_shader_context *ctx,

+ 15
- 0
src/gallium/drivers/radeonsi/si_shader_nir.c View File

LLVMConstInt(ctx->ac.i32, base_index + constant_index, false), 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); assert(base_index + constant_index < ctx->num_samplers);


if (dynamic_index) if (dynamic_index)

+ 14
- 8
src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c View File

} }
} }


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; LLVMBuilderRef builder = ctx->gallivm.builder;
LLVMValueRef rsrc;


if (target == TGSI_TEXTURE_BUFFER) {
if (desc_type == AC_DESC_BUFFER) {
index = LLVMBuildMul(builder, index, index = LLVMBuildMul(builder, index,
LLVMConstInt(ctx->i32, 2, 0), ""); LLVMConstInt(ctx->i32, 2, 0), "");
index = LLVMBuildAdd(builder, index, index = LLVMBuildAdd(builder, index,
ctx->i32_1, ""); ctx->i32_1, "");
list = LLVMBuildPointerCast(builder, list, list = LLVMBuildPointerCast(builder, list,
si_const_array(ctx->v4i32, 0), ""); 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;
} }


/** /**
index = LLVMConstInt(ctx->i32, 0, 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);
*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( static LLVMValueRef image_fetch_coords(

Loading…
Cancel
Save