package sync import ( "time" "zworld/engine/renderapi/device" "zworld/engine/util" "github.com/vkngwrapper/core/v2/core1_0" "github.com/vkngwrapper/core/v2/driver" ) type Fence interface { device.Resource[core1_0.Fence] Reset() Wait() Done() bool } type fence struct { device device.T ptr core1_0.Fence } func NewFence(device device.T, name string, signaled bool) Fence { var flags core1_0.FenceCreateFlags if signaled { flags = core1_0.FenceCreateSignaled } ptr, _, err := device.Ptr().CreateFence(nil, core1_0.FenceCreateInfo{ Flags: flags, }) if err != nil { panic(err) } device.SetDebugObjectName(driver.VulkanHandle(ptr.Handle()), core1_0.ObjectTypeFence, name) return &fence{ device: device, ptr: ptr, } } func (f *fence) Ptr() core1_0.Fence { return f.ptr } func (f *fence) Reset() { f.device.Ptr().ResetFences([]core1_0.Fence{f.ptr}) } func (f *fence) Destroy() { f.ptr.Destroy(nil) f.ptr = nil } func (f *fence) Wait() { f.device.Ptr().WaitForFences(true, time.Hour, []core1_0.Fence{f.ptr}) } func (f *fence) Done() bool { r, err := f.ptr.Status() if err != nil { panic(err) } return r == core1_0.VKSuccess } func (f *fence) WaitForAny(fences []Fence, timeout time.Duration) { f.device.Ptr().WaitForFences(false, timeout, util.Map(fences, func(f Fence) core1_0.Fence { return f.Ptr() })) } func (f *fence) WaitForAll(fences []Fence, timeout time.Duration) { f.device.Ptr().WaitForFences(true, timeout, util.Map(fences, func(f Fence) core1_0.Fence { return f.Ptr() })) }