Crashfix when switching buffered/non-buffered with the game running

This commit is contained in:
Henrik Rydgård committed 2024-10-25 12:00:28 +02:00
1 parent 19eae98ea9
commit 7d24fca4e2
4 files changed
+19 -7

No files matched your search

+8 -4
View File
@@ -370,8 +370,10 @@ void VulkanRenderManager::StartThreads() {
// Called from main thread.
void VulkanRenderManager::StopThreads() {
// Make sure we don't have an open render pass.
EndCurRenderStep();
// Make sure we don't have an open non-backbuffer render pass
if (curRenderStep_ && curRenderStep_->render.framebuffer != nullptr) {
EndCurRenderStep();
}
// Not sure this is a sensible check - should be ok even if not.
// _dbg_assert_(steps_.empty());
@@ -1140,6 +1142,8 @@ void VulkanRenderManager::CopyImageToMemorySync(VkImage image, int mipLevel, int
// Need to call this after FlushSync so the pixels are guaranteed to be ready in CPU-accessible VRAM.
queueRunner_.CopyReadbackBuffer(frameData_[vulkan_->GetCurFrame()], nullptr, w, h, destFormat, destFormat, pixelStride, pixels);
_dbg_assert_(steps_.empty());
}
static void RemoveDrawCommands(FastVec<VkRenderData> *cmds) {
@@ -1338,8 +1342,6 @@ void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect,
}
}
EndCurRenderStep();
// Sanity check. Added an assert to try to gather more info.
// Got this assert in NPJH50443 FINAL FANTASY TYPE-0, but pretty rare. Moving back to debug assert.
if (aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
@@ -1352,6 +1354,8 @@ void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect,
}
}
EndCurRenderStep();
VKRStep *step = new VKRStep{ VKRStepType::BLIT };
step->blit.aspectMask = aspectMask;
step->blit.src = src;
-1
View File
@@ -594,7 +594,6 @@ bool PSP_Reboot(std::string *error_string) {
}
void PSP_BeginHostFrame() {
// Reapply the graphics state of the PSP
if (gpu) {
gpu->BeginHostFrame();
}
+6
View File
@@ -89,6 +89,7 @@ void FramebufferManagerCommon::Init(int msaaLevel) {
NotifyRenderResized(msaaLevel);
}
// Returns true if we need to stop the render thread
bool FramebufferManagerCommon::UpdateRenderSize(int msaaLevel) {
const bool newRender = renderWidth_ != (float)PSP_CoreParameter().renderWidth || renderHeight_ != (float)PSP_CoreParameter().renderHeight || msaaLevel_ != msaaLevel;
@@ -111,6 +112,11 @@ bool FramebufferManagerCommon::UpdateRenderSize(int msaaLevel) {
useBufferedRendering_ = newBuffered;
presentation_->UpdateRenderSize(renderWidth_, renderHeight_);
// If just switching TO buffered rendering, no need to pause the threads. In fact this causes problems due to the open backbuffer renderpass.
if (!useBufferedRendering_ && newBuffered) {
return false;
}
return newRender || newSettings;
}
+5 -2
View File
@@ -1395,6 +1395,10 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
if (!framebufferBound) {
draw->BindFramebufferAsRenderTarget(nullptr, { RPAction::CLEAR, RPAction::CLEAR, RPAction::CLEAR, }, "EmuScreen_Behind");
}
Draw::BackendState state = draw->GetCurrentBackendState();
_assert_msg_(!state.valid || state.passes >= 1, "skipB: %d sw: %d mode: %d back: %d tag: %s", (int)skipBufferEffects, (int)g_Config.bSoftwareRendering, (int)mode, (int)g_Config.iGPUBackend, screenManager()->topScreen()->tag());
// Need to make sure the UI texture is available, for "darken".
screenManager()->getUIContext()->BeginFrame();
draw->SetViewport(viewport);
@@ -1515,13 +1519,12 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
draw->BindFramebufferAsRenderTarget(nullptr, { RPAction::CLEAR, RPAction::CLEAR, RPAction::CLEAR, clearColor }, "EmuScreen_NoFrame");
draw->SetViewport(viewport);
draw->SetScissorRect(0, 0, g_display.pixel_xres, g_display.pixel_yres);
framebufferBound = true;
}
Draw::BackendState state = draw->GetCurrentBackendState();
// We allow if !state.valid, that means it's not the Vulkan backend.
_assert_msg_(!state.valid || state.passes >= 1, "skipB: %d sw: %d mode: %d back: %d", (int)skipBufferEffects, (int)g_Config.bSoftwareRendering, (int)mode, (int)g_Config.iGPUBackend);
_assert_msg_(!state.valid || state.passes >= 1, "skipB: %d sw: %d mode: %d back: %d bound: %d", (int)skipBufferEffects, (int)g_Config.bSoftwareRendering, (int)mode, (int)g_Config.iGPUBackend, (int)framebufferBound);
screenManager()->getUIContext()->BeginFrame();