diff --git a/Core/HLE/sceDmac.cpp b/Core/HLE/sceDmac.cpp index ea509746f7..da48432e8b 100644 --- a/Core/HLE/sceDmac.cpp +++ b/Core/HLE/sceDmac.cpp @@ -79,7 +79,7 @@ static u32 sceDmacMemcpy(u32 dst, u32 src, u32 size) { } if (dmacMemcpyDeadline > CoreTiming::GetTicks()) { - WARN_LOG_REPORT(HLE, "sceDmacMemcpy(dest=%08x, src=%08x, size=%i): overlapping read", dst, src, size); + WARN_LOG_REPORT_ONCE(overlapDmacMemcpy, HLE, "sceDmacMemcpy(dest=%08x, src=%08x, size=%d): overlapping read", dst, src, size); // TODO: Should block, seems like copy doesn't start until previous finishes. // Might matter for overlapping copies. } else { diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index 6329103da4..df140be611 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -77,7 +77,7 @@ void ComputeVertexShaderID(ShaderID *id_out, u32 vertType, bool useHWTransform) ShaderID id; id.SetBit(VS_BIT_LMODE, lmode); - id.SetBit(VS_BIT_IS_THROUGH, gstate.isModeThrough()); + id.SetBit(VS_BIT_IS_THROUGH, isModeThrough); id.SetBit(VS_BIT_ENABLE_FOG, enableFog); id.SetBit(VS_BIT_HAS_COLOR, hasColor); @@ -143,6 +143,9 @@ void ComputeVertexShaderID(ShaderID *id_out, u32 vertType, bool useHWTransform) id.SetBit(VS_BIT_FLATSHADE, doFlatShading); + // These two bits cannot be combined, otherwise havoc occurs. We get reports that indicate this happened somehow... "ERROR: 0:14: 'u_proj' : undeclared identifier" + _dbg_assert_msg_(G3D, !id.Bit(VS_BIT_USE_HW_TRANSFORM) || !id.Bit(VS_BIT_IS_THROUGH), "Can't have both THROUGH and USE_HW_TRANSFORM together!"); + *id_out = id; } diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index d0b7f6702d..fc1bda1304 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -773,10 +773,9 @@ Shader *ShaderManagerGLES::ApplyVertexShader(int prim, u32 vertType, ShaderID *V gstate_c.CleanUniforms(); } - bool useHWTransform = CanUseHardwareTransform(prim); - if (gstate_c.IsDirty(DIRTY_VERTEXSHADER_STATE)) { gstate_c.Clean(DIRTY_VERTEXSHADER_STATE); + bool useHWTransform = CanUseHardwareTransform(prim); ComputeVertexShaderID(VSID, vertType, useHWTransform); } else { *VSID = lastVSID_; @@ -987,6 +986,12 @@ void ShaderManagerGLES::LoadAndPrecompile(const std::string &filename) { return; } if (!vsCache_.Get(id)) { + if (id.Bit(VS_BIT_IS_THROUGH) && id.Bit(VS_BIT_USE_HW_TRANSFORM)) { + // Clearly corrupt, bailing. + ERROR_LOG_REPORT(G3D, "Corrupt shader cache: Both IS_THROUGH and USE_HW_TRANSFORM set."); + return; + } + Shader *vs = CompileVertexShader(id); if (vs->Failed()) { // Give up on using the cache, just bail. We can't safely create the fallback shaders here diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index a2fe348305..331123fc1c 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -583,8 +583,6 @@ void FramebufferManagerVulkan::EndFrame() { } void FramebufferManagerVulkan::DeviceLost() { - vulkan2D_->DeviceLost(); - DestroyAllFBOs(); DestroyDeviceObjects(); } @@ -593,7 +591,6 @@ void FramebufferManagerVulkan::DeviceRestore(VulkanContext *vulkan, Draw::DrawCo vulkan_ = vulkan; draw_ = draw; - vulkan2D_->DeviceRestore(vulkan_); InitDeviceObjects(); } diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 334d98e552..a862bee967 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -609,8 +609,8 @@ void GPU_Vulkan::DestroyDeviceObjects() { void GPU_Vulkan::DeviceLost() { DestroyDeviceObjects(); - framebufferManagerVulkan_->DeviceLost(); + vulkan2D_.DeviceLost(); drawEngine_.DeviceLost(); pipelineManager_->DeviceLost(); textureCacheVulkan_->DeviceLost(); @@ -628,6 +628,7 @@ void GPU_Vulkan::DeviceRestore() { UpdateCmdInfo(); framebufferManagerVulkan_->DeviceRestore(vulkan_, draw_); + vulkan2D_.DeviceRestore(vulkan_); drawEngine_.DeviceRestore(vulkan_, draw_); pipelineManager_->DeviceRestore(vulkan_); textureCacheVulkan_->DeviceRestore(vulkan_, draw_); diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index de30cc728f..ca670b02d6 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -221,7 +221,7 @@ void CwCheatScreen::ParseCheatDB(std::string line, std::vector titl continue; } loop:; - } while (fs.good() && line[0] != '_' && line[1] != 'S'); + } while (fs.good() && line[0] == '_' && line[1] != 'S'); finished = true; } if (finished == true) @@ -236,7 +236,7 @@ void CwCheatScreen::ParseCheatDB(std::string line, std::vector titl File::OpenCPPFile(fs, activeCheatFile, std::ios::out | std::ios::app); auto it = title.begin(); - if (title2[0] != '_' && title2[1] != 'S' && it != title.end() && (++it) != title.end()) { + if (title2[0] == '_' && title2[1] != 'S' && it != title.end() && (++it) != title.end()) { fs << title[0] << "\n" << title[1]; }