diff --git a/plugins/GSdx/GSHwHack.cpp b/plugins/GSdx/GSHwHack.cpp index 06bc28e0fa..fe0187874c 100644 --- a/plugins/GSdx/GSHwHack.cpp +++ b/plugins/GSdx/GSHwHack.cpp @@ -91,8 +91,7 @@ bool GSC_DBZBT3(const GSFrameInfo& fi, int& skip) } else if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00e00 || fi.FBP == 0x01000) && fi.FPSM == PSM_PSMCT16 && fi.TPSM == PSM_PSMZ16) { - // Texture shuffling works on OpenGL only for the NTSC version. The PAL version still has some issues. - // Sky texture (depth related). On Direct3D the blue sky texture is shown on the whole screen in front of the player if hack is disabled. + // Sky texture (Depth) is properly rendered on OpenGL only for the NTSC version. The PAL version still has some issues (half screen bottom issue). if(g_crc_region == CRC::EU || Dx_only) { skip = 5; @@ -109,6 +108,27 @@ bool GSC_DBZBT3(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_DemonStone(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x01400 && fi.FPSM == fi.TPSM && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01000) && fi.TPSM == PSM_PSMCT16) + { + // Texture shuffle half screen bottom issue. + skip = 1000; + } + } + else + { + if(Dx_only && fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01000) && fi.FPSM == PSM_PSMCT32) + { + skip = 2; + } + } + + return true; +} + bool GSC_WildArmsGames(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -382,19 +402,6 @@ bool GSC_Naruto(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_EternalPoison(const GSFrameInfo& fi, int& skip) -{ - if(skip == 0) - { - // Texture shuffle ??? - if(fi.TPSM == PSM_PSMCT16S && fi.TBP0 == 0x3200) - { - skip = 1; - } - } - return true; -} - bool GSC_SakuraTaisen(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -433,10 +440,13 @@ bool GSC_ShadowofRome(const GSFrameInfo& fi, int& skip) { if(fi.FBP && fi.TPSM == PSM_PSMT8H && ( fi.FBMSK ==0x00FFFFFF)) { - skip =1; + // Depth issues on all renders, white wall and white duplicate characters. + skip = 1; } else if(fi.TME ==0x0001 && (fi.TBP0==0x1300 || fi.TBP0==0x0f00) && fi.FBMSK>=0xFFFFFF) { + // Cause a grey transparent wall (D3D) and a transparent vertical grey line (all renders) on the left side of the screen. + // Blur effect maybe ? skip = 1; } else if(fi.TME && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 ==0x0160 ||fi.TBP0==0x01e0 || fi.TBP0<=0x0800) && fi.TPSM == PSM_PSMT8) @@ -1034,19 +1044,6 @@ bool GSC_HummerBadlands(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_SengokuBasara(const GSFrameInfo& fi, int& skip) -{ - if(skip == 0) - { - if(fi.TME && (fi.TBP0==0x1800 ) && fi.FBMSK==0xFF000000) - { - skip = 1; - } - } - - return true; -} - bool GSC_TalesofSymphonia(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -1122,6 +1119,21 @@ bool GSC_SteambotChronicles(const GSFrameInfo& fi, int& skip) // Correctly emulated on OpenGL but can be used as potential speed hack //////////////////////////////////////////////////////////////////////////////// +bool GSC_EternalPoison(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + // Texture shuffle or hdr colclip ??? + if(fi.TPSM == PSM_PSMCT16S && fi.TBP0 == 0x3200) + { + // Removes shadows. + skip = 1; + } + } + + return true; +} + bool GSC_FinalFightStreetwise(const GSFrameInfo& fi, int& skip) { if (skip == 0) @@ -1178,11 +1190,11 @@ bool GSC_HauntingGround(const GSFrameInfo& fi, int& skip) bool GSC_GetaWay(const GSFrameInfo& fi, int& skip) { - if (skip == 0) + if(skip == 0) { - if ((fi.FBP == 0 || fi.FBP == 0x1180) && fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) + if((fi.FBP == 0 || fi.FBP == 0x1180 || fi.FBP == 0x1400) && fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) { - skip = 1; // US version only. Removes fog wall. + skip = 1; // Removes fog wall. } } @@ -1664,6 +1676,7 @@ bool GSC_Tenchu(const GSFrameInfo& fi, int& skip) { if(fi.TME && fi.TPSM == PSM_PSMZ16 && fi.FPSM == PSM_PSMCT16 && fi.FBMSK == 0x03FFF) { + // Depth issues. D3D only. skip = 3; } } @@ -1711,26 +1724,6 @@ bool GSC_Sly2(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_DemonStone(const GSFrameInfo& fi, int& skip) -{ - if(skip == 0) - { - if(fi.TME && fi.FBP == 0x01400 && fi.FPSM == fi.TPSM && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01000) && fi.TPSM == PSM_PSMCT16) - { - skip = 1000; - } - } - else - { - if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01000) && fi.FPSM == PSM_PSMCT32) - { - skip = 2; - } - } - - return true; -} - bool GSC_BigMuthaTruckers(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -2234,15 +2227,11 @@ void GSState::SetupCrcHack() lut[CRC::BurnoutTakedown] = GSC_Burnout; lut[CRC::CaptainTsubasa] = GSC_CaptainTsubasa; lut[CRC::CrashBandicootWoC] = GSC_CrashBandicootWoC; - lut[CRC::DBZBT2] = GSC_DBZBT2; - lut[CRC::DBZBT3] = GSC_DBZBT3; lut[CRC::DevilMayCry3] = GSC_DevilMayCry3; - lut[CRC::EternalPoison] = GSC_EternalPoison; lut[CRC::EvangelionJo] = GSC_EvangelionJo; lut[CRC::FightingBeautyWulong] = GSC_FightingBeautyWulong; lut[CRC::FrontMission5] = GSC_FrontMission5; lut[CRC::Genji] = GSC_Genji; - lut[CRC::GiTS] = GSC_GiTS; lut[CRC::GodHand] = GSC_GodHand; lut[CRC::HeavyMetalThunder] = GSC_HeavyMetalThunder; lut[CRC::HummerBadlands] = GSC_HummerBadlands; @@ -2260,17 +2249,14 @@ void GSState::SetupCrcHack() lut[CRC::SacredBlaze] = GSC_SacredBlaze; lut[CRC::SakuraTaisen] = GSC_SakuraTaisen; lut[CRC::SakuraWarsSoLongMyLove] = GSC_SakuraWarsSoLongMyLove; - lut[CRC::SengokuBasara] = GSC_SengokuBasara; lut[CRC::ShadowofRome] = GSC_ShadowofRome; lut[CRC::ShinOnimusha] = GSC_ShinOnimusha; lut[CRC::Simple2000Vol114] = GSC_Simple2000Vol114; lut[CRC::Spartan] = GSC_Spartan; lut[CRC::StarWarsForceUnleashed] = GSC_StarWarsForceUnleashed; - lut[CRC::SteambotChronicles] = GSC_SteambotChronicles; lut[CRC::SFEX3] = GSC_SFEX3; lut[CRC::TalesOfLegendia] = GSC_TalesOfLegendia; lut[CRC::TalesofSymphonia] = GSC_TalesofSymphonia; - lut[CRC::Tekken5] = GSC_Tekken5; lut[CRC::TimeSplitters2] = GSC_TimeSplitters2; lut[CRC::TombRaiderAnniversary] = GSC_TombRaider; lut[CRC::TombRaiderLegend] = GSC_TombRaiderLegend; @@ -2282,10 +2268,22 @@ void GSState::SetupCrcHack() lut[CRC::Yakuza2] = GSC_Yakuza2; lut[CRC::Yakuza] = GSC_Yakuza; lut[CRC::ZettaiZetsumeiToshi2] = GSC_ZettaiZetsumeiToshi2; + + // Channel Effect + lut[CRC::GiTS] = GSC_GiTS; + lut[CRC::SteambotChronicles] = GSC_SteambotChronicles; + + // Half Screen bottom issue + lut[CRC::DBZBT2] = GSC_DBZBT2; + lut[CRC::DBZBT3] = GSC_DBZBT3; + lut[CRC::DemonStone] = GSC_DemonStone; + lut[CRC::Tekken5] = GSC_Tekken5; + // These games emulate a stencil buffer with the alpha channel of the RT (too slow to move to DX only) lut[CRC::RadiataStories] = GSC_RadiataStories; lut[CRC::StarOcean3] = GSC_StarOcean3; lut[CRC::ValkyrieProfile2] = GSC_ValkyrieProfile2; + // Only Aggressive lut[CRC::BleachBladeBattlers] = GSC_BleachBladeBattlers; lut[CRC::FFX2] = GSC_FFXGames; @@ -2304,7 +2302,7 @@ void GSState::SetupCrcHack() // Depth lut[CRC::Bully] = GSC_Bully; lut[CRC::BullyCC] = GSC_BullyCC; - lut[CRC::FinalFightStreetwise] = GSC_FinalFightStreetwise; + lut[CRC::FinalFightStreetwise] = GSC_FinalFightStreetwise; // + blending lut[CRC::GodOfWar2] = GSC_GodOfWar2; lut[CRC::ICO] = GSC_ICO; lut[CRC::LordOfTheRingsTwoTowers] = GSC_LordOfTheRingsTwoTowers; @@ -2312,6 +2310,8 @@ void GSState::SetupCrcHack() lut[CRC::SoulCalibur2] = GSC_SoulCaliburGames; lut[CRC::SoulCalibur3] = GSC_SoulCaliburGames; lut[CRC::SuikodenTactics] = GSC_SuikodenTactics; + lut[CRC::TenchuFS] = GSC_Tenchu; + lut[CRC::TenchuWoH] = GSC_Tenchu; lut[CRC::XE3] = GSC_XE3; // Depth + Texture cache issue + Date (AKA a real mess) @@ -2319,16 +2319,14 @@ void GSState::SetupCrcHack() // Not tested but must be fixed with texture shuffle lut[CRC::BigMuthaTruckers] = GSC_BigMuthaTruckers; - lut[CRC::DemonStone] = GSC_DemonStone; lut[CRC::CrashNburn] = GSC_CrashNburn; // seem to be a basic depth effect + lut[CRC::EternalPoison] = GSC_EternalPoison; lut[CRC::LegoBatman] = GSC_LegoBatman; lut[CRC::OnePieceGrandAdventure] = GSC_OnePieceGrandAdventure; lut[CRC::OnePieceGrandBattle] = GSC_OnePieceGrandBattle; lut[CRC::SpyroEternalNight] = GSC_SpyroEternalNight; lut[CRC::SpyroNewBeginning] = GSC_SpyroNewBeginning; lut[CRC::SonicUnleashed] = GSC_SonicUnleashed; - lut[CRC::TenchuFS] = GSC_Tenchu; - lut[CRC::TenchuWoH] = GSC_Tenchu; // Those games might requires accurate fbmask lut[CRC::Sly2] = GSC_Sly2; @@ -2352,6 +2350,7 @@ void GSState::SetupCrcHack() lut[CRC::SkyGunner] = GSC_SkyGunner; lut[CRC::StarWarsBattlefront2] = GSC_StarWarsBattlefront2; lut[CRC::StarWarsBattlefront] = GSC_StarWarsBattlefront; + // Dedicated shader for channel effect lut[CRC::TalesOfAbyss] = GSC_TalesOfAbyss;