diff options
| author | 2021-04-03 21:41:49 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:26 -0400 | |
| commit | 5ed68e83db39e1f6790a625529f10f4e1d5a8f89 (patch) | |
| tree | 4931f4501e9127244eb3faddd5d475cd1c7d176f | |
| parent | shader: Remove unused header in VOTE (diff) | |
| download | yuzu-5ed68e83db39e1f6790a625529f10f4e1d5a8f89.tar.gz yuzu-5ed68e83db39e1f6790a625529f10f4e1d5a8f89.tar.xz yuzu-5ed68e83db39e1f6790a625529f10f4e1d5a8f89.zip | |
shader: Remove atomic flags and use mutex + cond variable for pipelines
4 files changed, 32 insertions, 11 deletions
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 6707842ab..0bb5b852d 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | |||
| @@ -55,8 +55,9 @@ ComputePipeline::ComputePipeline(const Device& device, VKDescriptorPool& descrip | |||
| 55 | .basePipelineHandle = 0, | 55 | .basePipelineHandle = 0, |
| 56 | .basePipelineIndex = 0, | 56 | .basePipelineIndex = 0, |
| 57 | }); | 57 | }); |
| 58 | building_flag.test_and_set(); | 58 | std::lock_guard lock{build_mutex}; |
| 59 | building_flag.notify_all(); | 59 | is_built = true; |
| 60 | build_condvar.notify_one(); | ||
| 60 | }}; | 61 | }}; |
| 61 | if (thread_worker) { | 62 | if (thread_worker) { |
| 62 | thread_worker->QueueWork(std::move(func)); | 63 | thread_worker->QueueWork(std::move(func)); |
| @@ -75,7 +76,8 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute, | |||
| 75 | size_t ssbo_index{}; | 76 | size_t ssbo_index{}; |
| 76 | for (const auto& desc : info.storage_buffers_descriptors) { | 77 | for (const auto& desc : info.storage_buffers_descriptors) { |
| 77 | ASSERT(desc.count == 1); | 78 | ASSERT(desc.count == 1); |
| 78 | buffer_cache.BindComputeStorageBuffer(ssbo_index, desc.cbuf_index, desc.cbuf_offset, desc.is_written); | 79 | buffer_cache.BindComputeStorageBuffer(ssbo_index, desc.cbuf_index, desc.cbuf_offset, |
| 80 | desc.is_written); | ||
| 79 | ++ssbo_index; | 81 | ++ssbo_index; |
| 80 | } | 82 | } |
| 81 | buffer_cache.UpdateComputeBuffers(); | 83 | buffer_cache.UpdateComputeBuffers(); |
| @@ -112,9 +114,12 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute, | |||
| 112 | PushImageDescriptors(info, samplers.data(), image_view_ids.data(), texture_cache, | 114 | PushImageDescriptors(info, samplers.data(), image_view_ids.data(), texture_cache, |
| 113 | update_descriptor_queue, image_index); | 115 | update_descriptor_queue, image_index); |
| 114 | 116 | ||
| 115 | if (!building_flag.test()) { | 117 | if (!is_built.load(std::memory_order::relaxed)) { |
| 116 | // Wait for the pipeline to be built | 118 | // Wait for the pipeline to be built |
| 117 | scheduler.Record([this](vk::CommandBuffer) { building_flag.wait(false); }); | 119 | scheduler.Record([this](vk::CommandBuffer) { |
| 120 | std::unique_lock lock{build_mutex}; | ||
| 121 | build_condvar.wait(lock, [this] { return is_built.load(std::memory_order::relaxed); }); | ||
| 122 | }); | ||
| 118 | } | 123 | } |
| 119 | scheduler.Record([this](vk::CommandBuffer cmdbuf) { | 124 | scheduler.Record([this](vk::CommandBuffer cmdbuf) { |
| 120 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); | 125 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); |
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.h b/src/video_core/renderer_vulkan/vk_compute_pipeline.h index 02da504f7..104e6cc85 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.h | |||
| @@ -4,6 +4,8 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <mutex> | ||
| 8 | #include <condition_variable> | ||
| 7 | #include <atomic> | 9 | #include <atomic> |
| 8 | 10 | ||
| 9 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| @@ -47,7 +49,10 @@ private: | |||
| 47 | vk::PipelineLayout pipeline_layout; | 49 | vk::PipelineLayout pipeline_layout; |
| 48 | vk::DescriptorUpdateTemplateKHR descriptor_update_template; | 50 | vk::DescriptorUpdateTemplateKHR descriptor_update_template; |
| 49 | vk::Pipeline pipeline; | 51 | vk::Pipeline pipeline; |
| 50 | std::atomic_flag building_flag{}; | 52 | |
| 53 | std::condition_variable build_condvar; | ||
| 54 | std::mutex build_mutex; | ||
| 55 | std::atomic_bool is_built{false}; | ||
| 51 | }; | 56 | }; |
| 52 | 57 | ||
| 53 | } // namespace Vulkan | 58 | } // namespace Vulkan |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index e8c3a5624..67de3cb79 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -135,8 +135,10 @@ GraphicsPipeline::GraphicsPipeline(Tegra::Engines::Maxwell3D& maxwell3d_, | |||
| 135 | 135 | ||
| 136 | const VkRenderPass render_pass{render_pass_cache.Get(MakeRenderPassKey(state))}; | 136 | const VkRenderPass render_pass{render_pass_cache.Get(MakeRenderPassKey(state))}; |
| 137 | MakePipeline(device, render_pass); | 137 | MakePipeline(device, render_pass); |
| 138 | building_flag.test_and_set(); | 138 | |
| 139 | building_flag.notify_all(); | 139 | std::lock_guard lock{build_mutex}; |
| 140 | is_built = true; | ||
| 141 | build_condvar.notify_one(); | ||
| 140 | }}; | 142 | }}; |
| 141 | if (worker_thread) { | 143 | if (worker_thread) { |
| 142 | worker_thread->QueueWork(std::move(func)); | 144 | worker_thread->QueueWork(std::move(func)); |
| @@ -196,8 +198,12 @@ void GraphicsPipeline::Configure(bool is_indexed) { | |||
| 196 | texture_cache.UpdateRenderTargets(false); | 198 | texture_cache.UpdateRenderTargets(false); |
| 197 | scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); | 199 | scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); |
| 198 | 200 | ||
| 199 | if (!building_flag.test()) { | 201 | if (!is_built.load(std::memory_order::relaxed)) { |
| 200 | scheduler.Record([this](vk::CommandBuffer) { building_flag.wait(false); }); | 202 | // Wait for the pipeline to be built |
| 203 | scheduler.Record([this](vk::CommandBuffer) { | ||
| 204 | std::unique_lock lock{build_mutex}; | ||
| 205 | build_condvar.wait(lock, [this] { return is_built.load(std::memory_order::relaxed); }); | ||
| 206 | }); | ||
| 201 | } | 207 | } |
| 202 | if (scheduler.UpdateGraphicsPipeline(this)) { | 208 | if (scheduler.UpdateGraphicsPipeline(this)) { |
| 203 | scheduler.Record([this](vk::CommandBuffer cmdbuf) { | 209 | scheduler.Record([this](vk::CommandBuffer cmdbuf) { |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 4e0583157..7d14d2378 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h | |||
| @@ -6,6 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <atomic> | 8 | #include <atomic> |
| 9 | #include <condition_variable> | ||
| 10 | #include <mutex> | ||
| 9 | 11 | ||
| 10 | #include "common/thread_worker.h" | 12 | #include "common/thread_worker.h" |
| 11 | #include "shader_recompiler/shader_info.h" | 13 | #include "shader_recompiler/shader_info.h" |
| @@ -63,7 +65,10 @@ private: | |||
| 63 | vk::PipelineLayout pipeline_layout; | 65 | vk::PipelineLayout pipeline_layout; |
| 64 | vk::DescriptorUpdateTemplateKHR descriptor_update_template; | 66 | vk::DescriptorUpdateTemplateKHR descriptor_update_template; |
| 65 | vk::Pipeline pipeline; | 67 | vk::Pipeline pipeline; |
| 66 | std::atomic_flag building_flag{}; | 68 | |
| 69 | std::condition_variable build_condvar; | ||
| 70 | std::mutex build_mutex; | ||
| 71 | std::atomic_bool is_built{false}; | ||
| 67 | }; | 72 | }; |
| 68 | 73 | ||
| 69 | } // namespace Vulkan | 74 | } // namespace Vulkan |