diff options
| -rw-r--r-- | src/video_core/fence_manager.h | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 4 |
4 files changed, 23 insertions, 10 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 805a89900..c0e6471fe 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h | |||
| @@ -86,7 +86,10 @@ public: | |||
| 86 | uncommitted_operations.emplace_back(std::move(func)); | 86 | uncommitted_operations.emplace_back(std::move(func)); |
| 87 | } | 87 | } |
| 88 | pending_operations.emplace_back(std::move(uncommitted_operations)); | 88 | pending_operations.emplace_back(std::move(uncommitted_operations)); |
| 89 | QueueFence(new_fence); | 89 | { |
| 90 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | ||
| 91 | QueueFence(new_fence); | ||
| 92 | } | ||
| 90 | if (!delay_fence) { | 93 | if (!delay_fence) { |
| 91 | func(); | 94 | func(); |
| 92 | } | 95 | } |
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index c4c30d807..7e7a80740 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -132,12 +132,16 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { | |||
| 132 | const bool use_accelerated = | 132 | const bool use_accelerated = |
| 133 | rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride); | 133 | rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride); |
| 134 | const bool is_srgb = use_accelerated && screen_info.is_srgb; | 134 | const bool is_srgb = use_accelerated && screen_info.is_srgb; |
| 135 | RenderScreenshot(*framebuffer, use_accelerated); | ||
| 136 | 135 | ||
| 137 | Frame* frame = present_manager.GetRenderFrame(); | 136 | { |
| 138 | blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated, is_srgb); | 137 | std::scoped_lock lock{rasterizer.LockCaches()}; |
| 139 | scheduler.Flush(*frame->render_ready); | 138 | RenderScreenshot(*framebuffer, use_accelerated); |
| 140 | present_manager.Present(frame); | 139 | |
| 140 | Frame* frame = present_manager.GetRenderFrame(); | ||
| 141 | blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated, is_srgb); | ||
| 142 | scheduler.Flush(*frame->render_ready); | ||
| 143 | present_manager.Present(frame); | ||
| 144 | } | ||
| 141 | 145 | ||
| 142 | gpu.RendererFrameEndNotify(); | 146 | gpu.RendererFrameEndNotify(); |
| 143 | rasterizer.TickFrame(); | 147 | rasterizer.TickFrame(); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 83f2b6045..23696fac4 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -198,7 +198,7 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { | |||
| 198 | if (!pipeline) { | 198 | if (!pipeline) { |
| 199 | return; | 199 | return; |
| 200 | } | 200 | } |
| 201 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | 201 | std::scoped_lock lock{LockCaches()}; |
| 202 | // update engine as channel may be different. | 202 | // update engine as channel may be different. |
| 203 | pipeline->SetEngine(maxwell3d, gpu_memory); | 203 | pipeline->SetEngine(maxwell3d, gpu_memory); |
| 204 | pipeline->Configure(is_indexed); | 204 | pipeline->Configure(is_indexed); |
| @@ -708,6 +708,7 @@ void RasterizerVulkan::TiledCacheBarrier() { | |||
| 708 | } | 708 | } |
| 709 | 709 | ||
| 710 | void RasterizerVulkan::FlushCommands() { | 710 | void RasterizerVulkan::FlushCommands() { |
| 711 | std::scoped_lock lock{LockCaches()}; | ||
| 711 | if (draw_counter == 0) { | 712 | if (draw_counter == 0) { |
| 712 | return; | 713 | return; |
| 713 | } | 714 | } |
| @@ -805,6 +806,7 @@ void RasterizerVulkan::FlushWork() { | |||
| 805 | if ((++draw_counter & 7) != 7) { | 806 | if ((++draw_counter & 7) != 7) { |
| 806 | return; | 807 | return; |
| 807 | } | 808 | } |
| 809 | std::scoped_lock lock{LockCaches()}; | ||
| 808 | if (draw_counter < DRAWS_TO_DISPATCH) { | 810 | if (draw_counter < DRAWS_TO_DISPATCH) { |
| 809 | // Send recorded tasks to the worker thread | 811 | // Send recorded tasks to the worker thread |
| 810 | scheduler.DispatchWork(); | 812 | scheduler.DispatchWork(); |
| @@ -1486,7 +1488,7 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) | |||
| 1486 | void RasterizerVulkan::InitializeChannel(Tegra::Control::ChannelState& channel) { | 1488 | void RasterizerVulkan::InitializeChannel(Tegra::Control::ChannelState& channel) { |
| 1487 | CreateChannel(channel); | 1489 | CreateChannel(channel); |
| 1488 | { | 1490 | { |
| 1489 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | 1491 | std::scoped_lock lock{LockCaches()}; |
| 1490 | texture_cache.CreateChannel(channel); | 1492 | texture_cache.CreateChannel(channel); |
| 1491 | buffer_cache.CreateChannel(channel); | 1493 | buffer_cache.CreateChannel(channel); |
| 1492 | } | 1494 | } |
| @@ -1499,7 +1501,7 @@ void RasterizerVulkan::BindChannel(Tegra::Control::ChannelState& channel) { | |||
| 1499 | const s32 channel_id = channel.bind_id; | 1501 | const s32 channel_id = channel.bind_id; |
| 1500 | BindToChannel(channel_id); | 1502 | BindToChannel(channel_id); |
| 1501 | { | 1503 | { |
| 1502 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | 1504 | std::scoped_lock lock{LockCaches()}; |
| 1503 | texture_cache.BindToChannel(channel_id); | 1505 | texture_cache.BindToChannel(channel_id); |
| 1504 | buffer_cache.BindToChannel(channel_id); | 1506 | buffer_cache.BindToChannel(channel_id); |
| 1505 | } | 1507 | } |
| @@ -1512,7 +1514,7 @@ void RasterizerVulkan::BindChannel(Tegra::Control::ChannelState& channel) { | |||
| 1512 | void RasterizerVulkan::ReleaseChannel(s32 channel_id) { | 1514 | void RasterizerVulkan::ReleaseChannel(s32 channel_id) { |
| 1513 | EraseChannel(channel_id); | 1515 | EraseChannel(channel_id); |
| 1514 | { | 1516 | { |
| 1515 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | 1517 | std::scoped_lock lock{LockCaches()}; |
| 1516 | texture_cache.EraseChannel(channel_id); | 1518 | texture_cache.EraseChannel(channel_id); |
| 1517 | buffer_cache.EraseChannel(channel_id); | 1519 | buffer_cache.EraseChannel(channel_id); |
| 1518 | } | 1520 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index ad069556c..ce3dfbaab 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -133,6 +133,10 @@ public: | |||
| 133 | 133 | ||
| 134 | void ReleaseChannel(s32 channel_id) override; | 134 | void ReleaseChannel(s32 channel_id) override; |
| 135 | 135 | ||
| 136 | std::scoped_lock<std::recursive_mutex, std::recursive_mutex> LockCaches() { | ||
| 137 | return std::scoped_lock{buffer_cache.mutex, texture_cache.mutex}; | ||
| 138 | } | ||
| 139 | |||
| 136 | private: | 140 | private: |
| 137 | static constexpr size_t MAX_TEXTURES = 192; | 141 | static constexpr size_t MAX_TEXTURES = 192; |
| 138 | static constexpr size_t MAX_IMAGES = 48; | 142 | static constexpr size_t MAX_IMAGES = 48; |