diff options
author | Marek Olšák <[email protected]> | 2011-03-08 06:54:14 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2011-03-08 06:54:14 +0100 |
commit | 94818d4c6ac6585f6b036f9a8bf550f73b7ae4b4 (patch) | |
tree | f49732750d14c679c1b9cf454ec735194c11791b /src | |
parent | 4f3826117957b5ac1554b833af33d342360f655a (diff) |
r300/compiler: detect constants harder
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/r300/compiler/radeon_optimize.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c index 3915cb475be..c4e6a5e0a1f 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c @@ -311,14 +311,18 @@ static void constant_folding(struct radeon_compiler * c, struct rc_instruction * struct rc_constant * constant; struct rc_src_register newsrc; int have_real_reference; + unsigned int chan; - if (inst->U.I.SrcReg[src].Swizzle == RC_SWIZZLE_1111 || - inst->U.I.SrcReg[src].Swizzle == RC_SWIZZLE_0000 || - inst->U.I.SrcReg[src].Swizzle == RC_SWIZZLE_HHHH) { + /* If there are only 0, 0.5, 1, or _ swizzles, mark the source as a constant. */ + for (chan = 0; chan < 4; ++chan) + if (GET_SWZ(inst->U.I.SrcReg[src].Swizzle, chan) <= 3) + break; + if (chan == 4) { inst->U.I.SrcReg[src].File = RC_FILE_NONE; continue; } + /* Convert immediates to swizzles. */ if (inst->U.I.SrcReg[src].File != RC_FILE_CONSTANT || inst->U.I.SrcReg[src].RelAddr || inst->U.I.SrcReg[src].Index >= c->Program.Constants.Count) @@ -332,7 +336,7 @@ static void constant_folding(struct radeon_compiler * c, struct rc_instruction * newsrc = inst->U.I.SrcReg[src]; have_real_reference = 0; - for(unsigned int chan = 0; chan < 4; ++chan) { + for (chan = 0; chan < 4; ++chan) { unsigned int swz = GET_SWZ(newsrc.Swizzle, chan); unsigned int newswz; float imm; |