mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	pica/shader/jit: implement SETEMIT and EMIT
This commit is contained in:
		
							parent
							
								
									36981a5aa6
								
							
						
					
					
						commit
						8285ca4ad8
					
				
					 2 changed files with 49 additions and 2 deletions
				
			
		|  | @ -75,8 +75,8 @@ const JitFunction instr_table[64] = { | ||||||
|     &JitShader::Compile_IF,    // ifu
 |     &JitShader::Compile_IF,    // ifu
 | ||||||
|     &JitShader::Compile_IF,    // ifc
 |     &JitShader::Compile_IF,    // ifc
 | ||||||
|     &JitShader::Compile_LOOP,  // loop
 |     &JitShader::Compile_LOOP,  // loop
 | ||||||
|     nullptr,                   // emit
 |     &JitShader::Compile_EMIT,  // emit
 | ||||||
|     nullptr,                   // sete
 |     &JitShader::Compile_SETE,  // sete
 | ||||||
|     &JitShader::Compile_JMP,   // jmpc
 |     &JitShader::Compile_JMP,   // jmpc
 | ||||||
|     &JitShader::Compile_JMP,   // jmpu
 |     &JitShader::Compile_JMP,   // jmpu
 | ||||||
|     &JitShader::Compile_CMP,   // cmp
 |     &JitShader::Compile_CMP,   // cmp
 | ||||||
|  | @ -772,6 +772,51 @@ void JitShader::Compile_JMP(Instruction instr) { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void Emit(GSEmitter* emitter, Math::Vec4<float24> (*output)[16]) { | ||||||
|  |     emitter->Emit(*output); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void JitShader::Compile_EMIT(Instruction instr) { | ||||||
|  |     Label have_emitter, end; | ||||||
|  |     mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]); | ||||||
|  |     test(rax, rax); | ||||||
|  |     jnz(have_emitter); | ||||||
|  | 
 | ||||||
|  |     ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | ||||||
|  |     mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute EMIT on VS")); | ||||||
|  |     CallFarFunction(*this, LogCritical); | ||||||
|  |     ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | ||||||
|  |     jmp(end); | ||||||
|  | 
 | ||||||
|  |     L(have_emitter); | ||||||
|  |     ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | ||||||
|  |     mov(ABI_PARAM1, rax); | ||||||
|  |     mov(ABI_PARAM2, STATE); | ||||||
|  |     add(ABI_PARAM2, static_cast<Xbyak::uint32>(offsetof(UnitState, registers.output))); | ||||||
|  |     CallFarFunction(*this, Emit); | ||||||
|  |     ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | ||||||
|  |     L(end); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void JitShader::Compile_SETE(Instruction instr) { | ||||||
|  |     Label have_emitter, end; | ||||||
|  |     mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]); | ||||||
|  |     test(rax, rax); | ||||||
|  |     jnz(have_emitter); | ||||||
|  | 
 | ||||||
|  |     ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | ||||||
|  |     mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute SETEMIT on VS")); | ||||||
|  |     CallFarFunction(*this, LogCritical); | ||||||
|  |     ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); | ||||||
|  |     jmp(end); | ||||||
|  | 
 | ||||||
|  |     L(have_emitter); | ||||||
|  |     mov(byte[rax + offsetof(GSEmitter, vertex_id)], instr.setemit.vertex_id); | ||||||
|  |     mov(byte[rax + offsetof(GSEmitter, prim_emit)], instr.setemit.prim_emit); | ||||||
|  |     mov(byte[rax + offsetof(GSEmitter, winding)], instr.setemit.winding); | ||||||
|  |     L(end); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void JitShader::Compile_Block(unsigned end) { | void JitShader::Compile_Block(unsigned end) { | ||||||
|     while (program_counter < end) { |     while (program_counter < end) { | ||||||
|         Compile_NextInstr(); |         Compile_NextInstr(); | ||||||
|  |  | ||||||
|  | @ -66,6 +66,8 @@ public: | ||||||
|     void Compile_JMP(Instruction instr); |     void Compile_JMP(Instruction instr); | ||||||
|     void Compile_CMP(Instruction instr); |     void Compile_CMP(Instruction instr); | ||||||
|     void Compile_MAD(Instruction instr); |     void Compile_MAD(Instruction instr); | ||||||
|  |     void Compile_EMIT(Instruction instr); | ||||||
|  |     void Compile_SETE(Instruction instr); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void Compile_Block(unsigned end); |     void Compile_Block(unsigned end); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue