frames in flight
This commit is contained in:
64
src/main.zig
64
src/main.zig
@@ -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();
|
||||||
|
Reference in New Issue
Block a user