tgsi: support 2d indirect addressing
This commit is contained in:
@@ -211,9 +211,24 @@ _dump_register_src(
|
||||
{
|
||||
ENM(src->Register.File, file_names);
|
||||
if (src->Register.Dimension) {
|
||||
CHR('[');
|
||||
SID(src->Dimension.Index);
|
||||
CHR(']');
|
||||
if (src->Dimension.Indirect) {
|
||||
CHR( '[' );
|
||||
ENM( src->DimIndirect.File, file_names );
|
||||
CHR( '[' );
|
||||
SID( src->DimIndirect.Index );
|
||||
TXT( "]." );
|
||||
ENM( src->DimIndirect.SwizzleX, swizzle_names );
|
||||
if (src->Dimension.Index != 0) {
|
||||
if (src->Dimension.Index > 0)
|
||||
CHR( '+' );
|
||||
SID( src->Dimension.Index );
|
||||
}
|
||||
CHR( ']' );
|
||||
} else {
|
||||
CHR('[');
|
||||
SID(src->Dimension.Index);
|
||||
CHR(']');
|
||||
}
|
||||
}
|
||||
if (src->Register.Indirect) {
|
||||
CHR( '[' );
|
||||
|
||||
@@ -1046,7 +1046,12 @@ fetch_src_file_channel(const struct tgsi_exec_machine *mach,
|
||||
case TGSI_FILE_INPUT:
|
||||
case TGSI_FILE_SYSTEM_VALUE:
|
||||
for (i = 0; i < QUAD_SIZE; i++) {
|
||||
/* XXX: 2D indexing */
|
||||
/*
|
||||
if (TGSI_PROCESSOR_GEOMETRY == mach->Processor) {
|
||||
debug_printf("Fetching Input[%d] (2d=%d, 1d=%d)\n",
|
||||
index2D->i[i] * TGSI_EXEC_MAX_INPUT_ATTRIBS + index->i[i],
|
||||
index2D->i[i], index->i[i]);
|
||||
}*/
|
||||
chan->u[i] = mach->Inputs[index2D->i[i] * TGSI_EXEC_MAX_INPUT_ATTRIBS + index->i[i]].xyzw[swizzle].u[i];
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -102,7 +102,6 @@ scan_register_src(scan_register *reg,
|
||||
if (src->Register.Dimension) {
|
||||
/*FIXME: right now we don't support indirect
|
||||
* multidimensional addressing */
|
||||
debug_assert(!src->Dimension.Indirect);
|
||||
fill_scan_register2d(reg,
|
||||
src->Register.File,
|
||||
src->Register.Index,
|
||||
|
||||
@@ -732,11 +732,12 @@ ureg_DECL_immediate_int( struct ureg_program *ureg,
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
void
|
||||
ureg_emit_src( struct ureg_program *ureg,
|
||||
struct ureg_src src )
|
||||
{
|
||||
unsigned size = 1 + (src.Indirect ? 1 : 0) + (src.Dimension ? 1 : 0);
|
||||
unsigned size = 1 + (src.Indirect ? 1 : 0) +
|
||||
(src.Dimension ? (src.DimIndirect ? 2 : 1) : 0);
|
||||
|
||||
union tgsi_any_token *out = get_tokens( ureg, DOMAIN_INSN, size );
|
||||
unsigned n = 0;
|
||||
@@ -769,11 +770,27 @@ ureg_emit_src( struct ureg_program *ureg,
|
||||
}
|
||||
|
||||
if (src.Dimension) {
|
||||
out[0].src.Dimension = 1;
|
||||
out[n].dim.Indirect = 0;
|
||||
out[n].dim.Dimension = 0;
|
||||
out[n].dim.Padding = 0;
|
||||
out[n].dim.Index = src.DimensionIndex;
|
||||
if (src.DimIndirect) {
|
||||
out[0].src.Dimension = 1;
|
||||
out[n].dim.Indirect = 1;
|
||||
out[n].dim.Dimension = 0;
|
||||
out[n].dim.Padding = 0;
|
||||
out[n].dim.Index = src.DimensionIndex;
|
||||
n++;
|
||||
out[n].value = 0;
|
||||
out[n].src.File = src.DimIndFile;
|
||||
out[n].src.SwizzleX = src.DimIndSwizzle;
|
||||
out[n].src.SwizzleY = src.DimIndSwizzle;
|
||||
out[n].src.SwizzleZ = src.DimIndSwizzle;
|
||||
out[n].src.SwizzleW = src.DimIndSwizzle;
|
||||
out[n].src.Index = src.DimIndIndex;
|
||||
} else {
|
||||
out[0].src.Dimension = 1;
|
||||
out[n].dim.Indirect = 0;
|
||||
out[n].dim.Dimension = 0;
|
||||
out[n].dim.Padding = 0;
|
||||
out[n].dim.Index = src.DimensionIndex;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,14 +49,18 @@ struct ureg_src
|
||||
unsigned SwizzleZ : 2; /* TGSI_SWIZZLE_ */
|
||||
unsigned SwizzleW : 2; /* TGSI_SWIZZLE_ */
|
||||
unsigned Indirect : 1; /* BOOL */
|
||||
unsigned DimIndirect : 1; /* BOOL */
|
||||
unsigned Dimension : 1; /* BOOL */
|
||||
unsigned Absolute : 1; /* BOOL */
|
||||
unsigned Negate : 1; /* BOOL */
|
||||
int Index : 16; /* SINT */
|
||||
unsigned IndirectFile : 4; /* TGSI_FILE_ */
|
||||
int IndirectIndex : 16; /* SINT */
|
||||
unsigned IndirectSwizzle : 2; /* TGSI_SWIZZLE_ */
|
||||
int DimensionIndex : 16; /* SINT */
|
||||
unsigned IndirectFile : 4; /* TGSI_FILE_ */
|
||||
int IndirectIndex : 16; /* SINT */
|
||||
unsigned IndirectSwizzle : 2; /* TGSI_SWIZZLE_ */
|
||||
int DimensionIndex : 16; /* SINT */
|
||||
unsigned DimIndFile : 4; /* TGSI_FILE_ */
|
||||
int DimIndIndex : 16; /* SINT */
|
||||
unsigned DimIndSwizzle : 2; /* TGSI_SWIZZLE_ */
|
||||
};
|
||||
|
||||
/* Very similar to a tgsi_dst_register, removing unsupported fields
|
||||
@@ -821,15 +825,31 @@ ureg_src_indirect( struct ureg_src reg, struct ureg_src addr )
|
||||
return reg;
|
||||
}
|
||||
|
||||
static INLINE struct ureg_src
|
||||
static INLINE struct ureg_src
|
||||
ureg_src_dimension( struct ureg_src reg, int index )
|
||||
{
|
||||
assert(reg.File != TGSI_FILE_NULL);
|
||||
reg.Dimension = 1;
|
||||
reg.DimIndirect = 0;
|
||||
reg.DimensionIndex = index;
|
||||
return reg;
|
||||
}
|
||||
|
||||
|
||||
static INLINE struct ureg_src
|
||||
ureg_src_dimension_indirect( struct ureg_src reg, struct ureg_src addr,
|
||||
int index )
|
||||
{
|
||||
assert(reg.File != TGSI_FILE_NULL);
|
||||
reg.Dimension = 1;
|
||||
reg.DimIndirect = 1;
|
||||
reg.DimensionIndex = index;
|
||||
reg.DimIndFile = addr.File;
|
||||
reg.DimIndIndex = addr.Index;
|
||||
reg.DimIndSwizzle = addr.SwizzleX;
|
||||
return reg;
|
||||
}
|
||||
|
||||
static INLINE struct ureg_dst
|
||||
ureg_dst( struct ureg_src src )
|
||||
{
|
||||
@@ -874,6 +894,10 @@ ureg_src_register(unsigned file,
|
||||
src.Negate = 0;
|
||||
src.Dimension = 0;
|
||||
src.DimensionIndex = 0;
|
||||
src.DimIndirect = 0;
|
||||
src.DimIndFile = TGSI_FILE_NULL;
|
||||
src.DimIndIndex = 0;
|
||||
src.DimIndSwizzle = 0;
|
||||
|
||||
return src;
|
||||
}
|
||||
@@ -897,6 +921,10 @@ ureg_src( struct ureg_dst dst )
|
||||
src.Negate = 0;
|
||||
src.Dimension = 0;
|
||||
src.DimensionIndex = 0;
|
||||
src.DimIndirect = 0;
|
||||
src.DimIndFile = TGSI_FILE_NULL;
|
||||
src.DimIndIndex = 0;
|
||||
src.DimIndSwizzle = 0;
|
||||
|
||||
return src;
|
||||
}
|
||||
@@ -944,7 +972,11 @@ ureg_src_undef( void )
|
||||
src.Negate = 0;
|
||||
src.Dimension = 0;
|
||||
src.DimensionIndex = 0;
|
||||
|
||||
src.DimIndirect = 0;
|
||||
src.DimIndFile = TGSI_FILE_NULL;
|
||||
src.DimIndIndex = 0;
|
||||
src.DimIndSwizzle = 0;
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user