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,
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();