Complete all Vulkan wrappers. Maybe worth it.
This commit is contained in:
130
src/Game.zig
130
src/Game.zig
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user