1 module gfx.vulkan.sync; 2 3 package: 4 5 import core.time : dur, Duration; 6 7 import gfx.bindings.vulkan; 8 9 import gfx.core.rc; 10 import gfx.graal.sync; 11 import gfx.vulkan.device; 12 13 class VulkanSemaphore : VulkanDevObj!(VkSemaphore, "DestroySemaphore"), Semaphore 14 { 15 mixin(atomicRcCode); 16 17 this(VkSemaphore vkObj, VulkanDevice dev) { 18 super(vkObj, dev); 19 } 20 21 override @property Device device() { 22 return dev; 23 } 24 } 25 26 class VulkanFence : VulkanDevObj!(VkFence, "DestroyFence"), Fence 27 { 28 mixin(atomicRcCode); 29 30 this (VkFence vkObj, VulkanDevice dev) { 31 super(vkObj, dev); 32 } 33 34 override @property Device device() { 35 return dev; 36 } 37 38 override @property bool signaled() { 39 return vk.GetFenceStatus(vkDev, vkObj) == VK_SUCCESS; 40 } 41 42 override void reset() 43 { 44 auto vkF = vkObj; 45 vulkanEnforce( 46 vk.ResetFences(vkDev, 1, &vkF), 47 "Could not reset Vulkan fence" 48 ); 49 } 50 51 override void wait(Duration timeout=dur!"seconds"(-1)) 52 { 53 const nsecs = timeout.total!"nsecs"; 54 const vkTimeout = nsecs < 0 ? ulong.max : cast(ulong)nsecs; 55 auto vkF = vkObj; 56 57 vulkanEnforce( 58 vk.WaitForFences(vkDev, 1, &vkF, VK_TRUE, vkTimeout), 59 "Could not wait for Vulkan fence" 60 ); 61 } 62 }