mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 19:40:10 +01:00
gallium/radeon: extract common lookup code into get_temp_array function
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
fa84296a5a
commit
b76aabffa2
1 changed files with 40 additions and 33 deletions
|
|
@ -111,58 +111,65 @@ static LLVMValueRef emit_swizzle(struct lp_build_tgsi_context *bld_base,
|
|||
LLVMConstVector(swizzles, 4), "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the description of the array covering the given temporary register
|
||||
* index.
|
||||
*/
|
||||
static const struct radeon_llvm_array *
|
||||
get_temp_array(struct lp_build_tgsi_context *bld_base,
|
||||
unsigned reg_index,
|
||||
const struct tgsi_ind_register *reg)
|
||||
{
|
||||
struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
|
||||
unsigned num_arrays = ctx->soa.bld_base.info->array_max[TGSI_FILE_TEMPORARY];
|
||||
unsigned i;
|
||||
|
||||
if (reg && reg->ArrayID > 0 && reg->ArrayID <= num_arrays)
|
||||
return &ctx->arrays[reg->ArrayID - 1];
|
||||
|
||||
for (i = 0; i < num_arrays; i++) {
|
||||
const struct radeon_llvm_array *array = &ctx->arrays[i];
|
||||
|
||||
if (reg_index >= array->range.First && reg_index <= array->range.Last)
|
||||
return array;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct tgsi_declaration_range
|
||||
get_array_range(struct lp_build_tgsi_context *bld_base,
|
||||
unsigned File, unsigned reg_index,
|
||||
const struct tgsi_ind_register *reg)
|
||||
{
|
||||
struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
|
||||
struct tgsi_declaration_range range;
|
||||
|
||||
if (!reg) {
|
||||
unsigned i;
|
||||
unsigned num_arrays = bld_base->info->array_max[TGSI_FILE_TEMPORARY];
|
||||
for (i = 0; i < num_arrays; i++) {
|
||||
const struct tgsi_declaration_range *range =
|
||||
&ctx->arrays[i].range;
|
||||
|
||||
if (reg_index >= range->First && reg_index <= range->Last) {
|
||||
return ctx->arrays[i].range;
|
||||
}
|
||||
}
|
||||
if (File == TGSI_FILE_TEMPORARY) {
|
||||
const struct radeon_llvm_array *array =
|
||||
get_temp_array(bld_base, reg_index, reg);
|
||||
if (array)
|
||||
return array->range;
|
||||
}
|
||||
|
||||
if (File != TGSI_FILE_TEMPORARY || !reg || reg->ArrayID == 0 ||
|
||||
reg->ArrayID > bld_base->info->array_max[TGSI_FILE_TEMPORARY]) {
|
||||
struct tgsi_declaration_range range;
|
||||
range.First = 0;
|
||||
range.Last = bld_base->info->file_max[File];
|
||||
return range;
|
||||
}
|
||||
|
||||
return ctx->arrays[reg->ArrayID - 1].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 i;
|
||||
unsigned num_arrays;
|
||||
struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
|
||||
const struct radeon_llvm_array *array;
|
||||
|
||||
if (file != TGSI_FILE_TEMPORARY)
|
||||
return NULL;
|
||||
|
||||
num_arrays = bld_base->info->array_max[TGSI_FILE_TEMPORARY];
|
||||
for (i = 0; i < num_arrays; i++) {
|
||||
const struct tgsi_declaration_range *range =
|
||||
&ctx->arrays[i].range;
|
||||
array = get_temp_array(bld_base, index, NULL);
|
||||
if (!array)
|
||||
return NULL;
|
||||
|
||||
if (index >= range->First && index <= range->Last) {
|
||||
return ctx->arrays[i].alloca;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return array->alloca;
|
||||
}
|
||||
|
||||
static LLVMValueRef
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue