Browse Source
Merge pull request #10151 from GPUCode/no-softlocks-please
Fix softlocks when disabling async present
pull/15/merge
liamwhite
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
9 additions and
6 deletions
-
src/video_core/renderer_vulkan/renderer_vulkan.cpp
-
src/video_core/renderer_vulkan/vk_present_manager.cpp
-
src/video_core/renderer_vulkan/vk_present_manager.h
|
|
@ -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(); |
|
|
|
|
|
@ -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; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
scheduler.Record([this, frame](vk::CommandBuffer) { |
|
|
std::unique_lock lock{queue_mutex}; |
|
|
std::unique_lock lock{queue_mutex}; |
|
|
present_queue.push(frame); |
|
|
present_queue.push(frame); |
|
|
frame_cv.notify_one(); |
|
|
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, |
|
|
|
|
|
@ -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, |
|
|
|