Transient CB only, validation fixes

This commit is contained in:
2025-12-20 18:11:24 +01:00
parent 71015874a9
commit 8f19b16130
7 changed files with 116 additions and 122 deletions

View File

@@ -41,11 +41,11 @@ index_buffer: shaders.IndexBuffer,
global_uniforms: shaders.GlobalUniformsBuffer,
global_uniforms_staging_buffer: StagingBuffer,
global_uniforms_transfer_command_buffer: CommandBuffer,
global_uniforms_transfer_semaphores: []vk.Semaphore,
point_lights: shaders.PointLightBuffer,
directional_lights: shaders.DirectionalLightBuffer,
sampler: vk.Sampler,
deferred_command_buffers: std.ArrayList(CommandBuffer),
blocks: Blocks,
materials: Materials,
@@ -232,23 +232,6 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
});
errdefer global_uniforms_staging_buffer.deinit(engine);
var global_uniforms_transfer_command_buffer: CommandBuffer = try .init(engine, .transfer, .persistent);
errdefer global_uniforms_transfer_command_buffer.deinit(engine);
try global_uniforms_transfer_command_buffer.beginCommandBuffer();
global_uniforms_transfer_command_buffer.copyBuffer(
global_uniforms_staging_buffer.buffer,
global_uniforms.buffer,
&.{
.{
.src_offset = 0,
.dst_offset = 0,
.size = @sizeOf(shaders.GlobalUniforms),
},
},
);
try global_uniforms_transfer_command_buffer.endCommandBuffer();
const global_uniforms_transfer_semaphores = blk: {
var semaphores: std.ArrayList(vk.Semaphore) = try .initCapacity(allocator, swapchain.swapchain_images.len);
errdefer semaphores.deinit(allocator);
@@ -367,8 +350,24 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
.depth_compare_op = .greater,
.depth_bounds_test_enable = .false,
.stencil_test_enable = .false,
.front = undefined,
.back = undefined,
.front = .{
.fail_op = .keep,
.pass_op = .keep,
.depth_fail_op = .keep,
.compare_op = .never,
.compare_mask = 0,
.write_mask = 0,
.reference = 0,
},
.back = .{
.fail_op = .keep,
.pass_op = .keep,
.depth_fail_op = .keep,
.compare_op = .never,
.compare_mask = 0,
.write_mask = 0,
.reference = 0,
},
.min_depth_bounds = 0,
.max_depth_bounds = 1,
},
@@ -536,8 +535,8 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
const world_seed = engine.random.int(u64);
std.log.info("Using world seed 0x{x:0<16}", .{world_seed});
var it = Iterator2(i16).init(.{
.min = .{ -12, -12 },
.max = .{ 12, 12 },
.min = .{ -8, -8 },
.max = .{ 8, 8 },
});
while (it.next()) |chunk_coords2| {
const chunk_coords3 = chunk_coords2 ++ [_]i16{0};
@@ -648,11 +647,11 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
.global_uniforms = global_uniforms,
.global_uniforms_staging_buffer = global_uniforms_staging_buffer,
.global_uniforms_transfer_command_buffer = global_uniforms_transfer_command_buffer,
.global_uniforms_transfer_semaphores = global_uniforms_transfer_semaphores,
.point_lights = point_lights,
.directional_lights = directional_lights,
.sampler = sampler,
.deferred_command_buffers = try .initCapacity(allocator, 4),
.blocks = blocks,
.materials = materials,
@@ -667,6 +666,11 @@ pub fn init(allocator: std.mem.Allocator, engine: *Engine, swapchain: *Swapchain
pub fn deinit(self: *Game) void {
std.log.scoped(.deinit).debug("Deinitializing {*}", .{self});
for (self.deferred_command_buffers.items) |*command_buffer| {
command_buffer.deinit(self.engine);
}
self.deferred_command_buffers.deinit(self.allocator);
self.vertex_buffer.deinit(self.engine);
self.index_buffer.deinit(self.engine);
@@ -679,7 +683,6 @@ pub fn deinit(self: *Game) void {
self.global_uniforms.deinit(self.engine);
self.global_uniforms_staging_buffer.deinit(self.engine);
self.global_uniforms_transfer_command_buffer.deinit(self.engine);
self.point_lights.deinit(self.engine);
self.directional_lights.deinit(self.engine);
@@ -755,6 +758,11 @@ fn render(self: *Game) !void {
else => return err,
};
for (self.deferred_command_buffers.items) |*deferred_command_buffer| {
deferred_command_buffer.deinit(self.engine);
}
self.deferred_command_buffers.clearRetainingCapacity();
const extent = self.swapchain.extent;
const framebuffer_size = Vector2.init(
@@ -800,12 +808,31 @@ fn render(self: *Game) !void {
@memcpy(staging_memory, std.mem.asBytes(&global_uniforms_data));
self.global_uniforms_staging_buffer.unmap(self.engine);
try self.global_uniforms_transfer_command_buffer.submit(self.engine, .{
try self.deferred_command_buffers.ensureUnusedCapacity(self.allocator, 1);
const global_uniforms_transfer_command_buffer = try CommandBuffer.init(self.engine, .transfer);
self.deferred_command_buffers.appendAssumeCapacity(global_uniforms_transfer_command_buffer);
try global_uniforms_transfer_command_buffer.beginCommandBuffer();
global_uniforms_transfer_command_buffer.copyBuffer(
self.global_uniforms_staging_buffer.buffer,
self.global_uniforms.buffer,
&.{
.{
.src_offset = 0,
.dst_offset = 0,
.size = @sizeOf(shaders.GlobalUniforms),
},
},
);
try global_uniforms_transfer_command_buffer.endCommandBuffer();
try global_uniforms_transfer_command_buffer.submit(self.engine, .{
.signal_semaphores = &.{self.global_uniforms_transfer_semaphores[self.swapchain.image_index.?]},
});
var command_buffer: CommandBuffer = try .init(self.engine, .graphics, .transient);
defer command_buffer.deinit(self.engine);
try self.deferred_command_buffers.ensureUnusedCapacity(self.allocator, 1);
const command_buffer: CommandBuffer = try .init(self.engine, .graphics);
self.deferred_command_buffers.appendAssumeCapacity(command_buffer);
try command_buffer.beginCommandBuffer();
{