Mesa (mesa_7_7_branch): gallium/tgsi: fix soa dependencies in mul and cmp instructions
Zack Rusin
zack at kemper.freedesktop.org
Sat Feb 6 00:32:47 UTC 2010
Module: Mesa
Branch: mesa_7_7_branch
Commit: fb1fe8e76f133b8c9e3713cc7c263a8e63fab40c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb1fe8e76f133b8c9e3713cc7c263a8e63fab40c
Author: Zack Rusin <zackr at vmware.com>
Date: Fri Feb 5 19:22:45 2010 -0500
gallium/tgsi: fix soa dependencies in mul and cmp instructions
master has this done in a lot nicer way, this is a simple patch to
stop the bleeding in a minimally intrusive manner.
---
src/gallium/auxiliary/tgsi/tgsi_exec.c | 57 ++++++++++++++++++++++++--------
1 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index bd9b986..d91b27a 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -336,7 +336,9 @@ tgsi_exec_machine_bind_shader(
/* XXX we only handle SOA dependencies properly for MOV/SWZ
* at this time!
*/
- if (opcode != TGSI_OPCODE_MOV) {
+ if (opcode != TGSI_OPCODE_MOV &&
+ opcode != TGSI_OPCODE_MUL &&
+ opcode != TGSI_OPCODE_CMP) {
debug_printf("Warning: SOA dependency in instruction"
" is not handled:\n");
tgsi_dump_instruction(&parse.FullToken.FullInstruction,
@@ -1852,7 +1854,7 @@ exec_instruction(
int *pc )
{
uint chan_index;
- union tgsi_exec_channel r[10];
+ union tgsi_exec_channel r[3 * NUM_CHANNELS];
union tgsi_exec_channel d[8];
(*pc)++;
@@ -1980,14 +1982,27 @@ exec_instruction(
break;
case TGSI_OPCODE_MUL:
- FOR_EACH_ENABLED_CHANNEL( *inst, chan_index )
- {
- FETCH(&r[0], 0, chan_index);
- FETCH(&r[1], 1, chan_index);
+ if (inst->Flags & SOA_DEPENDENCY_FLAG) {
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index )
+ {
+ FETCH(&r[chan_index], 0, chan_index);
+ FETCH(&r[chan_index + NUM_CHANNELS], 1, chan_index);
+ }
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index )
+ {
+ micro_mul( &r[chan_index], &r[chan_index], &r[chan_index + NUM_CHANNELS] );
+ STORE(&r[chan_index], 0, chan_index);
+ }
+ } else {
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index )
+ {
+ FETCH(&r[0], 0, chan_index);
+ FETCH(&r[1], 1, chan_index);
- micro_mul( &r[0], &r[0], &r[1] );
+ micro_mul( &r[0], &r[0], &r[1] );
- STORE(&r[0], 0, chan_index);
+ STORE(&r[0], 0, chan_index);
+ }
}
break;
@@ -2663,14 +2678,28 @@ exec_instruction(
break;
case TGSI_OPCODE_CMP:
- FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
- FETCH(&r[0], 0, chan_index);
- FETCH(&r[1], 1, chan_index);
- FETCH(&r[2], 2, chan_index);
+ if (inst->Flags & SOA_DEPENDENCY_FLAG) {
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
+ FETCH(&r[chan_index], 0, chan_index);
+ FETCH(&r[chan_index + NUM_CHANNELS], 1, chan_index);
+ FETCH(&r[chan_index + 2 * NUM_CHANNELS], 2, chan_index);
+ }
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
+ micro_lt( &r[chan_index], &r[chan_index],
+ &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[chan_index + NUM_CHANNELS],
+ &r[chan_index + 2*NUM_CHANNELS] );
+ STORE(&r[chan_index], 0, chan_index);
+ }
+ } else {
+ FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
+ FETCH(&r[0], 0, chan_index);
+ FETCH(&r[1], 1, chan_index);
+ FETCH(&r[2], 2, chan_index);
- micro_lt( &r[0], &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[1], &r[2] );
+ micro_lt( &r[0], &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[1], &r[2] );
- STORE(&r[0], 0, chan_index);
+ STORE(&r[0], 0, chan_index);
+ }
}
break;
More information about the mesa-commit
mailing list