tgsi: support 2d indirect addressing

This commit is contained in:
Zack Rusin
2010-06-11 10:35:24 -04:00
parent 27bc2de546
commit 2396967038
5 changed files with 86 additions and 18 deletions
+18 -3
View File
@@ -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( '[' );
+6 -1
View File
@@ -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;
-1
View File
@@ -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,
+24 -7
View File
@@ -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++;
}
+38 -6
View File
@@ -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;
}