summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_resource_manager.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-12-19 06:13:32 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-12-19 20:31:34 +0100
commit6ddffa010a86698543e2d0ecc07d1b93d8700e53 (patch)
treefa706a001d3ec81c919479ec2785f5b95ed0a8ea /src/video_core/renderer_vulkan/vk_resource_manager.cpp
parentvk_device: Add entry to catch device losses (diff)
downloadyuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.gz
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.bz2
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.lz
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.xz
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.tar.zst
yuzu-6ddffa010a86698543e2d0ecc07d1b93d8700e53.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_vulkan/vk_resource_manager.cpp24
1 files changed, 24 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) {
protected_resources.erase(it);
}
+void VKFence::RedirectProtection(VKResource* old_resource, VKResource* new_resource) noexcept {
+ std::replace(std::begin(protected_resources), std::end(protected_resources), old_resource,
+ new_resource);
+}
+
VKFenceWatch::VKFenceWatch() = default;
+VKFenceWatch::VKFenceWatch(VKFence& initial_fence) {
+ Watch(initial_fence);
+}
+
+VKFenceWatch::VKFenceWatch(VKFenceWatch&& rhs) noexcept {
+ fence = std::exchange(rhs.fence, nullptr);
+ if (fence) {
+ fence->RedirectProtection(&rhs, this);
+ }
+}
+
+VKFenceWatch& VKFenceWatch::operator=(VKFenceWatch&& rhs) noexcept {
+ fence = std::exchange(rhs.fence, nullptr);
+ if (fence) {
+ fence->RedirectProtection(&rhs, this);
+ }
+ return *this;
+}
+
VKFenceWatch::~VKFenceWatch() {
if (fence) {
fence->Unprotect(this);