summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_resource_manager.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-02-14 17:06:05 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-02-14 22:44:26 +0100
commitaa0b6babdad588d176fc67784f9905709845aa07 (patch)
treed8be258cecf13218af5283ef2fd8e04eab7fbc76 /src/video_core/renderer_vulkan/vk_resource_manager.cpp
parentvk_resource_manager: Implement VKFence (diff)
downloadyuzu-aa0b6babdad588d176fc67784f9905709845aa07.tar
yuzu-aa0b6babdad588d176fc67784f9905709845aa07.tar.gz
yuzu-aa0b6babdad588d176fc67784f9905709845aa07.tar.bz2
yuzu-aa0b6babdad588d176fc67784f9905709845aa07.tar.lz
yuzu-aa0b6babdad588d176fc67784f9905709845aa07.tar.xz
yuzu-aa0b6babdad588d176fc67784f9905709845aa07.tar.zst
yuzu-aa0b6babdad588d176fc67784f9905709845aa07.zip
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_resource_manager.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_resource_manager.cpp38
1 files changed, 38 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 1875bcf54..2e9c6ef34 100644
--- a/src/video_core/renderer_vulkan/vk_resource_manager.cpp
+++ b/src/video_core/renderer_vulkan/vk_resource_manager.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include <algorithm>
+#include "common/assert.h"
#include "video_core/renderer_vulkan/declarations.h"
#include "video_core/renderer_vulkan/vk_device.h"
#include "video_core/renderer_vulkan/vk_resource_manager.h"
@@ -79,4 +80,41 @@ void VKFence::Unprotect(const VKResource* resource) {
}
}
+VKFenceWatch::VKFenceWatch() = default;
+
+VKFenceWatch::~VKFenceWatch() {
+ if (fence) {
+ fence->Unprotect(this);
+ }
+}
+
+void VKFenceWatch::Wait() {
+ if (!fence) {
+ return;
+ }
+ fence->Wait();
+ fence->Unprotect(this);
+ fence = nullptr;
+}
+
+void VKFenceWatch::Watch(VKFence& new_fence) {
+ Wait();
+ fence = &new_fence;
+ fence->Protect(this);
+}
+
+bool VKFenceWatch::TryWatch(VKFence& new_fence) {
+ if (fence) {
+ return false;
+ }
+ fence = &new_fence;
+ fence->Protect(this);
+ return true;
+}
+
+void VKFenceWatch::OnFenceRemoval(VKFence* signaling_fence) {
+ ASSERT_MSG(signaling_fence == fence, "Removing the wrong fence");
+ fence = nullptr;
+}
+
} // namespace Vulkan