frames in flight

This commit is contained in:
David Allemang
2024-04-01 23:49:26 -04:00
parent 790c7955c7
commit 0bcc87adc3

View File

@@ -107,25 +107,18 @@ pub fn main() !void {
image: vk.Image = .null_handle, image: vk.Image = .null_handle,
view: vk.ImageView = .null_handle, view: vk.ImageView = .null_handle,
cmdbuf: vk.CommandBuffer = .null_handle, cmdbuf: vk.CommandBuffer = .null_handle,
// fence: vk.Fence = .null_handle, fence: vk.Fence = .null_handle,
// image_available: vk.Semaphore = .null_handle, image_available: vk.Semaphore = .null_handle,
// render_finished: vk.Semaphore = .null_handle, render_finished: vk.Semaphore = .null_handle,
}; };
var chain = std.MultiArrayList(ChainImage){}; var chain = std.MultiArrayList(ChainImage){};
defer chain.deinit(ally); defer chain.deinit(ally);
defer vkd.freeCommandBuffers(dev, pool, @intCast(chain.len), chain.items(.cmdbuf).ptr); 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(.view)) |view| vkd.destroyImageView(dev, view, null);
// defer for (chain.items(.fence)) |fence| vkd.destroyFence(dev, fence, 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(.image_available)) |sem| vkd.destroySemaphore(dev, sem, null);
// defer for (chain.items(.render_finished)) |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);
swapchain = try vkd.createSwapchainKHR(dev, &.{ swapchain = try vkd.createSwapchainKHR(dev, &.{
.surface = surface, .surface = surface,
@@ -164,17 +157,17 @@ pub fn main() !void {
}, null); }, null);
} }
// for (chain.items(.fence)) |*fence| { for (chain.items(.fence)) |*fence| {
// fence.* = try vkd.createFence(dev, &.{ .flags = .{ .signaled_bit = true } }, null); fence.* = try vkd.createFence(dev, &.{ .flags = .{ .signaled_bit = true } }, null);
// } }
//
// for (chain.items(.image_available)) |*sem| { for (chain.items(.image_available)) |*sem| {
// sem.* = try vkd.createSemaphore(dev, &.{}, null); sem.* = try vkd.createSemaphore(dev, &.{}, null);
// } }
//
// for (chain.items(.render_finished)) |*sem| { for (chain.items(.render_finished)) |*sem| {
// sem.* = try vkd.createSemaphore(dev, &.{}, null); sem.* = try vkd.createSemaphore(dev, &.{}, null);
// } }
try vkd.allocateCommandBuffers(dev, &.{ try vkd.allocateCommandBuffers(dev, &.{
.command_buffer_count = @intCast(chain.len), .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); 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) { while (c.glfwWindowShouldClose(window) == c.GLFW_FALSE) {
var w: c_int = undefined; var w: c_int = undefined;
@@ -237,31 +230,32 @@ pub fn main() !void {
continue; continue;
} }
_ = try vkd.waitForFences(dev, 1, @ptrCast(&frame_fence), vk.TRUE, std.math.maxInt(u64)); const frame: ChainImage = chain.get(index);
try vkd.resetFences(dev, 1, @ptrCast(&frame_fence)); // 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; // var index: u32 = undefined;
// try vkd.acquireNextImageKHR(dev, swapchain, std.math.maxInt(u64), frame., fence); // 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}); // 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{ try vkd.queueSubmit(queue, 1, @ptrCast(&vk.SubmitInfo{
.wait_semaphore_count = 1, .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 }), .p_wait_dst_stage_mask = @ptrCast(&vk.PipelineStageFlags{ .color_attachment_output_bit = true }),
.command_buffer_count = 1, .command_buffer_count = 1,
.p_command_buffers = @ptrCast(&frame.cmdbuf), .p_command_buffers = @ptrCast(&frame.cmdbuf),
.signal_semaphore_count = 1, .signal_semaphore_count = 1,
.p_signal_semaphores = @ptrCast(&render_finished), .p_signal_semaphores = @ptrCast(&frame.render_finished),
}), frame_fence); }), frame.fence);
_ = try vkd.queuePresentKHR(queue, &.{ _ = try vkd.queuePresentKHR(queue, &.{
.wait_semaphore_count = 1, .wait_semaphore_count = 1,
.p_wait_semaphores = @ptrCast(&render_finished), .p_wait_semaphores = @ptrCast(&frame.render_finished),
.swapchain_count = 1, .swapchain_count = 1,
.p_swapchains = @ptrCast(&swapchain), .p_swapchains = @ptrCast(&swapchain),
.p_image_indices = @ptrCast(&result.image_index), .p_image_indices = @ptrCast(&result.image_index),
@@ -294,6 +288,8 @@ pub fn main() !void {
// } // }
c.glfwPollEvents(); c.glfwPollEvents();
index = @intCast((index + 1) % chain.len);
} }
// try swapchain.waitForAllFences(); // try swapchain.waitForAllFences();