summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-19 02:13:32 -0300
committerGravatar ReinUsesLisp2019-12-19 16:31:34 -0300
commit6ddffa010a86698543e2d0ecc07d1b93d8700e53 (patch)
treefa706a001d3ec81c919479ec2785f5b95ed0a8ea /src
parentvk_device: Add entry to catch device losses (diff)
downloadyuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.gz
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.xz
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.zip
vk_resource_manager: Implement VKFenceWatch move constructor
This allows us to put VKFenceWatch inside a std::vector without storing it in heap. On move we have to signal the fences where the new protected resource is, adding some overhead.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/vk_resource_manager.cpp24
-rw-r--r--src/video_core/renderer_vulkan/vk_resource_manager.h8
2 files changed, 32 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_resource_manager.cpp b/src/video_core/renderer_vulkan/vk_resource_manager.cpp
index a0ca5f2ae..aa145de5c 100644
--- a/src/video_core/renderer_vulkan/vk_resource_manager.cpp
+++ b/src/video_core/renderer_vulkan/vk_resource_manager.cpp
@@ -142,8 +142,32 @@ void VKFence::Unprotect(VKResource* resource) {
142 protected_resources.erase(it); 142 protected_resources.erase(it);
143} 143}
144 144
145void VKFence::RedirectProtection(VKResource* old_resource, VKResource* new_resource) noexcept {
146 std::replace(std::begin(protected_resources), std::end(protected_resources), old_resource,
147 new_resource);
148}
149
145VKFenceWatch::VKFenceWatch() = default; 150VKFenceWatch::VKFenceWatch() = default;
146 151
152VKFenceWatch::VKFenceWatch(VKFence& initial_fence) {
153 Watch(initial_fence);
154}
155
156VKFenceWatch::VKFenceWatch(VKFenceWatch&& rhs) noexcept {
157 fence = std::exchange(rhs.fence, nullptr);
158 if (fence) {
159 fence->RedirectProtection(&rhs, this);
160 }
161}
162
163VKFenceWatch& VKFenceWatch::operator=(VKFenceWatch&& rhs) noexcept {
164 fence = std::exchange(rhs.fence, nullptr);
165 if (fence) {
166 fence->RedirectProtection(&rhs, this);
167 }
168 return *this;
169}
170
147VKFenceWatch::~VKFenceWatch() { 171VKFenceWatch::~VKFenceWatch() {
148 if (fence) { 172 if (fence) {
149 fence->Unprotect(this); 173 fence->Unprotect(this);
diff --git a/src/video_core/renderer_vulkan/vk_resource_manager.h b/src/video_core/renderer_vulkan/vk_resource_manager.h
index 08ee86fa6..3a9683f95 100644
--- a/src/video_core/renderer_vulkan/vk_resource_manager.h
+++ b/src/video_core/renderer_vulkan/vk_resource_manager.h
@@ -65,6 +65,9 @@ public:
65 /// Removes protection for a resource. 65 /// Removes protection for a resource.
66 void Unprotect(VKResource* resource); 66 void Unprotect(VKResource* resource);
67 67
68 /// Redirects one protected resource to a new address.
69 void RedirectProtection(VKResource* old_resource, VKResource* new_resource) noexcept;
70
68 /// Retreives the fence. 71 /// Retreives the fence.
69 operator vk::Fence() const { 72 operator vk::Fence() const {
70 return *handle; 73 return *handle;
@@ -97,8 +100,13 @@ private:
97class VKFenceWatch final : public VKResource { 100class VKFenceWatch final : public VKResource {
98public: 101public:
99 explicit VKFenceWatch(); 102 explicit VKFenceWatch();
103 VKFenceWatch(VKFence& initial_fence);
104 VKFenceWatch(VKFenceWatch&&) noexcept;
105 VKFenceWatch(const VKFenceWatch&) = delete;
100 ~VKFenceWatch() override; 106 ~VKFenceWatch() override;
101 107
108 VKFenceWatch& operator=(VKFenceWatch&&) noexcept;
109
102 /// Waits for the fence to be released. 110 /// Waits for the fence to be released.
103 void Wait(); 111 void Wait();
104 112