1 // 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_EVENT_HPP_ 16 #define VK_EVENT_HPP_ 17 18 #include "VkObject.hpp" 19 20 #include "marl/mutex.h" 21 #include "marl/tsa.h" 22 23 #include <condition_variable> 24 25 namespace vk { 26 27 class Event : public Object<Event, VkEvent> 28 { 29 public: Event(const VkEventCreateInfo * pCreateInfo,void * mem)30 Event(const VkEventCreateInfo *pCreateInfo, void *mem) 31 { 32 } 33 ComputeRequiredAllocationSize(const VkEventCreateInfo * pCreateInfo)34 static size_t ComputeRequiredAllocationSize(const VkEventCreateInfo *pCreateInfo) 35 { 36 return 0; 37 } 38 signal()39 void signal() 40 { 41 { 42 marl::lock lock(mutex); 43 status = VK_EVENT_SET; 44 } 45 condition.notify_all(); 46 } 47 reset()48 void reset() 49 { 50 marl::lock lock(mutex); 51 status = VK_EVENT_RESET; 52 } 53 getStatus()54 VkResult getStatus() 55 { 56 marl::lock lock(mutex); 57 auto result = status; 58 return result; 59 } 60 wait()61 void wait() 62 { 63 marl::lock lock(mutex); 64 lock.wait(condition, [this]() REQUIRES(mutex) { return status == VK_EVENT_SET; }); 65 } 66 67 private: 68 marl::mutex mutex; 69 VkResult status GUARDED_BY(mutex) = VK_EVENT_RESET; 70 std::condition_variable condition; 71 }; 72 Cast(VkEvent object)73static inline Event *Cast(VkEvent object) 74 { 75 return Event::Cast(object); 76 } 77 78 } // namespace vk 79 80 #endif // VK_EVENT_HPP_ 81