From 72286191a1c6d1bc6646e941fb3205dca4bdc124 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 15 Jan 2013 08:24:04 +0800 Subject: [PATCH 1/3] Fix alpha blending for HW transform --- GPU/GLES/VertexShaderGenerator.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/GPU/GLES/VertexShaderGenerator.cpp b/GPU/GLES/VertexShaderGenerator.cpp index 3829db0cee..f2b29240ec 100644 --- a/GPU/GLES/VertexShaderGenerator.cpp +++ b/GPU/GLES/VertexShaderGenerator.cpp @@ -342,7 +342,11 @@ void GenerateVertexShader(int prim, char *buffer) { if (gstate.lightingEnable & 1) { // Sum up ambient, emissive here. - WRITE(p, " v_color0 = clamp(lightSum0 + u_ambient * vec4(%s, 1.0) + vec4(u_matemissive, 0.0), 0.0, 1.0);\n", ambient); + if (hasColor) { + WRITE(p, " v_color0 = clamp(lightSum0 + u_ambient * vec4(%s, a_color0.a) + vec4(u_matemissive, 0.0), 0.0, 1.0);\n", ambient); + } else { + WRITE(p, " v_color0 = clamp(lightSum0 + u_ambient * vec4(%s, u_matambientalpha.a) + vec4(u_matemissive, 0.0), 0.0, 1.0);\n", ambient); + } if (lmode) { WRITE(p, " v_color1 = clamp(lightSum1, 0.0, 1.0);\n"); } else { From da22eb8adfa4ec2bea11b46e35890983fa6e857c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 20 Jan 2013 01:26:38 -0800 Subject: [PATCH 2/3] Make swc1 and lwc1 fast even without fastmem. --- Core/MIPS/x86/CompFPU.cpp | 134 +++++++++++++++++++++++++++++++++----- 1 file changed, 117 insertions(+), 17 deletions(-) diff --git a/Core/MIPS/x86/CompFPU.cpp b/Core/MIPS/x86/CompFPU.cpp index b3bbf7a694..9a818d1744 100644 --- a/Core/MIPS/x86/CompFPU.cpp +++ b/Core/MIPS/x86/CompFPU.cpp @@ -84,18 +84,14 @@ void Jit::Comp_FPU3op(u32 op) } } +static u32 GC_ALIGNED16(ssLoadStoreTemp[1]); + void Jit::Comp_FPULS(u32 op) { CONDITIONAL_DISABLE; - if (!g_Config.bFastMemory) { - DISABLE; - } - - s32 offset = (s16)(op&0xFFFF); - int ft = ((op>>16)&0x1f); + int ft = _FT; int rs = _RS; - // u32 addr = R(rs) + offset; switch(op >> 26) { @@ -103,14 +99,69 @@ void Jit::Comp_FPULS(u32 op) gpr.Lock(rs); fpr.Lock(ft); fpr.BindToRegister(ft, false, true); + + if (gpr.R(rs).IsImm()) + { + void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset); + if (data) + { #ifdef _M_IX86 - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset)); + MOVSS(fpr.RX(ft), M(data)); #else - MOV(32, R(EAX), gpr.R(rs)); - MOVSS(fpr.RX(ft), MComplex(RBX, RAX, SCALE_1, offset)); + MOVSS(fpr.RX(ft), MDisp(RBX, gpr.R(rs).GetImmValue() + offset)); #endif + } + else + { + MOV(32, M((void *)ssLoadStoreTemp), Imm32(0)); + MOVSS(fpr.RX(ft), M((void *)ssLoadStoreTemp)); + } + } + else if (!g_Config.bFastMemory) + { + MOV(32, R(EAX), gpr.R(rs)); + // Is it in physical ram? + CMP(32, R(EAX), Imm32(0x08000000)); + FixupBranch tooLow = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x0A000000)); + FixupBranch tooHigh = J_CC(CC_GE); + + const u8* safe = GetCodePtr(); +#ifdef _M_IX86 + MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset)); +#else + MOVSS(fpr.RX(ft), MComplex(RBX, RAX, SCALE_1, offset)); +#endif + + FixupBranch skip = J(); + SetJumpTarget(tooLow); + SetJumpTarget(tooHigh); + + // Might also be the scratchpad. + CMP(32, R(EAX), Imm32(0x00010000)); + FixupBranch tooLow2 = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x00014000)); + J_CC(CC_L, safe); + SetJumpTarget(tooLow2); + + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionA(thunks.ProtectFunction((void *) &Memory::Read_U32, 1), R(EAX)); + MOV(32, M((void *)&ssLoadStoreTemp), R(EAX)); + MOVSS(fpr.RX(ft), M((void *)&ssLoadStoreTemp)); + + SetJumpTarget(skip); + } + else + { + MOV(32, R(EAX), gpr.R(rs)); +#ifdef _M_IX86 + AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); + MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset)); +#else + MOVSS(fpr.RX(ft), MComplex(RBX, RAX, SCALE_1, offset)); +#endif + } + gpr.UnlockAll(); fpr.UnlockAll(); break; @@ -118,14 +169,63 @@ void Jit::Comp_FPULS(u32 op) gpr.Lock(rs); fpr.Lock(ft); fpr.BindToRegister(ft, true, false); + + if (gpr.R(rs).IsImm()) + { + void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset); + if (data) + { #ifdef _M_IX86 - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft)); + MOVSS(M(data), fpr.RX(ft)); #else - MOV(32, R(EAX), gpr.R(rs)); - MOVSS(MComplex(RBX, RAX, SCALE_1, offset), fpr.RX(ft)); + MOVSS(MDisp(RBX, gpr.R(rs).GetImmValue() + offset), fpr.RX(ft)); #endif + } + } + else if (!g_Config.bFastMemory) + { + MOV(32, R(EAX), gpr.R(rs)); + // Is it in physical ram? + CMP(32, R(EAX), Imm32(0x08000000)); + FixupBranch tooLow = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x0A000000)); + FixupBranch tooHigh = J_CC(CC_GE); + + const u8* safe = GetCodePtr(); +#ifdef _M_IX86 + MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft)); +#else + MOVSS(MComplex(RBX, RAX, SCALE_1, offset), fpr.RX(ft)); +#endif + + FixupBranch skip = J(); + SetJumpTarget(tooLow); + SetJumpTarget(tooHigh); + + // Might also be the scratchpad. + CMP(32, R(EAX), Imm32(0x00010000)); + FixupBranch tooLow2 = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x00014000)); + J_CC(CC_L, safe); + SetJumpTarget(tooLow2); + + ADD(32, R(EAX), Imm32(offset)); + MOVSS(M((void *)&ssLoadStoreTemp), fpr.RX(ft)); + ABI_CallFunctionAA(thunks.ProtectFunction((void *) &Memory::Write_U32, 2), M((void *)&ssLoadStoreTemp), R(EAX)); + + SetJumpTarget(skip); + } + else + { + MOV(32, R(EAX), gpr.R(rs)); +#ifdef _M_IX86 + AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); + MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft)); +#else + MOVSS(MComplex(RBX, RAX, SCALE_1, offset), fpr.RX(ft)); +#endif + } + gpr.UnlockAll(); fpr.UnlockAll(); break; From 30f6a4ba8735fcdf6e58d82db262877bd5299877 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 20 Jan 2013 09:38:35 -0800 Subject: [PATCH 3/3] Fix stupid stupid typo breaking slowmem jit. --- Core/MIPS/x86/CompLoadStore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index d6889ba92d..be6bd74c5a 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -203,7 +203,7 @@ namespace MIPSComp break; case 35: //R(rt) = ReadMem32(addr); break; //lw - CompITypeMemRead(op, 32, &XEmitter::MOVZX, (void *) &Memory::Read_U16); + CompITypeMemRead(op, 32, &XEmitter::MOVZX, (void *) &Memory::Read_U32); break; case 32: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb