mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	GPU: Don't mark uniform buffers and registers as used for instructions which don't have them.
Like the MOV32I and FMUL32I instructions. This fixes a potential crash when using these instructions.
This commit is contained in:
		
							parent
							
								
									0e13d9cb7b
								
							
						
					
					
						commit
						eab7457c00
					
				| @ -526,6 +526,7 @@ public: | |||||||
|     enum class Type { |     enum class Type { | ||||||
|         Trivial, |         Trivial, | ||||||
|         Arithmetic, |         Arithmetic, | ||||||
|  |         ArithmeticImmediate, | ||||||
|         ArithmeticInteger, |         ArithmeticInteger, | ||||||
|         ArithmeticIntegerImmediate, |         ArithmeticIntegerImmediate, | ||||||
|         Bfe, |         Bfe, | ||||||
| @ -655,7 +656,7 @@ private: | |||||||
|             INST("0100110001101---", Id::FMUL_C, Type::Arithmetic, "FMUL_C"), |             INST("0100110001101---", Id::FMUL_C, Type::Arithmetic, "FMUL_C"), | ||||||
|             INST("0101110001101---", Id::FMUL_R, Type::Arithmetic, "FMUL_R"), |             INST("0101110001101---", Id::FMUL_R, Type::Arithmetic, "FMUL_R"), | ||||||
|             INST("0011100-01101---", Id::FMUL_IMM, Type::Arithmetic, "FMUL_IMM"), |             INST("0011100-01101---", Id::FMUL_IMM, Type::Arithmetic, "FMUL_IMM"), | ||||||
|             INST("00011110--------", Id::FMUL32_IMM, Type::Arithmetic, "FMUL32_IMM"), |             INST("00011110--------", Id::FMUL32_IMM, Type::ArithmeticImmediate, "FMUL32_IMM"), | ||||||
|             INST("0100110000010---", Id::IADD_C, Type::ArithmeticInteger, "IADD_C"), |             INST("0100110000010---", Id::IADD_C, Type::ArithmeticInteger, "IADD_C"), | ||||||
|             INST("0101110000010---", Id::IADD_R, Type::ArithmeticInteger, "IADD_R"), |             INST("0101110000010---", Id::IADD_R, Type::ArithmeticInteger, "IADD_R"), | ||||||
|             INST("0011100-00010---", Id::IADD_IMM, Type::ArithmeticInteger, "IADD_IMM"), |             INST("0011100-00010---", Id::IADD_IMM, Type::ArithmeticInteger, "IADD_IMM"), | ||||||
| @ -676,7 +677,7 @@ private: | |||||||
|             INST("0100110010011---", Id::MOV_C, Type::Arithmetic, "MOV_C"), |             INST("0100110010011---", Id::MOV_C, Type::Arithmetic, "MOV_C"), | ||||||
|             INST("0101110010011---", Id::MOV_R, Type::Arithmetic, "MOV_R"), |             INST("0101110010011---", Id::MOV_R, Type::Arithmetic, "MOV_R"), | ||||||
|             INST("0011100-10011---", Id::MOV_IMM, Type::Arithmetic, "MOV_IMM"), |             INST("0011100-10011---", Id::MOV_IMM, Type::Arithmetic, "MOV_IMM"), | ||||||
|             INST("000000010000----", Id::MOV32_IMM, Type::Arithmetic, "MOV32_IMM"), |             INST("000000010000----", Id::MOV32_IMM, Type::ArithmeticImmediate, "MOV32_IMM"), | ||||||
|             INST("0100110001100---", Id::FMNMX_C, Type::Arithmetic, "FMNMX_C"), |             INST("0100110001100---", Id::FMNMX_C, Type::Arithmetic, "FMNMX_C"), | ||||||
|             INST("0101110001100---", Id::FMNMX_R, Type::Arithmetic, "FMNMX_R"), |             INST("0101110001100---", Id::FMNMX_R, Type::Arithmetic, "FMNMX_R"), | ||||||
|             INST("0011100-01100---", Id::FMNMX_IMM, Type::Arithmetic, "FMNMX_IMM"), |             INST("0011100-01100---", Id::FMNMX_IMM, Type::Arithmetic, "FMNMX_IMM"), | ||||||
|  | |||||||
| @ -852,11 +852,6 @@ private: | |||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             case OpCode::Id::MOV32_IMM: { |  | ||||||
|                 // mov32i doesn't have abs or neg bits.
 |  | ||||||
|                 regs.SetRegisterToFloat(instr.gpr0, 0, GetImmediate32(instr), 1, 1); |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|             case OpCode::Id::FMUL_C: |             case OpCode::Id::FMUL_C: | ||||||
|             case OpCode::Id::FMUL_R: |             case OpCode::Id::FMUL_R: | ||||||
|             case OpCode::Id::FMUL_IMM: { |             case OpCode::Id::FMUL_IMM: { | ||||||
| @ -864,13 +859,6 @@ private: | |||||||
|                                         instr.alu.saturate_d); |                                         instr.alu.saturate_d); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case OpCode::Id::FMUL32_IMM: { |  | ||||||
|                 // fmul32i doesn't have abs or neg bits.
 |  | ||||||
|                 regs.SetRegisterToFloat( |  | ||||||
|                     instr.gpr0, 0, |  | ||||||
|                     regs.GetRegisterAsFloat(instr.gpr8) + " * " + GetImmediate32(instr), 1, 1); |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|             case OpCode::Id::FADD_C: |             case OpCode::Id::FADD_C: | ||||||
|             case OpCode::Id::FADD_R: |             case OpCode::Id::FADD_R: | ||||||
|             case OpCode::Id::FADD_IMM: { |             case OpCode::Id::FADD_IMM: { | ||||||
| @ -943,6 +931,21 @@ private: | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |         case OpCode::Type::ArithmeticImmediate: { | ||||||
|  |             switch (opcode->GetId()) { | ||||||
|  |             case OpCode::Id::MOV32_IMM: { | ||||||
|  |                 regs.SetRegisterToFloat(instr.gpr0, 0, GetImmediate32(instr), 1, 1); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             case OpCode::Id::FMUL32_IMM: { | ||||||
|  |                 regs.SetRegisterToFloat( | ||||||
|  |                     instr.gpr0, 0, | ||||||
|  |                     regs.GetRegisterAsFloat(instr.gpr8) + " * " + GetImmediate32(instr), 1, 1); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         case OpCode::Type::Bfe: { |         case OpCode::Type::Bfe: { | ||||||
|             ASSERT_MSG(!instr.bfe.negate_b, "Unimplemented"); |             ASSERT_MSG(!instr.bfe.negate_b, "Unimplemented"); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Subv
						Subv