Complete all Vulkan wrappers. Maybe worth it.

This commit is contained in:
2025-12-05 22:07:06 +01:00
parent a372bcb981
commit 9baf42e838
11 changed files with 410 additions and 302 deletions

View File

@@ -686,9 +686,62 @@ pub fn deinit(self: *Game) void {
pub fn update(self: *Game, dt: f32) void {
self.player.update(dt);
self.render() catch |err| {
std.log.err("Failed to render: {s}", .{@errorName(err)});
@panic("Frame update failed");
};
}
pub fn onKeyDown(self: *Game, key: glfw.Key) void {
self.player.onKeyDown(key);
}
pub fn onKeyUp(self: *Game, key: glfw.Key) void {
self.player.onKeyUp(key);
}
pub fn onMouseMove(self: *Game, dx: f32, dy: f32) void {
self.player.onMouseMove(dx, dy);
}
pub fn onMouseDown(self: *Game, button: glfw.MouseButton) void {
_ = self;
_ = button;
}
pub fn onMouseUp(self: *Game, button: glfw.MouseButton) void {
_ = self;
_ = button;
}
fn render(self: *Game) !void {
const framebuffer_width, const framebuffer_height = blk: {
const w, const h = self.engine.mode.surface.window.getFramebufferSize();
break :blk [_]u32{ @intCast(w), @intCast(h) };
};
if (framebuffer_width == 0 or framebuffer_height == 0) {
return;
}
if (framebuffer_width != self.swapchain.extent.width or framebuffer_height != self.swapchain.extent.height) {
try self.recreateSwapchain();
}
if (self.swapchain.swapchain == .null_handle) {
return;
}
self.swapchain.acquire(self.engine) catch |err| switch (err) {
error.OutOfDateKHR => return self.recreateSwapchain(),
else => return err,
};
const extent = self.swapchain.extent;
const framebuffer_size = Vector2.init(
@floatFromInt(self.swapchain.extent.width),
@floatFromInt(self.swapchain.extent.height),
@floatFromInt(extent.width),
@floatFromInt(extent.height),
);
const camera_position = self.player.position.add(.init(0, 0, Player.camera_height));
@@ -722,63 +775,22 @@ pub fn update(self: *Game, dt: f32) void {
.ambientLight = ambient_light.asArray(),
};
const staging_memory = self.global_uniforms_staging_buffer.map(self.engine) catch |err| {
std.log.err("Failed to map global uniforms staging buffer: {s}", .{@errorName(err)});
@panic("Frame update failed");
};
const staging_memory = try self.global_uniforms_staging_buffer.map(self.engine);
@memcpy(staging_memory, std.mem.asBytes(&global_uniforms_data));
self.global_uniforms_staging_buffer.unmap(self.engine);
self.global_uniforms_transfer_command_buffer.submit(self.engine, .{
.signal_semaphores = &.{self.global_uniforms_transfer_semaphores[self.swapchain.image_index]},
}) catch |err| {
std.log.err("Failed to submit global uniforms transfer: {s}", .{@errorName(err)});
@panic("Frame update failed");
};
try self.global_uniforms_transfer_command_buffer.submit(self.engine, .{
.signal_semaphores = &.{self.global_uniforms_transfer_semaphores[self.swapchain.image_index.?]},
});
self.render() catch |err| {
std.log.err("Failed to render: {s}", .{@errorName(err)});
@panic("Frame update failed");
};
}
pub fn onKeyDown(self: *Game, key: glfw.Key) void {
self.player.onKeyDown(key);
}
pub fn onKeyUp(self: *Game, key: glfw.Key) void {
self.player.onKeyUp(key);
}
pub fn onMouseMove(self: *Game, dx: f32, dy: f32) void {
self.player.onMouseMove(dx, dy);
}
pub fn onMouseDown(self: *Game, button: glfw.MouseButton) void {
_ = self;
_ = button;
}
pub fn onMouseUp(self: *Game, button: glfw.MouseButton) void {
_ = self;
_ = button;
}
fn render(self: *Game) !void {
if (self.swapchain.swapchain == .null_handle) {
return;
}
const extent = self.swapchain.extent;
const command_buffer: CommandBuffer = try .init(self.engine, .graphics, .transient);
// NOTE Do not free command buffer yet
var command_buffer: CommandBuffer = try .init(self.engine, .graphics, .transient);
defer command_buffer.deinit(self.engine);
try command_buffer.beginCommandBuffer();
{
command_buffer.beginRenderPass(.{
.render_pass = self.swapchain.render_pass,
.framebuffer = self.swapchain.swapchain_images[self.swapchain.image_index].framebuffer,
.framebuffer = self.swapchain.swapchain_images[self.swapchain.image_index.?].framebuffer,
.render_area = .{
.offset = .{ .x = 0, .y = 0 },
.extent = extent,
@@ -833,26 +845,22 @@ fn render(self: *Game) !void {
}
try command_buffer.endCommandBuffer();
const res = try self.swapchain.present(self.engine, .{
self.swapchain.present(self.engine, .{
.command_buffer = command_buffer,
.wait_semaphores = &.{
.{
.semaphore = self.global_uniforms_transfer_semaphores[self.swapchain.image_index],
.semaphore = self.global_uniforms_transfer_semaphores[self.swapchain.image_index.?],
.stage_flags = .{ .vertex_shader_bit = true },
},
},
});
if (res == .suboptimal) {
try self.recreateSwapchain();
}
}
fn recreateSwapchain(self: *Game) !void {
self.swapchain.recreate(self.engine) catch |err| switch (err) {
}) catch |err| switch (err) {
error.OutOfDateKHR => return self.recreateSwapchain(),
else => return err,
};
}
fn recreateSwapchain(self: *Game) !void {
try self.swapchain.recreate(self.engine);
for (self.global_uniforms_transfer_semaphores, 0..) |*semaphore, i| {
self.engine.destroySemaphore(semaphore.*);
semaphore.* = try self.engine.createSemaphore();