summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/fence_manager.h5
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp14
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp10
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h4
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
710void RasterizerVulkan::FlushCommands() { 710void 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)
1486void RasterizerVulkan::InitializeChannel(Tegra::Control::ChannelState& channel) { 1488void 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) {
1512void RasterizerVulkan::ReleaseChannel(s32 channel_id) { 1514void 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
136private: 140private:
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;