diff --git a/bin/resources/GameIndex.yaml b/bin/resources/GameIndex.yaml index ec114866ef..03b929af9d 100644 --- a/bin/resources/GameIndex.yaml +++ b/bin/resources/GameIndex.yaml @@ -22745,28 +22745,38 @@ SLES-55349: name: "Need for Speed - Undercover" region: "PAL-E" gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLES-55350: name: "Need for Speed - Undercover" region: "PAL-F-G" gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLES-55351: name: "Need for Speed - Undercover" region: "PAL-I-S" gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLES-55352: name: "Need for Speed - Undercover" region: "PAL-SCA" compat: 5 gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLES-55353: name: "Need for Speed - Undercover" region: "PAL-M6" gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLES-55354: name: "Shin Megami Tensei - Persona 3 FES" region: "PAL-E" @@ -25270,7 +25280,9 @@ SLPM-55127: name: "Need for Speed - Undercover" region: "NTSC-J" gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLPM-55131: name: "World Soccer Winning Eleven 2009" region: "NTSC-J" @@ -25475,7 +25487,9 @@ SLPM-55244: name: "Need for Speed - Undercover [Ea-SY! 1980]" region: "NTSC-J" gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLPM-55245: name: "Himawari - Pebble in the Sky" region: "NTSC-J" @@ -50522,7 +50536,9 @@ SLUS-21801: region: "NTSC-U" compat: 5 gsHWFixes: + recommendedBlendingLevel: 3 # Improves car reflections. halfPixelOffset: 2 # Fixes blurriness. + getSkipCount: "GSC_NFSUndercover" SLUS-21802: name: "Naked Brothers Band - The Video Game" region: "NTSC-U" diff --git a/pcsx2/GS/Renderers/HW/GSHwHack.cpp b/pcsx2/GS/Renderers/HW/GSHwHack.cpp index 15d33a8960..f4ce5dfc72 100644 --- a/pcsx2/GS/Renderers/HW/GSHwHack.cpp +++ b/pcsx2/GS/Renderers/HW/GSHwHack.cpp @@ -734,6 +734,37 @@ bool GSHwHack::GSC_XenosagaE3(GSRendererHW& r, int& skip) return true; } +bool GSHwHack::GSC_NFSUndercover(GSRendererHW& r, int& skip) +{ + // NFS Undercover does a weird texture shuffle by page, which really isn't supported by our TC. + // This causes it to spam creating new sources, severely destroying the speed. + // The CRC hack bypasses the entire shuffle and does it in one go. + const GIFRegTEX0& Texture = RTEX0; + const GIFRegFRAME& Frame = RFRAME; + + if (RPRIM->TME && Frame.PSM == PSM_PSMCT16S && Frame.FBMSK != 0 && Frame.FBW == 10 && Texture.TBW == 1 && Texture.TBP0 == 0x02800 && Texture.PSM == PSM_PSMZ16S) + { + GSVertex* v = &r.m_vertex.buff[1]; + v[0].XYZ.X = static_cast(RCONTEXT->XYOFFSET.OFX + (r.m_r.z << 4)); + v[0].XYZ.Y = static_cast(RCONTEXT->XYOFFSET.OFY + (r.m_r.w << 4)); + v[0].U = r.m_r.z << 4; + v[0].V = r.m_r.w << 4; + RCONTEXT->scissor.in.z = r.m_r.z; + RCONTEXT->scissor.in.w = r.m_r.w; + r.m_vt.m_max.p.x = r.m_r.z; + r.m_vt.m_max.p.y = r.m_r.w; + r.m_vt.m_max.t.x = r.m_r.z; + r.m_vt.m_max.t.y = r.m_r.w; + r.m_vertex.head = r.m_vertex.tail = r.m_vertex.next = 2; + r.m_index.tail = 2; + skip = 79; + } + else + return skip > 0; + + return false; +} + bool GSHwHack::GSC_BlueTongueGames(GSRendererHW& r, int& skip) { GSDrawingContext* context = r.m_context; @@ -1219,6 +1250,7 @@ const GSHwHack::Entry GSHwHack::s_get_skip_count_function CRC_F(GSC_BlackAndBurnoutSky, CRCHackLevel::Partial), CRC_F(GSC_BlueTongueGames, CRCHackLevel::Partial), CRC_F(GSC_Battlefield2, CRCHackLevel::Partial), + CRC_F(GSC_NFSUndercover, CRCHackLevel::Partial), // Channel Effect CRC_F(GSC_GiTS, CRCHackLevel::Partial), diff --git a/pcsx2/GS/Renderers/HW/GSHwHack.h b/pcsx2/GS/Renderers/HW/GSHwHack.h index 8113dfd949..96b22c1f7e 100644 --- a/pcsx2/GS/Renderers/HW/GSHwHack.h +++ b/pcsx2/GS/Renderers/HW/GSHwHack.h @@ -51,6 +51,7 @@ public: static bool GSC_XenosagaE3(GSRendererHW& r, int& skip); static bool GSC_BlueTongueGames(GSRendererHW& r, int& skip); static bool GSC_Battlefield2(GSRendererHW& r, int& skip); + static bool GSC_NFSUndercover(GSRendererHW& r, int& skip); static bool OI_PointListPalette(GSRendererHW& r, GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); static bool OI_BigMuthaTruckers(GSRendererHW& r, GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t);