diff options
| author | 2019-12-19 02:13:32 -0300 | |
|---|---|---|
| committer | 2019-12-19 16:31:34 -0300 | |
| commit | 6ddffa010a86698543e2d0ecc07d1b93d8700e53 (patch) | |
| tree | fa706a001d3ec81c919479ec2785f5b95ed0a8ea /src | |
| parent | vk_device: Add entry to catch device losses (diff) | |
| download | yuzu-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.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_resource_manager.h | 8 |
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 | ||
| 145 | void 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 | |||
| 145 | VKFenceWatch::VKFenceWatch() = default; | 150 | VKFenceWatch::VKFenceWatch() = default; |
| 146 | 151 | ||
| 152 | VKFenceWatch::VKFenceWatch(VKFence& initial_fence) { | ||
| 153 | Watch(initial_fence); | ||
| 154 | } | ||
| 155 | |||
| 156 | VKFenceWatch::VKFenceWatch(VKFenceWatch&& rhs) noexcept { | ||
| 157 | fence = std::exchange(rhs.fence, nullptr); | ||
| 158 | if (fence) { | ||
| 159 | fence->RedirectProtection(&rhs, this); | ||
| 160 | } | ||
| 161 | } | ||
| 162 | |||
| 163 | VKFenceWatch& 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 | |||
| 147 | VKFenceWatch::~VKFenceWatch() { | 171 | VKFenceWatch::~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: | |||
| 97 | class VKFenceWatch final : public VKResource { | 100 | class VKFenceWatch final : public VKResource { |
| 98 | public: | 101 | public: |
| 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 | ||