[Mesa-dev] [PATCH 09/16] gallium/radeon: pass indirect register info into get_alloca_for_array
Nicolai Hähnle
nhaehnle at gmail.com
Wed Aug 10 19:23:34 UTC 2016
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
To have the same signature as get_array_range.
---
src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
index 994c7da..531a8fe 100644
--- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
+++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
@@ -151,28 +151,29 @@ get_array_range(struct lp_build_tgsi_context *bld_base,
return array->range;
}
range.First = 0;
range.Last = bld_base->info->file_max[File];
return range;
}
static LLVMValueRef get_alloca_for_array(struct lp_build_tgsi_context *bld_base,
unsigned file,
- unsigned index)
+ unsigned index,
+ const struct tgsi_ind_register *reg)
{
const struct radeon_llvm_array *array;
if (file != TGSI_FILE_TEMPORARY)
return NULL;
- array = get_temp_array(bld_base, index, NULL);
+ array = get_temp_array(bld_base, index, reg);
if (!array)
return NULL;
return array->alloca;
}
static LLVMValueRef
emit_array_index(struct lp_build_tgsi_soa_context *bld,
const struct tgsi_ind_register *reg,
unsigned offset)
@@ -240,21 +241,21 @@ load_value_from_array(struct lp_build_tgsi_context *bld_base,
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);
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_index, reg_indirect);
LLVMValueRef index = emit_array_index(bld, reg_indirect, reg_index - range.First);
- LLVMValueRef array = get_alloca_for_array(bld_base, file, reg_index);
+ LLVMValueRef array = get_alloca_for_array(bld_base, file, reg_index, reg_indirect);
LLVMValueRef ptr, val, indices[2];
if (!array) {
/* Handle the case where the array is stored as a vector. */
return LLVMBuildExtractElement(builder,
emit_array_fetch(bld_base, file, type, range, swizzle),
index, "");
}
index = LLVMBuildMul(builder, index, lp_build_const_int32(gallivm, TGSI_NUM_CHANNELS), "");
@@ -280,21 +281,21 @@ store_value_to_array(struct lp_build_tgsi_context *bld_base,
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);
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_index, reg_indirect);
LLVMValueRef index = emit_array_index(bld, reg_indirect, reg_index - range.First);
- LLVMValueRef array = get_alloca_for_array(bld_base, file, reg_index);
+ LLVMValueRef array = get_alloca_for_array(bld_base, file, reg_index, reg_indirect);
if (array) {
LLVMValueRef indices[2];
index = LLVMBuildMul(builder, index, lp_build_const_int32(gallivm, TGSI_NUM_CHANNELS), "");
index = LLVMBuildAdd(builder, index, lp_build_const_int32(gallivm, chan_index), "");
indices[0] = bld_base->uint_bld.zero;
indices[1] = index;
LLVMValueRef pointer = LLVMBuildGEP(builder, array, indices, 2, "");
LLVMBuildStore(builder, value, pointer);
return NULL;
@@ -617,21 +618,21 @@ void radeon_llvm_emit_store(struct lp_build_tgsi_context *bld_base,
if (reg->Register.Indirect) {
struct tgsi_declaration_range range = get_array_range(bld_base,
reg->Register.File, reg->Register.Index, ®->Indirect);
unsigned i, size = range.Last - range.First + 1;
unsigned file = reg->Register.File;
unsigned reg_index = reg->Register.Index;
LLVMValueRef array = store_value_to_array(bld_base, value, file, chan_index,
reg_index, ®->Indirect);
- if (get_alloca_for_array(bld_base, file, reg_index)) {
+ if (get_alloca_for_array(bld_base, file, reg_index, ®->Indirect)) {
continue;
}
for (i = 0; i < size; ++i) {
switch(reg->Register.File) {
case TGSI_FILE_OUTPUT:
temp_ptr = bld->outputs[i + range.First][chan_index];
break;
case TGSI_FILE_TEMPORARY:
if (range.First + i >= ctx->temps_count)
--
2.7.4
More information about the mesa-dev
mailing list