tgsi: Implement predicated instructions in exec.

This commit is contained in:
Michal Krol 2009-11-24 09:03:41 +01:00
parent 59a70c364d
commit 0c54d76f37
2 changed files with 48 additions and 5 deletions

View File

@ -369,6 +369,7 @@ tgsi_exec_machine_create( void )
memset(mach, 0, sizeof(*mach));
mach->Addrs = &mach->Temps[TGSI_EXEC_TEMP_ADDR];
mach->Predicates = &mach->Temps[TGSI_EXEC_TEMP_P0];
/* Setup constants. */
for( i = 0; i < 4; i++ ) {
@ -1194,10 +1195,10 @@ fetch_src_file_channel(
assert(index->i[1] < TGSI_EXEC_NUM_PREDS);
assert(index->i[2] < TGSI_EXEC_NUM_PREDS);
assert(index->i[3] < TGSI_EXEC_NUM_PREDS);
chan->u[0] = mach->Addrs[0].xyzw[swizzle].u[0];
chan->u[1] = mach->Addrs[0].xyzw[swizzle].u[1];
chan->u[2] = mach->Addrs[0].xyzw[swizzle].u[2];
chan->u[3] = mach->Addrs[0].xyzw[swizzle].u[3];
chan->u[0] = mach->Predicates[0].xyzw[swizzle].u[0];
chan->u[1] = mach->Predicates[0].xyzw[swizzle].u[1];
chan->u[2] = mach->Predicates[0].xyzw[swizzle].u[2];
chan->u[3] = mach->Predicates[0].xyzw[swizzle].u[3];
break;
case TGSI_FILE_OUTPUT:
@ -1489,7 +1490,7 @@ store_dest(
case TGSI_FILE_PREDICATE:
index = reg->DstRegister.Index;
assert(index < TGSI_EXEC_NUM_PREDS);
dst = &mach->Addrs[index].xyzw[chan_index];
dst = &mach->Predicates[index].xyzw[chan_index];
break;
default:
@ -1497,6 +1498,47 @@ store_dest(
return;
}
if (inst->Instruction.Predicate) {
uint swizzle;
union tgsi_exec_channel *pred;
switch (chan_index) {
case CHAN_X:
swizzle = inst->InstructionPredicate.SwizzleX;
break;
case CHAN_Y:
swizzle = inst->InstructionPredicate.SwizzleY;
break;
case CHAN_Z:
swizzle = inst->InstructionPredicate.SwizzleZ;
break;
case CHAN_W:
swizzle = inst->InstructionPredicate.SwizzleW;
break;
default:
assert(0);
return;
}
assert(inst->InstructionPredicate.Index == 0);
pred = &mach->Predicates[inst->InstructionPredicate.Index].xyzw[swizzle];
if (inst->InstructionPredicate.Negate) {
for (i = 0; i < QUAD_SIZE; i++) {
if (pred->u[i]) {
execmask &= ~(1 << i);
}
}
} else {
for (i = 0; i < QUAD_SIZE; i++) {
if (!pred->u[i]) {
execmask &= ~(1 << i);
}
}
}
}
switch (inst->Instruction.Saturate) {
case TGSI_SAT_NONE:
for (i = 0; i < QUAD_SIZE; i++)

View File

@ -218,6 +218,7 @@ struct tgsi_exec_machine
struct tgsi_exec_vector Outputs[PIPE_MAX_ATTRIBS];
struct tgsi_exec_vector *Addrs;
struct tgsi_exec_vector *Predicates;
struct tgsi_sampler **Samplers;