forked from mirror/vulkan-zig
Merge pull request #35 from InKryption/duck-typing-made-easier
Duck typing verification made easier
This commit is contained in:
@@ -5,77 +5,77 @@ const Allocator = std.mem.Allocator;
|
|||||||
|
|
||||||
const required_device_extensions = [_][]const u8{vk.extension_info.khr_swapchain.name};
|
const required_device_extensions = [_][]const u8{vk.extension_info.khr_swapchain.name};
|
||||||
|
|
||||||
const BaseDispatch = vk.BaseWrapper(&.{
|
const BaseDispatch = vk.BaseWrapper(.{
|
||||||
.createInstance,
|
.createInstance = true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const InstanceDispatch = vk.InstanceWrapper(&.{
|
const InstanceDispatch = vk.InstanceWrapper(.{
|
||||||
.destroyInstance,
|
.destroyInstance = true,
|
||||||
.createDevice,
|
.createDevice = true,
|
||||||
.destroySurfaceKHR,
|
.destroySurfaceKHR = true,
|
||||||
.enumeratePhysicalDevices,
|
.enumeratePhysicalDevices = true,
|
||||||
.getPhysicalDeviceProperties,
|
.getPhysicalDeviceProperties = true,
|
||||||
.enumerateDeviceExtensionProperties,
|
.enumerateDeviceExtensionProperties = true,
|
||||||
.getPhysicalDeviceSurfaceFormatsKHR,
|
.getPhysicalDeviceSurfaceFormatsKHR = true,
|
||||||
.getPhysicalDeviceSurfacePresentModesKHR,
|
.getPhysicalDeviceSurfacePresentModesKHR = true,
|
||||||
.getPhysicalDeviceSurfaceCapabilitiesKHR,
|
.getPhysicalDeviceSurfaceCapabilitiesKHR = true,
|
||||||
.getPhysicalDeviceQueueFamilyProperties,
|
.getPhysicalDeviceQueueFamilyProperties = true,
|
||||||
.getPhysicalDeviceSurfaceSupportKHR,
|
.getPhysicalDeviceSurfaceSupportKHR = true,
|
||||||
.getPhysicalDeviceMemoryProperties,
|
.getPhysicalDeviceMemoryProperties = true,
|
||||||
.getDeviceProcAddr,
|
.getDeviceProcAddr = true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const DeviceDispatch = vk.DeviceWrapper(&.{
|
const DeviceDispatch = vk.DeviceWrapper(.{
|
||||||
.destroyDevice,
|
.destroyDevice = true,
|
||||||
.getDeviceQueue,
|
.getDeviceQueue = true,
|
||||||
.createSemaphore,
|
.createSemaphore = true,
|
||||||
.createFence,
|
.createFence = true,
|
||||||
.createImageView,
|
.createImageView = true,
|
||||||
.destroyImageView,
|
.destroyImageView = true,
|
||||||
.destroySemaphore,
|
.destroySemaphore = true,
|
||||||
.destroyFence,
|
.destroyFence = true,
|
||||||
.getSwapchainImagesKHR,
|
.getSwapchainImagesKHR = true,
|
||||||
.createSwapchainKHR,
|
.createSwapchainKHR = true,
|
||||||
.destroySwapchainKHR,
|
.destroySwapchainKHR = true,
|
||||||
.acquireNextImageKHR,
|
.acquireNextImageKHR = true,
|
||||||
.deviceWaitIdle,
|
.deviceWaitIdle = true,
|
||||||
.waitForFences,
|
.waitForFences = true,
|
||||||
.resetFences,
|
.resetFences = true,
|
||||||
.queueSubmit,
|
.queueSubmit = true,
|
||||||
.queuePresentKHR,
|
.queuePresentKHR = true,
|
||||||
.createCommandPool,
|
.createCommandPool = true,
|
||||||
.destroyCommandPool,
|
.destroyCommandPool = true,
|
||||||
.allocateCommandBuffers,
|
.allocateCommandBuffers = true,
|
||||||
.freeCommandBuffers,
|
.freeCommandBuffers = true,
|
||||||
.queueWaitIdle,
|
.queueWaitIdle = true,
|
||||||
.createShaderModule,
|
.createShaderModule = true,
|
||||||
.destroyShaderModule,
|
.destroyShaderModule = true,
|
||||||
.createPipelineLayout,
|
.createPipelineLayout = true,
|
||||||
.destroyPipelineLayout,
|
.destroyPipelineLayout = true,
|
||||||
.createRenderPass,
|
.createRenderPass = true,
|
||||||
.destroyRenderPass,
|
.destroyRenderPass = true,
|
||||||
.createGraphicsPipelines,
|
.createGraphicsPipelines = true,
|
||||||
.destroyPipeline,
|
.destroyPipeline = true,
|
||||||
.createFramebuffer,
|
.createFramebuffer = true,
|
||||||
.destroyFramebuffer,
|
.destroyFramebuffer = true,
|
||||||
.beginCommandBuffer,
|
.beginCommandBuffer = true,
|
||||||
.endCommandBuffer,
|
.endCommandBuffer = true,
|
||||||
.allocateMemory,
|
.allocateMemory = true,
|
||||||
.freeMemory,
|
.freeMemory = true,
|
||||||
.createBuffer,
|
.createBuffer = true,
|
||||||
.destroyBuffer,
|
.destroyBuffer = true,
|
||||||
.getBufferMemoryRequirements,
|
.getBufferMemoryRequirements = true,
|
||||||
.mapMemory,
|
.mapMemory = true,
|
||||||
.unmapMemory,
|
.unmapMemory = true,
|
||||||
.bindBufferMemory,
|
.bindBufferMemory = true,
|
||||||
.cmdBeginRenderPass,
|
.cmdBeginRenderPass = true,
|
||||||
.cmdEndRenderPass,
|
.cmdEndRenderPass = true,
|
||||||
.cmdBindPipeline,
|
.cmdBindPipeline = true,
|
||||||
.cmdDraw,
|
.cmdDraw = true,
|
||||||
.cmdSetViewport,
|
.cmdSetViewport = true,
|
||||||
.cmdSetScissor,
|
.cmdSetScissor = true,
|
||||||
.cmdBindVertexBuffers,
|
.cmdBindVertexBuffers = true,
|
||||||
.cmdCopyBuffer,
|
.cmdCopyBuffer = true,
|
||||||
});
|
});
|
||||||
|
|
||||||
pub const GraphicsContext = struct {
|
pub const GraphicsContext = struct {
|
||||||
|
|||||||
@@ -1006,31 +1006,51 @@ fn Renderer(comptime WriterType: type) type {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try self.writer.print(
|
try self.writer.print(
|
||||||
\\pub fn {s}Wrapper(comptime cmds: []const {s}Command) type {{
|
\\pub const {0s}CommandFlags = std.enums.EnumFieldStruct({0s}Command, bool, false);
|
||||||
\\ comptime var fields: [cmds.len]std.builtin.TypeInfo.StructField = undefined;
|
\\pub fn {0s}Wrapper(comptime cmds: {0s}CommandFlags) type {{
|
||||||
\\ inline for (cmds) |cmd, i| {{
|
\\ return struct {{
|
||||||
\\ const PfnType = cmd.PfnType();
|
\\ dispatch: Dispatch,
|
||||||
\\ fields[i] = .{{
|
\\
|
||||||
\\ .name = cmd.symbol(),
|
\\ const Self = @This();
|
||||||
|
\\ pub const commands = cmds;
|
||||||
|
\\ pub const Dispatch = Dispatch: {{
|
||||||
|
\\ @setEvalBranchQuota(10_000);
|
||||||
|
\\ const TypeInfo = std.builtin.TypeInfo;
|
||||||
|
\\ const fields_len = fields_len: {{
|
||||||
|
\\ var fields_len = 0;
|
||||||
|
\\ for (std.meta.fieldNames({0s}Command)) |field_name| {{
|
||||||
|
\\ fields_len += @boolToInt(@field(cmds, field_name));
|
||||||
|
\\ }}
|
||||||
|
\\ break :fields_len fields_len;
|
||||||
|
\\ }};
|
||||||
|
\\ var fields_array: [fields_len]TypeInfo.StructField = undefined;
|
||||||
|
\\ var fields: []TypeInfo.StructField = fields_array[0..];
|
||||||
|
\\ fields.len = 0;
|
||||||
|
\\
|
||||||
|
\\ for (std.enums.values({0s}Command)) |cmd_tag| {{
|
||||||
|
\\ if (@field(cmds, @tagName(cmd_tag))) {{
|
||||||
|
\\ const PfnType = cmd_tag.PfnType();
|
||||||
|
\\ fields.len += 1;
|
||||||
|
\\ fields[fields.len - 1] = TypeInfo.StructField{{
|
||||||
|
\\ .name = cmd_tag.symbol(),
|
||||||
\\ .field_type = PfnType,
|
\\ .field_type = PfnType,
|
||||||
\\ .default_value = null,
|
\\ .default_value = null,
|
||||||
\\ .is_comptime = false,
|
\\ .is_comptime = false,
|
||||||
\\ .alignment = @alignOf(PfnType),
|
\\ .alignment = @alignOf(PfnType),
|
||||||
\\ }};
|
\\ }};
|
||||||
\\ }}
|
\\ }}
|
||||||
\\ const Dispatch = @Type(.{{
|
\\ }}
|
||||||
|
\\ break :Dispatch @Type(.{{
|
||||||
\\ .Struct = .{{
|
\\ .Struct = .{{
|
||||||
\\ .layout = .Auto,
|
\\ .layout = .Auto,
|
||||||
\\ .fields = &fields,
|
\\ .fields = fields,
|
||||||
\\ .decls = &[_]std.builtin.TypeInfo.Declaration{{}},
|
\\ .decls = &[_]std.builtin.TypeInfo.Declaration{{}},
|
||||||
\\ .is_tuple = false,
|
\\ .is_tuple = false,
|
||||||
\\ }},
|
\\ }},
|
||||||
\\ }});
|
\\ }});
|
||||||
\\ return struct {{
|
\\ }};
|
||||||
\\ dispatch: Dispatch,
|
|
||||||
\\
|
\\
|
||||||
\\ const Self = @This();
|
, .{ name });
|
||||||
, .{ name, name });
|
|
||||||
|
|
||||||
try self.renderWrapperLoader(dispatch_type);
|
try self.renderWrapperLoader(dispatch_type);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user