diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c | 9 | 
1 files changed, 8 insertions, 1 deletions
| diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c b/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c index 9df07edf2b..d0a64d936e 100644 --- a/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c +++ b/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c @@ -347,6 +347,7 @@ static void remap_normal_instruction(struct rc_instruction * fullinst,  {  	struct rc_sub_instruction * inst = &fullinst->U.I;  	const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->Opcode); +	unsigned int remapped_presub = 0;  	if (opcode->HasDstReg) {  		rc_register_file file = inst->DstReg.File; @@ -366,6 +367,12 @@ static void remap_normal_instruction(struct rc_instruction * fullinst,  			unsigned int i;  			unsigned int srcp_srcs = rc_presubtract_src_reg_count(  						inst->PreSub.Opcode); +			/* Make sure we only remap presubtract sources once in +			 * case more than one source register reads the +			 * presubtract result. */ +			if (remapped_presub) +				continue; +  			for(i = 0; i < srcp_srcs; i++) {  				file = inst->PreSub.SrcReg[i].File;  				index = inst->PreSub.SrcReg[i].Index; @@ -373,7 +380,7 @@ static void remap_normal_instruction(struct rc_instruction * fullinst,  				inst->PreSub.SrcReg[i].File = file;  				inst->PreSub.SrcReg[i].Index = index;  			} - +			remapped_presub = 1;  		}  		else {  			cb(userdata, fullinst, &file, &index); | 
