zworld/engine/renderapi/sync/fence.go
2024-01-14 22:56:06 +08:00

78 lines
1.5 KiB
Go

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() }))
}