mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	PICA: Fix MAD/MADI encoding
This commit is contained in:
		
							parent
							
								
									0cdf8ff102
								
							
						
					
					
						commit
						9aad2f29bb
					
				
					 3 changed files with 43 additions and 31 deletions
				
			
		|  | @ -179,9 +179,17 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con | |||
|                     AlignToColumn(kOutputColumnWidth); | ||||
|                     print_input(output, src1, swizzle.negate_src1, SelectorToString(swizzle.src1_selector)); | ||||
|                     AlignToColumn(kInputOperandColumnWidth); | ||||
|                     print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector)); | ||||
|                     if (src_is_inverted) { | ||||
|                       print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector)); | ||||
|                     } else { | ||||
|                       print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector), true, instr.mad.AddressRegisterName()); | ||||
|                     } | ||||
|                     AlignToColumn(kInputOperandColumnWidth); | ||||
|                     print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector)); | ||||
|                     if (src_is_inverted) { | ||||
|                       print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector), true, instr.mad.AddressRegisterName()); | ||||
|                     } else { | ||||
|                       print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector)); | ||||
|                     } | ||||
|                     AlignToColumn(kInputOperandColumnWidth); | ||||
|                     break; | ||||
|                 } | ||||
|  |  | |||
|  | @ -413,9 +413,12 @@ void RunInterpreter(UnitState<Debug>& state) { | |||
| 
 | ||||
|                 bool is_inverted = (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI); | ||||
| 
 | ||||
|                 const int address_offset = (instr.mad.address_register_index == 0) | ||||
|                                            ? 0 : state.address_registers[instr.mad.address_register_index - 1]; | ||||
| 
 | ||||
|                 const float24* src1_ = LookupSourceRegister(instr.mad.GetSrc1(is_inverted)); | ||||
|                 const float24* src2_ = LookupSourceRegister(instr.mad.GetSrc2(is_inverted)); | ||||
|                 const float24* src3_ = LookupSourceRegister(instr.mad.GetSrc3(is_inverted)); | ||||
|                 const float24* src2_ = LookupSourceRegister(instr.mad.GetSrc2(is_inverted) + (!is_inverted * address_offset)); | ||||
|                 const float24* src3_ = LookupSourceRegister(instr.mad.GetSrc3(is_inverted) + ( is_inverted * address_offset)); | ||||
| 
 | ||||
|                 const bool negate_src1 = ((bool)swizzle.negate_src1 != false); | ||||
|                 const bool negate_src2 = ((bool)swizzle.negate_src2 != false); | ||||
|  |  | |||
|  | @ -160,40 +160,41 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source | |||
|     ASSERT_MSG(src_offset == src_offset_disp, "Source register offset too large for int type"); | ||||
| 
 | ||||
|     unsigned operand_desc_id; | ||||
| 
 | ||||
|     const bool is_inverted = (0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed)); | ||||
| 
 | ||||
|     unsigned address_register_index; | ||||
|     unsigned offset_src; | ||||
| 
 | ||||
|     if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD || | ||||
|         instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI) { | ||||
|         // The MAD and MADI instructions do not use the address offset registers, so loading the
 | ||||
|         // source is a bit simpler here
 | ||||
| 
 | ||||
|         operand_desc_id = instr.mad.operand_desc_id; | ||||
| 
 | ||||
|         // Load the source
 | ||||
|         MOVAPS(dest, MDisp(src_ptr, src_offset_disp)); | ||||
|         offset_src = is_inverted ? 3 : 2; | ||||
|         address_register_index = instr.mad.address_register_index; | ||||
|     } else { | ||||
|         operand_desc_id = instr.common.operand_desc_id; | ||||
|         offset_src = is_inverted ? 2 : 1; | ||||
|         address_register_index = instr.common.address_register_index; | ||||
|     } | ||||
| 
 | ||||
|         const bool is_inverted = (0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed)); | ||||
|         unsigned offset_src = is_inverted ? 2 : 1; | ||||
| 
 | ||||
|         if (src_num == offset_src && instr.common.address_register_index != 0) { | ||||
|             switch (instr.common.address_register_index) { | ||||
|             case 1: // address offset 1
 | ||||
|                 MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_0, SCALE_1, src_offset_disp)); | ||||
|                 break; | ||||
|             case 2: // address offset 2
 | ||||
|                 MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_1, SCALE_1, src_offset_disp)); | ||||
|                 break; | ||||
|             case 3: // address offset 3
 | ||||
|                 MOVAPS(dest, MComplex(src_ptr, LOOPCOUNT_REG, SCALE_1, src_offset_disp)); | ||||
|                 break; | ||||
|             default: | ||||
|                 UNREACHABLE(); | ||||
|                 break; | ||||
|             } | ||||
|         } else { | ||||
|             // Load the source
 | ||||
|             MOVAPS(dest, MDisp(src_ptr, src_offset_disp)); | ||||
|     if (src_num == offset_src && address_register_index != 0) { | ||||
|         switch (address_register_index) { | ||||
|         case 1: // address offset 1
 | ||||
|             MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_0, SCALE_1, src_offset_disp)); | ||||
|             break; | ||||
|         case 2: // address offset 2
 | ||||
|             MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_1, SCALE_1, src_offset_disp)); | ||||
|             break; | ||||
|         case 3: // address offset 3
 | ||||
|             MOVAPS(dest, MComplex(src_ptr, LOOPCOUNT_REG, SCALE_1, src_offset_disp)); | ||||
|             break; | ||||
|         default: | ||||
|             UNREACHABLE(); | ||||
|             break; | ||||
|         } | ||||
|     } else { | ||||
|         // Load the source
 | ||||
|         MOVAPS(dest, MDisp(src_ptr, src_offset_disp)); | ||||
|     } | ||||
| 
 | ||||
|     SwizzlePattern swiz = { g_state.vs.swizzle_data[operand_desc_id] }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue