1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package gpu_core
import "core:log"
import vk "vendor:vulkan"
MAX_FRAMES_IN_FLIGHT :: 2
Frame_Sync :: struct {
image_available: vk.Semaphore,
in_flight: vk.Fence,
}
create_sync_objects :: proc(dev: ^Gpu_Device) -> (syncs: [MAX_FRAMES_IN_FLIGHT]Frame_Sync, ok: bool) {
sem_info := vk.SemaphoreCreateInfo{
sType = .SEMAPHORE_CREATE_INFO,
}
fence_info := vk.FenceCreateInfo{
sType = .FENCE_CREATE_INFO,
flags = {.SIGNALED},
}
for i in 0..<MAX_FRAMES_IN_FLIGHT {
result := vk.CreateSemaphore(dev.device, &sem_info, nil, &syncs[i].image_available)
if result != .SUCCESS {
log.errorf("gpu/core: failed to create image_available semaphore %d: %v", i, result)
destroy_sync_objects(dev, &syncs)
return {}, false
}
result = vk.CreateFence(dev.device, &fence_info, nil, &syncs[i].in_flight)
if result != .SUCCESS {
log.errorf("gpu/core: failed to create in_flight fence %d: %v", i, result)
destroy_sync_objects(dev, &syncs)
return {}, false
}
}
return syncs, true
}
destroy_sync_objects :: proc(dev: ^Gpu_Device, syncs: ^[MAX_FRAMES_IN_FLIGHT]Frame_Sync) {
for i in 0..<MAX_FRAMES_IN_FLIGHT {
if syncs[i].image_available != 0 {
vk.DestroySemaphore(dev.device, syncs[i].image_available, nil)
syncs[i].image_available = 0
}
if syncs[i].in_flight != 0 {
vk.DestroyFence(dev.device, syncs[i].in_flight, nil)
syncs[i].in_flight = 0
}
}
}