78 lines
1.5 KiB
Go
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() }))
|
|
}
|