blob: 086eff4da5fdc5bc3d3fc91fcd274ef8ee9207f7 [file] [log] [blame]
Alexis Hetu1f23d8c2018-10-16 14:40:19 -04001// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef VK_FENCE_HPP_
16#define VK_FENCE_HPP_
17
18#include "VkObject.hpp"
Ben Clayton6779e5e2019-05-20 11:07:58 +010019#include "System/Synchronization.hpp"
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040020
Ben Clayton59f2d5e2019-11-13 21:46:11 +000021#include "marl/containers.h"
22#include "marl/event.h"
23#include "marl/waitgroup.h"
24
Nicolas Capens157ba262019-12-10 17:49:14 -050025namespace vk {
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040026
Ben Clayton6d33e8c2019-05-20 11:15:03 +010027class Fence : public Object<Fence, VkFence>, public sw::TaskEvents
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040028{
29public:
Ben Clayton2ed93ab2019-12-17 20:38:03 +000030 Fence(const VkFenceCreateInfo *pCreateInfo, void *mem)
31 : event(marl::Event::Mode::Manual, (pCreateInfo->flags & VK_FENCE_CREATE_SIGNALED_BIT) != 0)
32 {}
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040033
Ben Clayton2ed93ab2019-12-17 20:38:03 +000034 static size_t ComputeRequiredAllocationSize(const VkFenceCreateInfo *pCreateInfo)
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040035 {
36 return 0;
37 }
38
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040039 void reset()
40 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000041 event.clear();
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040042 }
43
Alexis Hetue1f51b92019-04-23 15:34:34 -040044 VkResult getStatus()
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040045 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000046 return event.isSignalled() ? VK_SUCCESS : VK_NOT_READY;
Alexis Hetue1f51b92019-04-23 15:34:34 -040047 }
48
49 VkResult wait()
50 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000051 event.wait();
Ben Clayton6779e5e2019-05-20 11:07:58 +010052 return VK_SUCCESS;
Alexis Hetue1f51b92019-04-23 15:34:34 -040053 }
54
Ben Clayton2ed93ab2019-12-17 20:38:03 +000055 template<class CLOCK, class DURATION>
56 VkResult wait(const std::chrono::time_point<CLOCK, DURATION> &timeout)
Alexis Hetue1f51b92019-04-23 15:34:34 -040057 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000058 return event.wait_until(timeout) ? VK_SUCCESS : VK_TIMEOUT;
Ben Clayton6779e5e2019-05-20 11:07:58 +010059 }
60
Ben Clayton2ed93ab2019-12-17 20:38:03 +000061 const marl::Event &getEvent() const { return event; }
Ben Clayton951d48d2019-11-13 21:46:59 +000062
Ben Clayton6d33e8c2019-05-20 11:15:03 +010063 // TaskEvents compliance
64 void start() override
Ben Clayton6779e5e2019-05-20 11:07:58 +010065 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000066 ASSERT(!event.isSignalled());
Ben Clayton6779e5e2019-05-20 11:07:58 +010067 wg.add();
68 }
69
Ben Clayton6d33e8c2019-05-20 11:15:03 +010070 void finish() override
Ben Clayton6779e5e2019-05-20 11:07:58 +010071 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000072 ASSERT(!event.isSignalled());
Nicolas Capens81bc9d92019-12-16 15:05:57 -050073 if(wg.done())
Ben Clayton6779e5e2019-05-20 11:07:58 +010074 {
Ben Clayton59f2d5e2019-11-13 21:46:11 +000075 event.signal();
Ben Clayton6779e5e2019-05-20 11:07:58 +010076 }
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040077 }
78
79private:
Ben Clayton2ed93ab2019-12-17 20:38:03 +000080 Fence(const Fence &) = delete;
Ben Clayton6779e5e2019-05-20 11:07:58 +010081
Ben Clayton59f2d5e2019-11-13 21:46:11 +000082 marl::WaitGroup wg;
83 const marl::Event event;
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040084};
85
Ben Clayton2ed93ab2019-12-17 20:38:03 +000086static inline Fence *Cast(VkFence object)
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040087{
Alexis Hetubd4cf812019-06-14 15:14:07 -040088 return Fence::Cast(object);
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040089}
90
Nicolas Capens157ba262019-12-10 17:49:14 -050091} // namespace vk
Alexis Hetu1f23d8c2018-10-16 14:40:19 -040092
Ben Clayton2ed93ab2019-12-17 20:38:03 +000093#endif // VK_FENCE_HPP_