summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2011-03-08 06:54:14 +0100
committerMarek Olšák <[email protected]>2011-03-08 06:54:14 +0100
commit94818d4c6ac6585f6b036f9a8bf550f73b7ae4b4 (patch)
treef49732750d14c679c1b9cf454ec735194c11791b
parent4f3826117957b5ac1554b833af33d342360f655a (diff)
r300/compiler: detect constants harder
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_optimize.c12
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;