mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	vk_resource_manager: Implement VKFenceWatch
A fence watch is used to keep track of the usage of a fence and protect a resource or set of resources without having to inherit from their handlers.
This commit is contained in:
		
							parent
							
								
									25c2fe1c6b
								
							
						
					
					
						commit
						aa0b6babda
					
				| @ -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
 | ||||
|  | ||||
| @ -86,4 +86,34 @@ private: | ||||
|     bool is_used = false;  ///< The fence has been commited but it has not been checked to be free.
 | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * A fence watch is used to keep track of the usage of a fence and protect a resource or set of | ||||
|  * resources without having to inherit VKResource from their handlers. | ||||
|  */ | ||||
| class VKFenceWatch final : public VKResource { | ||||
| public: | ||||
|     explicit VKFenceWatch(); | ||||
|     ~VKFenceWatch(); | ||||
| 
 | ||||
|     /// Waits for the fence to be released.
 | ||||
|     void Wait(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Waits for a previous fence and watches a new one. | ||||
|      * @param new_fence New fence to wait to. | ||||
|      */ | ||||
|     void Watch(VKFence& new_fence); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Checks if it's currently being watched and starts watching it if it's available. | ||||
|      * @returns True if a watch has started, false if it's being watched. | ||||
|      */ | ||||
|     bool TryWatch(VKFence& new_fence); | ||||
| 
 | ||||
|     void OnFenceRemoval(VKFence* signaling_fence) override; | ||||
| 
 | ||||
| private: | ||||
|     VKFence* fence{}; ///< Fence watching this resource. nullptr when the watch is free.
 | ||||
| }; | ||||
| 
 | ||||
| } // namespace Vulkan
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
						ReinUsesLisp