const std = @import("std"); const vk = @import("vulkan"); const device = @import("device.zig"); pub const SyncContext = struct { image_available_semaphore: vk.Semaphore, render_finished_semaphore: vk.Semaphore, in_flight_fence: vk.Fence, pub fn destroy(self: *const SyncContext, ldc: *const device.LogicalDeviceContext) void { ldc.vkd.destroyFence(ldc.device, self.in_flight_fence, null); ldc.vkd.destroySemaphore(ldc.device, self.render_finished_semaphore, null); ldc.vkd.destroySemaphore(ldc.device, self.image_available_semaphore, null); } }; pub fn initSyncObjects(ldc: device.LogicalDeviceContext) !SyncContext { const semaphore_create_info = vk.SemaphoreCreateInfo{}; const image_available_semaphore = try ldc.vkd.createSemaphore( ldc.device, &semaphore_create_info, null, ); errdefer ldc.vkd.destroySemaphore(ldc.device, image_available_semaphore, null); const render_finished_semaphore = try ldc.vkd.createSemaphore( ldc.device, &semaphore_create_info, null, ); errdefer ldc.vkd.destroySemaphore(ldc.device, render_finished_semaphore, null); const fence_create_info = vk.FenceCreateInfo{ .flags = .{ .signaled_bit = true, }, }; const in_flight_fence = try ldc.vkd.createFence( ldc.device, &fence_create_info, null, ); std.debug.print("created synchronization objects\n", .{}); return .{ .image_available_semaphore = image_available_semaphore, .render_finished_semaphore = render_finished_semaphore, .in_flight_fence = in_flight_fence, }; }