reworking command buffers, adding soft compute routines
This commit is contained in:
@@ -2,8 +2,6 @@ const std = @import("std");
|
||||
const vk = @import("vulkan");
|
||||
const lib = @import("lib.zig");
|
||||
|
||||
const cmd = @import("commands.zig");
|
||||
|
||||
const NonDispatchable = @import("NonDispatchable.zig").NonDispatchable;
|
||||
const VkError = @import("error_set.zig").VkError;
|
||||
const VulkanAllocator = @import("VulkanAllocator.zig");
|
||||
@@ -17,8 +15,6 @@ const Image = @import("Image.zig");
|
||||
const Pipeline = @import("Pipeline.zig");
|
||||
const DescriptorSet = @import("DescriptorSet.zig");
|
||||
|
||||
const COMMAND_BUFFER_BASE_CAPACITY = 256;
|
||||
|
||||
const State = enum {
|
||||
Initial,
|
||||
Recording,
|
||||
@@ -35,7 +31,6 @@ pool: *CommandPool,
|
||||
state: State,
|
||||
begin_info: ?vk.CommandBufferBeginInfo,
|
||||
host_allocator: VulkanAllocator,
|
||||
commands: std.ArrayList(cmd.Command),
|
||||
state_mutex: std.Thread.Mutex,
|
||||
|
||||
vtable: *const VTable,
|
||||
@@ -49,6 +44,7 @@ pub const DispatchTable = struct {
|
||||
copyBuffer: *const fn (*Self, *Buffer, *Buffer, []const vk.BufferCopy) VkError!void,
|
||||
copyImage: *const fn (*Self, *Image, vk.ImageLayout, *Image, vk.ImageLayout, []const vk.ImageCopy) VkError!void,
|
||||
copyImageToBuffer: *const fn (*Self, *Image, vk.ImageLayout, *Buffer, []const vk.BufferImageCopy) VkError!void,
|
||||
dispatch: *const fn (*Self, u32, u32, u32) VkError!void,
|
||||
end: *const fn (*Self) VkError!void,
|
||||
fillBuffer: *const fn (*Self, *Buffer, vk.DeviceSize, vk.DeviceSize, u32) VkError!void,
|
||||
reset: *const fn (*Self, vk.CommandBufferResetFlags) VkError!void,
|
||||
@@ -68,7 +64,6 @@ pub fn init(device: *Device, allocator: std.mem.Allocator, info: *const vk.Comma
|
||||
.state = .Initial,
|
||||
.begin_info = null,
|
||||
.host_allocator = VulkanAllocator.from(allocator).cloneWithScope(.object),
|
||||
.commands = std.ArrayList(cmd.Command).initCapacity(allocator, COMMAND_BUFFER_BASE_CAPACITY) catch return VkError.OutOfHostMemory,
|
||||
.state_mutex = .{},
|
||||
.vtable = undefined,
|
||||
.dispatch_table = undefined,
|
||||
@@ -85,8 +80,6 @@ inline fn transitionState(self: *Self, target: State, from_allowed: []const Stat
|
||||
}
|
||||
|
||||
pub inline fn destroy(self: *Self, allocator: std.mem.Allocator) void {
|
||||
self.cleanCommandList();
|
||||
self.commands.deinit(allocator);
|
||||
self.vtable.destroy(self, allocator);
|
||||
}
|
||||
|
||||
@@ -109,7 +102,6 @@ pub inline fn reset(self: *Self, flags: vk.CommandBufferResetFlags) VkError!void
|
||||
if (!self.pool.flags.reset_command_buffer_bit) {
|
||||
return VkError.ValidationFailed;
|
||||
}
|
||||
defer self.cleanCommandList();
|
||||
|
||||
self.transitionState(.Initial, &.{ .Initial, .Recording, .Executable, .Invalid }) catch return VkError.ValidationFailed;
|
||||
try self.dispatch_table.reset(self, flags);
|
||||
@@ -124,101 +116,44 @@ pub inline fn submit(self: *Self) VkError!void {
|
||||
self.transitionState(.Pending, &.{ .Pending, .Executable }) catch return VkError.ValidationFailed;
|
||||
}
|
||||
|
||||
fn cleanCommandList(self: *Self) void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
for (self.commands.items) |command| {
|
||||
switch (command) {
|
||||
.CopyBuffer => |data| allocator.free(data.regions),
|
||||
.CopyImage => |data| allocator.free(data.regions),
|
||||
.CopyImageToBuffer => |data| allocator.free(data.regions),
|
||||
else => {},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Commands ====================================================================================================
|
||||
|
||||
pub inline fn bindDescriptorSets(self: *Self, bind_point: vk.PipelineBindPoint, first_set: u32, sets: []const vk.DescriptorSet, dynamic_offsets: []const u32) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
|
||||
var inner_sets = [_]?*DescriptorSet{null} ** lib.VULKAN_MAX_DESCRIPTOR_SETS;
|
||||
for (sets, inner_sets[0..sets.len]) |set, *inner_set| {
|
||||
inner_set.* = try NonDispatchable(DescriptorSet).fromHandleObject(set);
|
||||
}
|
||||
|
||||
try self.dispatch_table.bindDescriptorSets(self, bind_point, first_set, inner_sets, dynamic_offsets);
|
||||
self.commands.append(allocator, .{ .BindDescriptorSets = .{
|
||||
.bind_point = bind_point,
|
||||
.first_set = first_set,
|
||||
.sets = inner_sets,
|
||||
.dynamic_offsets = dynamic_offsets,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
|
||||
pub inline fn bindPipeline(self: *Self, bind_point: vk.PipelineBindPoint, pipeline: *Pipeline) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
try self.dispatch_table.bindPipeline(self, bind_point, pipeline);
|
||||
self.commands.append(allocator, .{ .BindPipeline = .{
|
||||
.bind_point = bind_point,
|
||||
.pipeline = pipeline,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
|
||||
pub inline fn clearColorImage(self: *Self, image: *Image, layout: vk.ImageLayout, color: *const vk.ClearColorValue, ranges: []const vk.ImageSubresourceRange) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
for (ranges) |range| {
|
||||
try self.dispatch_table.clearColorImage(self, image, layout, color, range);
|
||||
self.commands.append(allocator, .{ .ClearColorImage = .{
|
||||
.image = image,
|
||||
.layout = layout,
|
||||
.clear_color = color.*,
|
||||
.range = range,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
}
|
||||
|
||||
pub inline fn copyBuffer(self: *Self, src: *Buffer, dst: *Buffer, regions: []const vk.BufferCopy) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
try self.dispatch_table.copyBuffer(self, src, dst, regions);
|
||||
self.commands.append(allocator, .{ .CopyBuffer = .{
|
||||
.src = src,
|
||||
.dst = dst,
|
||||
.regions = allocator.dupe(vk.BufferCopy, regions) catch return VkError.OutOfHostMemory,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
|
||||
pub inline fn copyImage(self: *Self, src: *Image, src_layout: vk.ImageLayout, dst: *Image, dst_layout: vk.ImageLayout, regions: []const vk.ImageCopy) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
try self.dispatch_table.copyImage(self, src, src_layout, dst, dst_layout, regions);
|
||||
self.commands.append(allocator, .{ .CopyImage = .{
|
||||
.src = src,
|
||||
.src_layout = src_layout,
|
||||
.dst = dst,
|
||||
.dst_layout = dst_layout,
|
||||
.regions = allocator.dupe(vk.ImageCopy, regions) catch return VkError.OutOfHostMemory,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
|
||||
pub inline fn copyImageToBuffer(self: *Self, src: *Image, src_layout: vk.ImageLayout, dst: *Buffer, regions: []const vk.BufferImageCopy) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
try self.dispatch_table.copyImageToBuffer(self, src, src_layout, dst, regions);
|
||||
self.commands.append(allocator, .{ .CopyImageToBuffer = .{
|
||||
.src = src,
|
||||
.src_layout = src_layout,
|
||||
.dst = dst,
|
||||
.regions = allocator.dupe(vk.BufferImageCopy, regions) catch return VkError.OutOfHostMemory,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
|
||||
pub inline fn dispatch(self: *Self, group_count_x: u32, group_count_y: u32, group_count_z: u32) VkError!void {
|
||||
try self.dispatch_table.dispatch(self, group_count_x, group_count_y, group_count_z);
|
||||
}
|
||||
|
||||
pub inline fn fillBuffer(self: *Self, buffer: *Buffer, offset: vk.DeviceSize, size: vk.DeviceSize, data: u32) VkError!void {
|
||||
const allocator = self.host_allocator.allocator();
|
||||
try self.dispatch_table.fillBuffer(self, buffer, offset, size, data);
|
||||
self.commands.append(allocator, .{ .FillBuffer = .{
|
||||
.buffer = buffer,
|
||||
.offset = offset,
|
||||
.size = if (size == vk.WHOLE_SIZE) buffer.size else size,
|
||||
.data = data,
|
||||
} }) catch return VkError.OutOfHostMemory;
|
||||
}
|
||||
|
||||
pub inline fn resetEvent(self: *Self, event: *Event, stage: vk.PipelineStageFlags) VkError!void {
|
||||
|
||||
Reference in New Issue
Block a user