mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #3787 from wwylele/shader-jit-state
shader/jit: preserve integer & condition register across invocation
This commit is contained in:
		
						commit
						cf9bfe0690
					
				
					 1 changed files with 23 additions and 4 deletions
				
			
		|  | @ -580,6 +580,18 @@ void JitShader::Compile_RSQ(Instruction instr) { | ||||||
| void JitShader::Compile_NOP(Instruction instr) {} | void JitShader::Compile_NOP(Instruction instr) {} | ||||||
| 
 | 
 | ||||||
| void JitShader::Compile_END(Instruction instr) { | void JitShader::Compile_END(Instruction instr) { | ||||||
|  |     // Save conditional code
 | ||||||
|  |     mov(byte[STATE + offsetof(UnitState, conditional_code[0])], COND0.cvt8()); | ||||||
|  |     mov(byte[STATE + offsetof(UnitState, conditional_code[1])], COND1.cvt8()); | ||||||
|  | 
 | ||||||
|  |     // Save address/loop registers
 | ||||||
|  |     sar(ADDROFFS_REG_0, 4); | ||||||
|  |     sar(ADDROFFS_REG_1, 4); | ||||||
|  |     sar(LOOPCOUNT_REG, 4); | ||||||
|  |     mov(dword[STATE + offsetof(UnitState, address_registers[0])], ADDROFFS_REG_0.cvt32()); | ||||||
|  |     mov(dword[STATE + offsetof(UnitState, address_registers[1])], ADDROFFS_REG_1.cvt32()); | ||||||
|  |     mov(dword[STATE + offsetof(UnitState, address_registers[2])], LOOPCOUNT_REG); | ||||||
|  | 
 | ||||||
|     ABI_PopRegistersAndAdjustStack(*this, ABI_ALL_CALLEE_SAVED, 8, 16); |     ABI_PopRegistersAndAdjustStack(*this, ABI_ALL_CALLEE_SAVED, 8, 16); | ||||||
|     ret(); |     ret(); | ||||||
| } | } | ||||||
|  | @ -896,10 +908,17 @@ void JitShader::Compile(const std::array<u32, MAX_PROGRAM_CODE_LENGTH>* program_ | ||||||
|     mov(UNIFORMS, ABI_PARAM1); |     mov(UNIFORMS, ABI_PARAM1); | ||||||
|     mov(STATE, ABI_PARAM2); |     mov(STATE, ABI_PARAM2); | ||||||
| 
 | 
 | ||||||
|     // Zero address/loop  registers
 |     // Load address/loop registers
 | ||||||
|     xor_(ADDROFFS_REG_0.cvt32(), ADDROFFS_REG_0.cvt32()); |     movsxd(ADDROFFS_REG_0, dword[STATE + offsetof(UnitState, address_registers[0])]); | ||||||
|     xor_(ADDROFFS_REG_1.cvt32(), ADDROFFS_REG_1.cvt32()); |     movsxd(ADDROFFS_REG_1, dword[STATE + offsetof(UnitState, address_registers[1])]); | ||||||
|     xor_(LOOPCOUNT_REG, LOOPCOUNT_REG); |     mov(LOOPCOUNT_REG, dword[STATE + offsetof(UnitState, address_registers[2])]); | ||||||
|  |     shl(ADDROFFS_REG_0, 4); | ||||||
|  |     shl(ADDROFFS_REG_1, 4); | ||||||
|  |     shl(LOOPCOUNT_REG, 4); | ||||||
|  | 
 | ||||||
|  |     // Load conditional code
 | ||||||
|  |     mov(COND0, byte[STATE + offsetof(UnitState, conditional_code[0])]); | ||||||
|  |     mov(COND1, byte[STATE + offsetof(UnitState, conditional_code[1])]); | ||||||
| 
 | 
 | ||||||
|     // Used to set a register to one
 |     // Used to set a register to one
 | ||||||
|     static const __m128 one = {1.f, 1.f, 1.f, 1.f}; |     static const __m128 one = {1.f, 1.f, 1.f, 1.f}; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue