diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp index 45c744ee81..3324f4bb09 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Rasterizer.cpp @@ -125,7 +125,7 @@ inline void Draw(s32 x, s32 y, s32 xi, s32 yi) if (z < 0 || z > 0x00ffffff) return; - if (bpmem.zcontrol.early_ztest && bpmem.zmode.testenable) + if (bpmem.zcontrol.early_ztest && bpmem.zmode.testenable && g_SWVideoConfig.bZComploc) { // early z if (!EfbInterface::ZCompare(x, y, z)) diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp index 05a6cdddf2..07947e0ee7 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp @@ -35,6 +35,9 @@ SWVideoConfig::SWVideoConfig() bDumpObjects = false; bDumpFrames = false; + bZComploc = true; + bZFreeze = true; + bDumpTevStages = false; bDumpTevTextureFetches = false; @@ -52,6 +55,8 @@ void SWVideoConfig::Load(const char* ini_file) iniFile.Get("Hardware", "RenderToMainframe", &renderToMainframe, false); iniFile.Get("Rendering", "HwRasterizer", &bHwRasterizer, false); + iniFile.Get("Rendering", "ZComploc", &bZComploc, true); + iniFile.Get("Rendering", "ZFreeze", &bZFreeze, true); iniFile.Get("Info", "ShowStats", &bShowStats, false); @@ -74,6 +79,8 @@ void SWVideoConfig::Save(const char* ini_file) iniFile.Set("Hardware", "RenderToMainframe", renderToMainframe); iniFile.Set("Rendering", "HwRasterizer", bHwRasterizer); + iniFile.Set("Rendering", "ZComploc", &bZComploc); + iniFile.Set("Rendering", "ZFreeze", &bZFreeze); iniFile.Set("Info", "ShowStats", bShowStats); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h b/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h index 14eae78b51..c042ae8cc5 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.h @@ -36,6 +36,10 @@ struct SWVideoConfig : NonCopyable bool bHwRasterizer; + // Emulation features + bool bZComploc; + bool bZFreeze; + bool bShowStats; bool bDumpTextures; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp index 7813c0b245..bc5f978dd8 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp @@ -784,11 +784,12 @@ void Tev::Draw() output[BLU_C] = (output[BLU_C] * invFog + fogInt * bpmem.fog.color.b) >> 8; } - if (!bpmem.zcontrol.early_ztest && bpmem.zmode.testenable) - { - if (!EfbInterface::ZCompare(Position[0], Position[1], Position[2])) - return; - } + bool late_ztest = !bpmem.zcontrol.early_ztest || g_SWVideoConfig.bZComploc; + if (late_ztest && bpmem.zmode.testenable) + { + if (!EfbInterface::ZCompare(Position[0], Position[1], Position[2])) + return; + } #if ALLOW_TEV_DUMPS if (g_SWVideoConfig.bDumpTevStages)