summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp15
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.h7
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp14
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.h7
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