1 /* Copyright (c) 2017-2018 Hans-Kristian Arntzen
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining
4  * a copy of this software and associated documentation files (the
5  * "Software"), to deal in the Software without restriction, including
6  * without limitation the rights to use, copy, modify, merge, publish,
7  * distribute, sublicense, and/or sell copies of the Software, and to
8  * permit persons to whom the Software is furnished to do so, subject to
9  * the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be
12  * included in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22 
23 #pragma once
24 
25 #include "vulkan_common.hpp"
26 #include "vulkan.hpp"
27 #include "object_pool.hpp"
28 
29 namespace Vulkan
30 {
31 class Device;
32 
33 class FenceHolder;
34 struct FenceHolderDeleter
35 {
36 	void operator()(FenceHolder *fence);
37 };
38 
39 class FenceHolder : public Util::IntrusivePtrEnabled<FenceHolder, FenceHolderDeleter, HandleCounter>
40 {
41 public:
42 	friend struct FenceHolderDeleter;
43 
44 	~FenceHolder();
45 	void wait();
46 
47 	bool wait_timeout(uint64_t nsec);
48 
49 	VkFence get_fence() const;
50 
51 private:
52 	friend class Util::ObjectPool<FenceHolder>;
FenceHolder(Device * device,VkFence fence)53 	FenceHolder(Device *device, VkFence fence) : device(device), fence(fence)
54 	{
55 	}
56 
57 	Device *device;
58 	VkFence fence;
59 };
60 
61 using Fence = Util::IntrusivePtr<FenceHolder>;
62 }
63