mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 13:48:06 +02:00
radeon/llvm: Add helpers for loading and storing data from arrays.
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
2dc48984b2
commit
02873a7b0c
1 changed files with 41 additions and 10 deletions
|
|
@ -160,6 +160,43 @@ emit_array_fetch(
|
|||
return result;
|
||||
}
|
||||
|
||||
static LLVMValueRef
|
||||
load_value_from_array(
|
||||
struct lp_build_tgsi_context *bld_base,
|
||||
unsigned file,
|
||||
enum tgsi_opcode_type type,
|
||||
unsigned swizzle,
|
||||
unsigned reg_index,
|
||||
const struct tgsi_ind_register *reg_indirect)
|
||||
{
|
||||
struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
|
||||
LLVMBuilderRef builder = bld_base->base.gallivm->builder;
|
||||
struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_indirect);
|
||||
|
||||
return LLVMBuildExtractElement(builder,
|
||||
emit_array_fetch(bld_base, file, type, range, swizzle),
|
||||
emit_array_index(bld, reg_indirect, reg_index - range.First), "");
|
||||
|
||||
}
|
||||
|
||||
static LLVMValueRef store_value_to_array(
|
||||
struct lp_build_tgsi_context *bld_base,
|
||||
LLVMValueRef value,
|
||||
unsigned file,
|
||||
unsigned chan_index,
|
||||
unsigned reg_index,
|
||||
const struct tgsi_ind_register *reg_indirect)
|
||||
{
|
||||
struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
|
||||
LLVMBuilderRef builder = bld_base->base.gallivm->builder;
|
||||
struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_indirect);
|
||||
|
||||
return LLVMBuildInsertElement(builder,
|
||||
emit_array_fetch(bld_base, file, TGSI_TYPE_FLOAT, range, chan_index),
|
||||
value, emit_array_index(bld, reg_indirect, reg_index - range.First), "");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base,
|
||||
const struct tgsi_full_src_register *reg,
|
||||
enum tgsi_opcode_type type,
|
||||
|
|
@ -181,12 +218,8 @@ LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base,
|
|||
}
|
||||
|
||||
if (reg->Register.Indirect) {
|
||||
struct tgsi_declaration_range range = get_array_range(bld_base,
|
||||
reg->Register.File, ®->Indirect);
|
||||
return LLVMBuildExtractElement(builder,
|
||||
emit_array_fetch(bld_base, reg->Register.File, type, range, swizzle),
|
||||
emit_array_index(bld, ®->Indirect, reg->Register.Index - range.First),
|
||||
"");
|
||||
return load_value_from_array(bld_base, reg->Register.File, type,
|
||||
swizzle, reg->Register.Index, ®->Indirect);
|
||||
}
|
||||
|
||||
switch(reg->Register.File) {
|
||||
|
|
@ -430,10 +463,8 @@ void radeon_llvm_emit_store(
|
|||
reg->Register.File, ®->Indirect);
|
||||
|
||||
unsigned i, size = range.Last - range.First + 1;
|
||||
LLVMValueRef array = LLVMBuildInsertElement(builder,
|
||||
emit_array_fetch(bld_base, reg->Register.File, TGSI_TYPE_FLOAT, range, chan_index),
|
||||
value, emit_array_index(bld, ®->Indirect, reg->Register.Index - range.First), "");
|
||||
|
||||
LLVMValueRef array = store_value_to_array(bld_base, value, reg->Register.File, chan_index,
|
||||
reg->Register.Index, ®->Indirect);
|
||||
for (i = 0; i < size; ++i) {
|
||||
switch(reg->Register.File) {
|
||||
case TGSI_FILE_OUTPUT:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue