Merge pull request #35 from InKryption/duck-typing-made-easier

Duck typing verification made easier
This commit is contained in:
Robin Voetter
2022-01-10 18:43:07 +01:00
committed by GitHub
2 changed files with 108 additions and 88 deletions

View File

@@ -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 {

View File

@@ -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| {{
\\ const PfnType = cmd.PfnType();
\\ fields[i] = .{{
\\ .name = cmd.symbol(),
\\ .field_type = PfnType,
\\ .default_value = null,
\\ .is_comptime = false,
\\ .alignment = @alignOf(PfnType),
\\ }};
\\ }}
\\ const Dispatch = @Type(.{{
\\ .Struct = .{{
\\ .layout = .Auto,
\\ .fields = &fields,
\\ .decls = &[_]std.builtin.TypeInfo.Declaration{{}},
\\ .is_tuple = false,
\\ }},
\\ }});
\\ return struct {{ \\ return struct {{
\\ dispatch: Dispatch, \\ dispatch: Dispatch,
\\ \\
\\ const Self = @This(); \\ const Self = @This();
, .{ name, name }); \\ 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,
\\ .default_value = null,
\\ .is_comptime = false,
\\ .alignment = @alignOf(PfnType),
\\ }};
\\ }}
\\ }}
\\ break :Dispatch @Type(.{{
\\ .Struct = .{{
\\ .layout = .Auto,
\\ .fields = fields,
\\ .decls = &[_]std.builtin.TypeInfo.Declaration{{}},
\\ .is_tuple = false,
\\ }},
\\ }});
\\ }};
\\
, .{ name });
try self.renderWrapperLoader(dispatch_type); try self.renderWrapperLoader(dispatch_type);