Merge pull request #10151 from GPUCode/no-softlocks-please

Fix softlocks when disabling async present
This commit is contained in:
liamwhite 2023-05-03 10:54:24 -04:00 committed by GitHub
commit ffeb5cdd8d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 6 deletions

View file

@ -134,7 +134,7 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
Frame* frame = present_manager.GetRenderFrame(); Frame* frame = present_manager.GetRenderFrame();
blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated, is_srgb); blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated, is_srgb);
scheduler.Flush(*frame->render_ready); scheduler.Flush(*frame->render_ready);
scheduler.Record([this, frame](vk::CommandBuffer) { present_manager.PushFrame(frame); }); present_manager.Present(frame);
gpu.RendererFrameEndNotify(); gpu.RendererFrameEndNotify();
rasterizer.TickFrame(); rasterizer.TickFrame();

View file

@ -153,16 +153,19 @@ Frame* PresentManager::GetRenderFrame() {
return frame; return frame;
} }
void PresentManager::PushFrame(Frame* frame) { void PresentManager::Present(Frame* frame) {
if (!use_present_thread) { if (!use_present_thread) {
scheduler.WaitWorker();
CopyToSwapchain(frame); CopyToSwapchain(frame);
free_queue.push(frame); free_queue.push(frame);
return; return;
} }
std::unique_lock lock{queue_mutex}; scheduler.Record([this, frame](vk::CommandBuffer) {
present_queue.push(frame); std::unique_lock lock{queue_mutex};
frame_cv.notify_one(); present_queue.push(frame);
frame_cv.notify_one();
});
} }
void PresentManager::RecreateFrame(Frame* frame, u32 width, u32 height, bool is_srgb, void PresentManager::RecreateFrame(Frame* frame, u32 width, u32 height, bool is_srgb,

View file

@ -45,7 +45,7 @@ public:
Frame* GetRenderFrame(); Frame* GetRenderFrame();
/// Pushes a frame for presentation /// Pushes a frame for presentation
void PushFrame(Frame* frame); void Present(Frame* frame);
/// Recreates the present frame to match the provided parameters /// Recreates the present frame to match the provided parameters
void RecreateFrame(Frame* frame, u32 width, u32 height, bool is_srgb, void RecreateFrame(Frame* frame, u32 width, u32 height, bool is_srgb,