From 0bcc87adc33970de359257fc428e4acc0b24bb9f Mon Sep 17 00:00:00 2001 From: David Allemang Date: Mon, 1 Apr 2024 23:49:26 -0400 Subject: [PATCH] frames in flight --- src/main.zig | 66 ++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/src/main.zig b/src/main.zig index 8fceabd..5a5accf 100644 --- a/src/main.zig +++ b/src/main.zig @@ -107,25 +107,18 @@ pub fn main() !void { image: vk.Image = .null_handle, view: vk.ImageView = .null_handle, cmdbuf: vk.CommandBuffer = .null_handle, - // fence: vk.Fence = .null_handle, - // image_available: vk.Semaphore = .null_handle, - // render_finished: vk.Semaphore = .null_handle, + fence: vk.Fence = .null_handle, + image_available: vk.Semaphore = .null_handle, + render_finished: vk.Semaphore = .null_handle, }; var chain = std.MultiArrayList(ChainImage){}; defer chain.deinit(ally); defer vkd.freeCommandBuffers(dev, pool, @intCast(chain.len), chain.items(.cmdbuf).ptr); defer for (chain.items(.view)) |view| vkd.destroyImageView(dev, view, null); - // defer for (chain.items(.fence)) |fence| vkd.destroyFence(dev, fence, null); - // defer for (chain.items(.image_available)) |sem| vkd.destroySemaphore(dev, sem, null); - // defer for (chain.items(.render_finished)) |sem| vkd.destroySemaphore(dev, sem, null); - - const frame_fence = try vkd.createFence(dev, &.{ .flags = .{ .signaled_bit = true } }, null); - defer vkd.destroyFence(dev, frame_fence, null); - const image_available = try vkd.createSemaphore(dev, &.{}, null); - defer vkd.destroySemaphore(dev, image_available, null); - const render_finished = try vkd.createSemaphore(dev, &.{}, null); - defer vkd.destroySemaphore(dev, render_finished, null); + defer for (chain.items(.fence)) |fence| vkd.destroyFence(dev, fence, null); + defer for (chain.items(.image_available)) |sem| vkd.destroySemaphore(dev, sem, null); + defer for (chain.items(.render_finished)) |sem| vkd.destroySemaphore(dev, sem, null); swapchain = try vkd.createSwapchainKHR(dev, &.{ .surface = surface, @@ -164,17 +157,17 @@ pub fn main() !void { }, null); } - // for (chain.items(.fence)) |*fence| { - // fence.* = try vkd.createFence(dev, &.{ .flags = .{ .signaled_bit = true } }, null); - // } - // - // for (chain.items(.image_available)) |*sem| { - // sem.* = try vkd.createSemaphore(dev, &.{}, null); - // } - // - // for (chain.items(.render_finished)) |*sem| { - // sem.* = try vkd.createSemaphore(dev, &.{}, null); - // } + for (chain.items(.fence)) |*fence| { + fence.* = try vkd.createFence(dev, &.{ .flags = .{ .signaled_bit = true } }, null); + } + + for (chain.items(.image_available)) |*sem| { + sem.* = try vkd.createSemaphore(dev, &.{}, null); + } + + for (chain.items(.render_finished)) |*sem| { + sem.* = try vkd.createSemaphore(dev, &.{}, null); + } try vkd.allocateCommandBuffers(dev, &.{ .command_buffer_count = @intCast(chain.len), @@ -224,7 +217,7 @@ pub fn main() !void { try record_cmdbuf(cmdbuf, vkd, image, view, extent, pipeline, vertex_buffer, index_buffer); } - // var index: u32 = 0; + var index: u32 = 0; while (c.glfwWindowShouldClose(window) == c.GLFW_FALSE) { var w: c_int = undefined; @@ -237,31 +230,32 @@ pub fn main() !void { continue; } - _ = try vkd.waitForFences(dev, 1, @ptrCast(&frame_fence), vk.TRUE, std.math.maxInt(u64)); - try vkd.resetFences(dev, 1, @ptrCast(&frame_fence)); + const frame: ChainImage = chain.get(index); + // const next_frame: ChainImage = chain.get((index + 1) % chain.len); - // const frame: ChainImage = chain.get(); + _ = try vkd.waitForFences(dev, 1, @ptrCast(&frame.fence), vk.TRUE, std.math.maxInt(u64)); + try vkd.resetFences(dev, 1, @ptrCast(&frame.fence)); // var index: u32 = undefined; // try vkd.acquireNextImageKHR(dev, swapchain, std.math.maxInt(u64), frame., fence); - const result = try vkd.acquireNextImageKHR(dev, swapchain, std.math.maxInt(u64), image_available, .null_handle); - + const result = try vkd.acquireNextImageKHR(dev, swapchain, std.math.maxInt(u64), frame.image_available, .null_handle); + // std.log.debug("frame {d}", .{result.image_index}); - const frame = chain.get(result.image_index); + // const frame = chain.get(result.image_index); try vkd.queueSubmit(queue, 1, @ptrCast(&vk.SubmitInfo{ .wait_semaphore_count = 1, - .p_wait_semaphores = @ptrCast(&image_available), + .p_wait_semaphores = @ptrCast(&frame.image_available), .p_wait_dst_stage_mask = @ptrCast(&vk.PipelineStageFlags{ .color_attachment_output_bit = true }), .command_buffer_count = 1, .p_command_buffers = @ptrCast(&frame.cmdbuf), .signal_semaphore_count = 1, - .p_signal_semaphores = @ptrCast(&render_finished), - }), frame_fence); + .p_signal_semaphores = @ptrCast(&frame.render_finished), + }), frame.fence); _ = try vkd.queuePresentKHR(queue, &.{ .wait_semaphore_count = 1, - .p_wait_semaphores = @ptrCast(&render_finished), + .p_wait_semaphores = @ptrCast(&frame.render_finished), .swapchain_count = 1, .p_swapchains = @ptrCast(&swapchain), .p_image_indices = @ptrCast(&result.image_index), @@ -294,6 +288,8 @@ pub fn main() !void { // } c.glfwPollEvents(); + + index = @intCast((index + 1) % chain.len); } // try swapchain.waitForAllFences();