diff options
author | Tom Stellard <[email protected]> | 2010-05-14 02:15:49 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2010-05-16 20:20:55 +0200 |
commit | 9d3c57281e4fe3842b41578c65bab5a6e23d76c8 (patch) | |
tree | b57cdd65ddaaf9d3aaac60771a4dfc9075bf4493 /src | |
parent | 997f2eac5eeed75af0e6d02466d96e7d531822c6 (diff) |
r300/compiler: fix peephole optimizer
Tested-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/r300/compiler/radeon_optimize.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c index 80e3eeacfc1..fd608ccb72a 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c @@ -82,6 +82,18 @@ static void peephole_scan_read(void * data, struct rc_instruction * inst, if (file != RC_FILE_TEMPORARY || index != s->Mov->U.I.DstReg.Index) return; + /* These instructions cannot read from the constants file. + * see radeonTransformTEX() + */ + if(s->Mov->U.I.SrcReg[0].File != RC_FILE_TEMPORARY && + s->Mov->U.I.SrcReg[0].File != RC_FILE_INPUT && + (inst->U.I.Opcode == RC_OPCODE_TEX || + inst->U.I.Opcode == RC_OPCODE_TXB || + inst->U.I.Opcode == RC_OPCODE_TXP || + inst->U.I.Opcode == RC_OPCODE_KIL)){ + s->Conflict = 1; + return; + } if ((mask & s->MovMask) == mask) { if (s->SourceClobbered) { s->Conflict = 1; @@ -109,7 +121,8 @@ static void peephole_scan_write(void * data, struct rc_instruction * inst, s->DefinedMask |= mask; else s->DefinedMask &= ~mask; - } else if (file == s->Mov->U.I.SrcReg[0].File && index == s->Mov->U.I.SrcReg[0].Index) { + } + if (file == s->Mov->U.I.SrcReg[0].File && index == s->Mov->U.I.SrcReg[0].Index) { if (mask & s->SourcedMask) s->SourceClobbered = 1; } else if (s->Mov->U.I.SrcReg[0].RelAddr && file == RC_FILE_ADDRESS) { |