const std = @import("std"); const vk = @import("vulkan"); const base = @import("base"); const VkError = base.VkError; const Self = @This(); pub const Interface = base.CommandBuffer; interface: Interface, pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const vk.CommandBufferAllocateInfo) VkError!*Self { const self = allocator.create(Self) catch return VkError.OutOfHostMemory; errdefer allocator.destroy(self); var interface = try Interface.init(device, allocator, info); interface.vtable = &.{ .destroy = destroy }; interface.dispatch_table = &.{ .begin = begin, .beginQuery = beginQuery, .beginRenderPass = beginRenderPass, .bindDescriptorSets = bindDescriptorSets, .bindPipeline = bindPipeline, .bindIndexBuffer = bindIndexBuffer, .bindVertexBuffer = bindVertexBuffer, .blitImage = blitImage, .clearAttachment = clearAttachment, .clearColorImage = clearColorImage, .clearDepthStencilImage = clearDepthStencilImage, .copyBuffer = copyBuffer, .copyBufferToImage = copyBufferToImage, .copyImage = copyImage, .copyImageToBuffer = copyImageToBuffer, .copyQueryPoolResults = copyQueryPoolResults, .dispatch = dispatch, .dispatchBase = dispatchBase, .dispatchIndirect = dispatchIndirect, .draw = draw, .drawIndexed = drawIndexed, .drawIndexedIndirect = drawIndexedIndirect, .drawIndirect = drawIndirect, .end = end, .endQuery = endQuery, .endRenderPass = endRenderPass, .executeCommands = executeCommands, .fillBuffer = fillBuffer, .nextSubpass = nextSubpass, .pipelineBarrier = pipelineBarrier, .pushConstants = pushConstants, .reset = reset, .resetQueryPool = resetQueryPool, .resetEvent = resetEvent, .resolveImage = resolveImage, .setEvent = setEvent, .setBlendConstants = setBlendConstants, .setDeviceMask = setDeviceMask, .setScissor = setScissor, .setStencilCompareMask = setStencilCompareMask, .setStencilReference = setStencilReference, .setStencilWriteMask = setStencilWriteMask, .setViewport = setViewport, .updateBuffer = updateBuffer, .waitEvent = waitEvent, }; self.* = .{ .interface = interface }; return self; } pub fn destroy(interface: *Interface, allocator: std.mem.Allocator) void { const self: *Self = @alignCast(@fieldParentPtr("interface", interface)); allocator.destroy(self); } pub fn execute(self: *Self) VkError!void { try self.interface.submit(); self.interface.finish() catch {}; } pub fn begin(interface: *Interface, info: *const vk.CommandBufferBeginInfo) VkError!void { _ = interface; _ = info; } pub fn end(interface: *Interface) VkError!void { _ = interface; } pub fn reset(interface: *Interface, flags: vk.CommandBufferResetFlags) VkError!void { _ = interface; _ = flags; } pub fn beginQuery(interface: *Interface, pool: *base.QueryPool, query: u32, flags: vk.QueryControlFlags) VkError!void { _ = interface; _ = flags; try pool.begin(query); } pub fn endQuery(interface: *Interface, pool: *base.QueryPool, query: u32) VkError!void { _ = interface; try pool.end(query); } pub fn resetQueryPool(interface: *Interface, pool: *base.QueryPool, first: u32, count: u32) VkError!void { _ = interface; try pool.reset(first, count); } pub fn beginRenderPass(interface: *Interface, render_pass: *base.RenderPass, framebuffer: *base.Framebuffer, render_area: vk.Rect2D, clear_values: ?[]const vk.ClearValue) VkError!void { _ = interface; _ = render_pass; _ = framebuffer; _ = render_area; _ = clear_values; } pub fn bindDescriptorSets(interface: *Interface, bind_point: vk.PipelineBindPoint, first_set: u32, sets: [base.VULKAN_MAX_DESCRIPTOR_SETS]?*base.DescriptorSet, dynamic_offsets: []const u32) VkError!void { _ = interface; _ = bind_point; _ = first_set; _ = sets; _ = dynamic_offsets; } pub fn bindPipeline(interface: *Interface, bind_point: vk.PipelineBindPoint, pipeline: *base.Pipeline) VkError!void { _ = interface; _ = bind_point; _ = pipeline; } pub fn bindIndexBuffer(interface: *Interface, buffer: *base.Buffer, offset: usize, index_type: vk.IndexType) VkError!void { _ = interface; _ = buffer; _ = offset; _ = index_type; } pub fn bindVertexBuffer(interface: *Interface, index: usize, buffer: *base.Buffer, offset: usize) VkError!void { _ = interface; _ = index; _ = buffer; _ = offset; } pub fn blitImage(interface: *Interface, src: *base.Image, src_layout: vk.ImageLayout, dst: *base.Image, dst_layout: vk.ImageLayout, regions: []const vk.ImageBlit, filter: vk.Filter) VkError!void { _ = interface; _ = src; _ = src_layout; _ = dst; _ = dst_layout; _ = regions; _ = filter; } pub fn clearAttachment(interface: *Interface, attachment: vk.ClearAttachment, rect: vk.ClearRect) VkError!void { _ = interface; _ = attachment; _ = rect; } pub fn clearColorImage(interface: *Interface, image: *base.Image, layout: vk.ImageLayout, color: *const vk.ClearColorValue, range: vk.ImageSubresourceRange) VkError!void { _ = interface; _ = image; _ = layout; _ = color; _ = range; } pub fn clearDepthStencilImage(interface: *Interface, image: *base.Image, layout: vk.ImageLayout, value: *const vk.ClearDepthStencilValue, range: vk.ImageSubresourceRange) VkError!void { _ = interface; _ = image; _ = layout; _ = value; _ = range; } pub fn copyBuffer(interface: *Interface, src: *base.Buffer, dst: *base.Buffer, regions: []const vk.BufferCopy) VkError!void { _ = interface; _ = src; _ = dst; _ = regions; } pub fn copyBufferToImage(interface: *Interface, src: *base.Buffer, dst: *base.Image, dst_layout: vk.ImageLayout, regions: []const vk.BufferImageCopy) VkError!void { _ = interface; _ = src; _ = dst; _ = dst_layout; _ = regions; } pub fn copyImage(interface: *Interface, src: *base.Image, src_layout: vk.ImageLayout, dst: *base.Image, dst_layout: vk.ImageLayout, regions: []const vk.ImageCopy) VkError!void { _ = interface; _ = src; _ = src_layout; _ = dst; _ = dst_layout; _ = regions; } pub fn copyImageToBuffer(interface: *Interface, src: *base.Image, src_layout: vk.ImageLayout, dst: *base.Buffer, regions: []const vk.BufferImageCopy) VkError!void { _ = interface; _ = src; _ = src_layout; _ = dst; _ = regions; } pub fn copyQueryPoolResults(interface: *Interface, pool: *base.QueryPool, first: u32, count: u32, dst: *base.Buffer, offset: vk.DeviceSize, stride: vk.DeviceSize, flags: vk.QueryResultFlags) VkError!void { _ = interface; _ = pool; _ = first; _ = count; _ = dst; _ = offset; _ = stride; _ = flags; } pub fn dispatch(interface: *Interface, group_count_x: u32, group_count_y: u32, group_count_z: u32) VkError!void { _ = interface; _ = group_count_x; _ = group_count_y; _ = group_count_z; } pub fn dispatchBase(interface: *Interface, base_group_x: u32, base_group_y: u32, base_group_z: u32, group_count_x: u32, group_count_y: u32, group_count_z: u32) VkError!void { _ = interface; _ = base_group_x; _ = base_group_y; _ = base_group_z; _ = group_count_x; _ = group_count_y; _ = group_count_z; } pub fn setDeviceMask(interface: *Interface, device_mask: u32) VkError!void { _ = interface; _ = device_mask; } pub fn dispatchIndirect(interface: *Interface, buffer: *base.Buffer, offset: vk.DeviceSize) VkError!void { _ = interface; _ = buffer; _ = offset; } pub fn draw(interface: *Interface, vertex_count: usize, instance_count: usize, first_vertex: usize, first_instance: usize) VkError!void { _ = interface; _ = vertex_count; _ = instance_count; _ = first_vertex; _ = first_instance; } pub fn drawIndexed(interface: *Interface, index_count: usize, instance_count: usize, first_index: usize, vertex_offset: i32, first_instance: usize) VkError!void { _ = interface; _ = index_count; _ = instance_count; _ = first_index; _ = vertex_offset; _ = first_instance; } pub fn drawIndexedIndirect(interface: *Interface, buffer: *base.Buffer, offset: usize, count: usize, stride: usize) VkError!void { _ = interface; _ = buffer; _ = offset; _ = count; _ = stride; } pub fn drawIndirect(interface: *Interface, buffer: *base.Buffer, offset: usize, count: usize, stride: usize) VkError!void { _ = interface; _ = buffer; _ = offset; _ = count; _ = stride; } pub fn endRenderPass(interface: *Interface) VkError!void { _ = interface; } pub fn executeCommands(interface: *Interface, commands: *Interface) VkError!void { _ = interface; _ = commands; } pub fn fillBuffer(interface: *Interface, buffer: *base.Buffer, offset: vk.DeviceSize, size: vk.DeviceSize, data: u32) VkError!void { _ = interface; _ = buffer; _ = offset; _ = size; _ = data; } pub fn updateBuffer(interface: *Interface, buffer: *base.Buffer, offset: vk.DeviceSize, data: []const u8) VkError!void { _ = interface; _ = buffer; _ = offset; _ = data; } pub fn nextSubpass(interface: *Interface, contents: vk.SubpassContents) VkError!void { _ = interface; _ = contents; } pub fn pipelineBarrier(interface: *Interface, src_stage: vk.PipelineStageFlags, dst_stage: vk.PipelineStageFlags, dependency: vk.DependencyFlags, memory: []const vk.MemoryBarrier, buffers: []const vk.BufferMemoryBarrier, images: []const vk.ImageMemoryBarrier) VkError!void { _ = interface; _ = src_stage; _ = dst_stage; _ = dependency; _ = memory; _ = buffers; _ = images; } pub fn pushConstants(interface: *Interface, stages: vk.ShaderStageFlags, offset: u32, blob: []const u8) VkError!void { _ = interface; _ = stages; _ = offset; _ = blob; } pub fn resetEvent(interface: *Interface, event: *base.Event, stage: vk.PipelineStageFlags) VkError!void { _ = interface; _ = stage; try event.reset(); } pub fn resolveImage(interface: *Interface, src: *base.Image, src_layout: vk.ImageLayout, dst: *base.Image, dst_layout: vk.ImageLayout, region: vk.ImageResolve) VkError!void { _ = interface; _ = src; _ = src_layout; _ = dst; _ = dst_layout; _ = region; } pub fn setEvent(interface: *Interface, event: *base.Event, stage: vk.PipelineStageFlags) VkError!void { _ = interface; _ = stage; try event.signal(); } pub fn setScissor(interface: *Interface, first: u32, scissor: []const vk.Rect2D) VkError!void { _ = interface; _ = first; _ = scissor; } pub fn setViewport(interface: *Interface, first: u32, viewports: []const vk.Viewport) VkError!void { _ = interface; _ = first; _ = viewports; } pub fn setBlendConstants(interface: *Interface, constants: [4]f32) VkError!void { _ = interface; _ = constants; } pub fn setStencilCompareMask(interface: *Interface, face_mask: vk.StencilFaceFlags, compare_mask: u32) VkError!void { _ = interface; _ = face_mask; _ = compare_mask; } pub fn setStencilReference(interface: *Interface, face_mask: vk.StencilFaceFlags, reference: u32) VkError!void { _ = interface; _ = face_mask; _ = reference; } pub fn setStencilWriteMask(interface: *Interface, face_mask: vk.StencilFaceFlags, write_mask: u32) VkError!void { _ = interface; _ = face_mask; _ = write_mask; } pub fn waitEvent(interface: *Interface, event: *base.Event, src_stage: vk.PipelineStageFlags, dst_stage: vk.PipelineStageFlags, memory_barriers: []const vk.MemoryBarrier, buffer_barriers: []const vk.BufferMemoryBarrier, image_barriers: []const vk.ImageMemoryBarrier) VkError!void { _ = interface; _ = event; _ = src_stage; _ = dst_stage; _ = memory_barriers; _ = buffer_barriers; _ = image_barriers; }