diff --git a/examples/vk.xml b/examples/vk.xml index 5b0bb3e..571727b 100644 --- a/examples/vk.xml +++ b/examples/vk.xml @@ -1,7 +1,7 @@ -Copyright (c) 2015-2020 The Khronos Group Inc. +Copyright 2015-2021 The Khronos Group Inc. SPDX-License-Identifier: Apache-2.0 OR MIT @@ -33,6 +33,7 @@ branch of the member gitlab server. + @@ -67,6 +68,8 @@ branch of the member gitlab server. + + @@ -136,7 +139,7 @@ branch of the member gitlab server. // Vulkan 1.2 version number #define VK_API_VERSION_1_2 VK_MAKE_VERSION(1, 2, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 163 +#define VK_HEADER_VERSION 170 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_VERSION(1, 2, VK_HEADER_VERSION) @@ -167,6 +170,7 @@ typedef void CAMetalLayer; typedef uint32_t VkSampleMask; typedef uint32_t VkBool32; typedef uint32_t VkFlags; + typedef uint64_t VkFlags64; typedef uint64_t VkDeviceSize; typedef uint64_t VkDeviceAddress; @@ -225,7 +229,7 @@ typedef void CAMetalLayer; typedef VkFlags VkQueryControlFlags; typedef VkFlags VkQueryResultFlags; typedef VkFlags VkShaderModuleCreateFlags; - typedef VkFlags VkEventCreateFlags; + typedef VkFlags VkEventCreateFlags; typedef VkFlags VkCommandPoolCreateFlags; typedef VkFlags VkCommandPoolResetFlags; typedef VkFlags VkCommandBufferResetFlags; @@ -265,6 +269,8 @@ typedef void CAMetalLayer; typedef VkFlags VkPipelineCompilerControlFlagsAMD; typedef VkFlags VkShaderCorePropertiesFlagsAMD; typedef VkFlags VkDeviceDiagnosticsConfigFlagsNV; + typedef VkFlags64 VkAccessFlags2KHR; + typedef VkFlags64 VkPipelineStageFlags2KHR; WSI extensions typedef VkFlags VkCompositeAlphaFlagsKHR; @@ -335,9 +341,10 @@ typedef void CAMetalLayer; typedef VkFlags VkPipelineRasterizationDepthClipStateCreateFlagsEXT; typedef VkFlags VkSwapchainImageUsageFlagsANDROID; typedef VkFlags VkToolPurposeFlagsEXT; + typedef VkFlags VkSubmitFlagsKHR; Types which can be void pointers or class pointers, selected at compile time - VK_DEFINE_HANDLE(VkInstance) + VK_DEFINE_HANDLE(VkInstance) VK_DEFINE_HANDLE(VkPhysicalDevice) VK_DEFINE_HANDLE(VkDevice) VK_DEFINE_HANDLE(VkQueue) @@ -460,6 +467,7 @@ typedef void CAMetalLayer; + When VkSemaphoreCreateFlagBits is first extended, need to add a type enum tag for it here Extensions @@ -532,6 +540,8 @@ typedef void CAMetalLayer; + + WSI extensions @@ -593,6 +603,7 @@ typedef void CAMetalLayer; + Enumerated types in the header, but not used by the API @@ -1329,7 +1340,7 @@ typedef void CAMetalLayer; VkFramebuffer framebuffer VkRect2D renderArea uint32_t clearValueCount - const VkClearValue* pClearValues + const VkClearValue* pClearValues float float32[4] @@ -1341,13 +1352,13 @@ typedef void CAMetalLayer; uint32_t stencil - VkClearColorValue color + VkClearColorValue color VkClearDepthStencilValue depthStencil VkImageAspectFlags aspectMask uint32_t colorAttachment - VkClearValue clearValue + VkClearValue clearValue VkAttachmentDescriptionFlags flags @@ -1379,8 +1390,8 @@ typedef void CAMetalLayer; uint32_t srcSubpass uint32_t dstSubpass - VkPipelineStageFlags srcStageMask - VkPipelineStageFlags dstStageMask + VkPipelineStageFlags srcStageMask + VkPipelineStageFlags dstStageMask VkAccessFlags srcAccessMaskMemory accesses from the source of the dependency to synchronize VkAccessFlags dstAccessMaskMemory accesses from the destination of the dependency to synchronize VkDependencyFlags dependencyFlags @@ -1849,7 +1860,7 @@ typedef void CAMetalLayer; VkStructureType sType const void* pNext const char* pMarkerNameName of the debug marker - float color[4]Optional color for debug marker + float color[4]Optional color for debug marker VkStructureType sType @@ -1895,7 +1906,7 @@ typedef void CAMetalLayer; const SECURITY_ATTRIBUTES* pAttributes DWORD dwAccess - + VkStructureType sType const void* pNext uint32_t acquireCount @@ -2015,9 +2026,9 @@ typedef void CAMetalLayer; VkDeviceSize preprocessOffset VkDeviceSize preprocessSize VkBuffer sequencesCountBuffer - VkDeviceSize sequencesCountOffset + VkDeviceSize sequencesCountOffset VkBuffer sequencesIndexBuffer - VkDeviceSize sequencesIndexOffset + VkDeviceSize sequencesIndexOffset VkStructureType sType @@ -2236,7 +2247,7 @@ typedef void CAMetalLayer; VkDeviceMemory memory VkExternalMemoryHandleTypeFlagBits handleType - + VkStructureType sType const void* pNext uint32_t acquireCount @@ -2272,7 +2283,7 @@ typedef void CAMetalLayer; const void* pNext VkSemaphore semaphore VkSemaphoreImportFlags flags - VkExternalSemaphoreHandleTypeFlagBits handleType + VkExternalSemaphoreHandleTypeFlagBits handleType HANDLE handle LPCWSTR name @@ -2336,7 +2347,7 @@ typedef void CAMetalLayer; const void* pNext VkFence fence VkFenceImportFlags flags - VkExternalFenceHandleTypeFlagBits handleType + VkExternalFenceHandleTypeFlagBits handleType HANDLE handle LPCWSTR name @@ -2922,10 +2933,10 @@ typedef void CAMetalLayer; float x float y - + VkStructureType sType const void* pNext - VkSampleCountFlagBits sampleLocationsPerPixel + VkSampleCountFlagBits sampleLocationsPerPixel VkExtent2D sampleLocationGridSize uint32_t sampleLocationsCount const VkSampleLocationEXT* pSampleLocations @@ -3167,7 +3178,7 @@ typedef void CAMetalLayer; VkStructureType sType const void* pNext const char* pLabelName - float color[4] + float color[4] VkStructureType sType @@ -3183,7 +3194,7 @@ typedef void CAMetalLayer; const void* pNext VkDebugUtilsMessengerCallbackDataFlagsEXT flags const char* pMessageIdName - int32_t messageIdNumber + int32_t messageIdNumber const char* pMessage uint32_t queueLabelCount const VkDebugUtilsLabelEXT* pQueueLabels @@ -3210,10 +3221,10 @@ typedef void CAMetalLayer; VkDeviceMemoryReportFlagsEXT flags VkDeviceMemoryReportEventTypeEXT type uint64_t memoryObjectId - VkDeviceSize size - VkObjectType objectType - uint64_t objectHandle - uint32_t heapIndex + VkDeviceSize size + VkObjectType objectType + uint64_t objectHandle + uint32_t heapIndex VkStructureType sType @@ -3396,12 +3407,12 @@ typedef void CAMetalLayer; const void* pNext uint32_t srcSubpass uint32_t dstSubpass - VkPipelineStageFlags srcStageMask - VkPipelineStageFlags dstStageMask + VkPipelineStageFlags srcStageMask + VkPipelineStageFlags dstStageMask VkAccessFlags srcAccessMask VkAccessFlags dstAccessMask VkDependencyFlags dependencyFlags - int32_t viewOffset + int32_t viewOffset @@ -3709,7 +3720,7 @@ typedef void CAMetalLayer; VkStructureType sType const void* pNext VkBool32 shadingRateImageEnable - uint32_t viewportCount + uint32_t viewportCount const VkShadingRatePaletteNV* pShadingRatePalettes @@ -4289,7 +4300,7 @@ typedef void CAMetalLayer; VkAcquireProfilingLockFlagsKHR flagsAcquire profiling lock flags uint64_t timeout - + VkStructureType sType const void* pNext uint32_t counterPassIndexIndex for which counter pass to submit @@ -4332,7 +4343,7 @@ typedef void CAMetalLayer; VkPerformanceValueTypeINTEL type - VkPerformanceValueDataINTEL data + VkPerformanceValueDataINTEL data VkStructureType sType @@ -4451,7 +4462,7 @@ typedef void CAMetalLayer; char name[VK_MAX_DESCRIPTION_SIZE] char description[VK_MAX_DESCRIPTION_SIZE] VkPipelineExecutableStatisticFormatKHR format - VkPipelineExecutableStatisticValueKHR value + VkPipelineExecutableStatisticValueKHR value VkStructureType sType @@ -4459,7 +4470,7 @@ typedef void CAMetalLayer; char name[VK_MAX_DESCRIPTION_SIZE] char description[VK_MAX_DESCRIPTION_SIZE] VkBool32 isText - size_t dataSize + size_t dataSize void* pData @@ -4531,8 +4542,8 @@ typedef void CAMetalLayer; const void* pNext VkLineRasterizationModeEXT lineRasterizationMode VkBool32 stippledLineEnable - uint32_t lineStippleFactor - uint16_t lineStipplePattern + uint32_t lineStippleFactor + uint16_t lineStipplePattern VkStructureType sType @@ -4703,7 +4714,7 @@ typedef void CAMetalLayer; VkStructureType sType const void* pNext - VkClearColorValue customBorderColor + VkClearColorValue customBorderColor VkFormat format @@ -4727,26 +4738,26 @@ typedef void CAMetalLayer; VkStructureType sType - const void* pNext + const void* pNext VkFormat vertexFormat - VkDeviceOrHostAddressConstKHR vertexData + VkDeviceOrHostAddressConstKHR vertexData VkDeviceSize vertexStride uint32_t maxVertex VkIndexType indexType - VkDeviceOrHostAddressConstKHR indexData - VkDeviceOrHostAddressConstKHR transformData + VkDeviceOrHostAddressConstKHR indexData + VkDeviceOrHostAddressConstKHR transformData VkStructureType sType const void* pNext - VkDeviceOrHostAddressConstKHR data + VkDeviceOrHostAddressConstKHR data VkDeviceSize stride VkStructureType sType const void* pNext VkBool32 arrayOfPointers - VkDeviceOrHostAddressConstKHR data + VkDeviceOrHostAddressConstKHR data VkAccelerationStructureGeometryTrianglesDataKHR triangles @@ -4765,19 +4776,19 @@ typedef void CAMetalLayer; const void* pNext VkAccelerationStructureTypeKHR type VkBuildAccelerationStructureFlagsKHR flags - VkBuildAccelerationStructureModeKHR mode - VkAccelerationStructureKHR srcAccelerationStructure - VkAccelerationStructureKHR dstAccelerationStructure + VkBuildAccelerationStructureModeKHR mode + VkAccelerationStructureKHR srcAccelerationStructure + VkAccelerationStructureKHR dstAccelerationStructure uint32_t geometryCount - const VkAccelerationStructureGeometryKHR* pGeometries - const VkAccelerationStructureGeometryKHR* const* ppGeometries - VkDeviceOrHostAddressKHR scratchData + const VkAccelerationStructureGeometryKHR* pGeometries + const VkAccelerationStructureGeometryKHR* const* ppGeometries + VkDeviceOrHostAddressKHR scratchData uint32_t primitiveCount uint32_t primitiveOffset - uint32_t firstVertex - uint32_t transformOffset + uint32_t firstVertex + uint32_t transformOffset VkStructureType sType @@ -4833,13 +4844,13 @@ typedef void CAMetalLayer; VkStructureType sType const void* pNext VkAccelerationStructureKHR src - VkDeviceOrHostAddressKHR dst + VkDeviceOrHostAddressKHR dst VkCopyAccelerationStructureModeKHR mode VkStructureType sType const void* pNext - VkDeviceOrHostAddressConstKHR src + VkDeviceOrHostAddressConstKHR src VkAccelerationStructureKHR dst VkCopyAccelerationStructureModeKHR mode @@ -4886,6 +4897,11 @@ typedef void CAMetalLayer; const void* pNext VkDeviceDiagnosticsConfigFlagsNV flags + + VkStructureType sType + void* pNext + VkBool32 shaderZeroInitializeWorkgroupMemory + VkStructureType sType void* pNext @@ -4904,6 +4920,14 @@ typedef void CAMetalLayer; void* pNext VkBool32 robustImageAccess + + VkStructureType sType + void* pNext + VkBool32 workgroupMemoryExplicitLayout + VkBool32 workgroupMemoryExplicitLayoutScalarBlockLayout + VkBool32 workgroupMemoryExplicitLayout8BitAccess + VkBool32 workgroupMemoryExplicitLayout16BitAccess + VkStructureType sType void* pNext @@ -5117,6 +5141,108 @@ typedef void CAMetalLayer; VkDeviceSize updateScratchSize VkDeviceSize buildScratchSize + + VkStructureType sType + void* pNext + VkBool32 mutableDescriptorType + + + uint32_t descriptorTypeCount + const VkDescriptorType* pDescriptorTypes + + + VkStructureType sType + const void* pNext + uint32_t mutableDescriptorTypeListCount + const VkMutableDescriptorTypeListVALVE* pMutableDescriptorTypeLists + + + VkStructureType sType + const void* pNext + VkPipelineStageFlags2KHR srcStageMask + VkAccessFlags2KHR srcAccessMask + VkPipelineStageFlags2KHR dstStageMask + VkAccessFlags2KHR dstAccessMask + + + VkStructureType sType + const void* pNext + VkPipelineStageFlags2KHR srcStageMask + VkAccessFlags2KHR srcAccessMask + VkPipelineStageFlags2KHR dstStageMask + VkAccessFlags2KHR dstAccessMask + VkImageLayout oldLayout + VkImageLayout newLayout + uint32_t srcQueueFamilyIndex + uint32_t dstQueueFamilyIndex + VkImage image + VkImageSubresourceRange subresourceRange + + + VkStructureType sType + const void* pNext + VkPipelineStageFlags2KHR srcStageMask + VkAccessFlags2KHR srcAccessMask + VkPipelineStageFlags2KHR dstStageMask + VkAccessFlags2KHR dstAccessMask + uint32_t srcQueueFamilyIndex + uint32_t dstQueueFamilyIndex + VkBuffer buffer + VkDeviceSize offset + VkDeviceSize size + + + VkStructureType sType + const void* pNext + VkDependencyFlags dependencyFlags + uint32_t memoryBarrierCount + const VkMemoryBarrier2KHR* pMemoryBarriers + uint32_t bufferMemoryBarrierCount + const VkBufferMemoryBarrier2KHR* pBufferMemoryBarriers + uint32_t imageMemoryBarrierCount + const VkImageMemoryBarrier2KHR* pImageMemoryBarriers + + + VkStructureType sType + const void* pNext + VkSemaphore semaphore + uint64_t value + VkPipelineStageFlags2KHR stageMask + uint32_t deviceIndex + + + VkStructureType sType + const void* pNext + VkCommandBuffer commandBuffer + uint32_t deviceMask + + + VkStructureType sType + const void* pNext + VkSubmitFlagsKHR flags + uint32_t waitSemaphoreInfoCount + const VkSemaphoreSubmitInfoKHR* pWaitSemaphoreInfos + uint32_t commandBufferInfoCount + const VkCommandBufferSubmitInfoKHR* pCommandBufferInfos + uint32_t signalSemaphoreInfoCount + const VkSemaphoreSubmitInfoKHR* pSignalSemaphoreInfos + + + VkStructureType sType + void* pNext + VkPipelineStageFlags2KHR checkpointExecutionStageMask + + + VkStructureType sType + void* pNext + VkPipelineStageFlags2KHR stage + void* pCheckpointMarker + + + VkStructureType sType + void* pNext + VkBool32 synchronization2 + Vulkan enumerant (token) definitions @@ -5664,31 +5790,31 @@ typedef void CAMetalLayer; - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + Flags @@ -5749,7 +5875,7 @@ typedef void CAMetalLayer; - + @@ -5774,7 +5900,7 @@ typedef void CAMetalLayer; - + @@ -5782,7 +5908,7 @@ typedef void CAMetalLayer; - + @@ -6528,6 +6654,64 @@ typedef void CAMetalLayer; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7356,7 +7540,7 @@ typedef void CAMetalLayer; VkCommandBuffer commandBuffer VkImage image VkImageLayout imageLayout - const VkClearColorValue* pColor + const VkClearColorValue* pColor uint32_t rangeCount const VkImageSubresourceRange* pRanges @@ -7404,8 +7588,8 @@ typedef void CAMetalLayer; VkCommandBuffer commandBuffer uint32_t eventCount const VkEvent* pEvents - VkPipelineStageFlags srcStageMask - VkPipelineStageFlags dstStageMask + VkPipelineStageFlags srcStageMask + VkPipelineStageFlags dstStageMask uint32_t memoryBarrierCount const VkMemoryBarrier* pMemoryBarriers uint32_t bufferMemoryBarrierCount @@ -7995,6 +8179,17 @@ typedef void CAMetalLayer; RROutput rrOutput VkDisplayKHR* pDisplay + + VkResult vkAcquireWinrtDisplayNV + VkPhysicalDevice physicalDevice + VkDisplayKHR display + + + VkResult vkGetWinrtDisplayNV + VkPhysicalDevice physicalDevice + uint32_t deviceRelativeId + VkDisplayKHR* pDisplay + VkResult vkDisplayPowerControlEXT VkDevice device @@ -9261,9 +9456,61 @@ typedef void CAMetalLayer; VkDevice device VkAccelerationStructureBuildTypeKHR buildType const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo - const uint32_t* pMaxPrimitiveCounts + const uint32_t* pMaxPrimitiveCounts VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo + + void vkCmdSetEvent2KHR + VkCommandBuffer commandBuffer + VkEvent event + const VkDependencyInfoKHR* pDependencyInfo + + + void vkCmdResetEvent2KHR + VkCommandBuffer commandBuffer + VkEvent event + VkPipelineStageFlags2KHR stageMask + + + void vkCmdWaitEvents2KHR + VkCommandBuffer commandBuffer + uint32_t eventCount + const VkEvent* pEvents + const VkDependencyInfoKHR* pDependencyInfos + + + void vkCmdPipelineBarrier2KHR + VkCommandBuffer commandBuffer + const VkDependencyInfoKHR* pDependencyInfo + + + VkResult vkQueueSubmit2KHR + VkQueue queue + uint32_t submitCount + const VkSubmitInfo2KHR* pSubmits + VkFence fence + + + void vkCmdWriteTimestamp2KHR + VkCommandBuffer commandBuffer + VkPipelineStageFlags2KHR stage + VkQueryPool queryPool + uint32_t query + + + void vkCmdWriteBufferMarker2AMD + VkCommandBuffer commandBuffer + VkPipelineStageFlags2KHR stage + VkBuffer dstBuffer + VkDeviceSize dstOffset + uint32_t marker + + + void vkGetQueueCheckpointData2NV + VkQueue queue + uint32_t* pCheckpointDataCount + VkCheckpointData2NV* pCheckpointData + @@ -9467,6 +9714,7 @@ typedef void CAMetalLayer; + @@ -10304,7 +10552,7 @@ typedef void CAMetalLayer; - + @@ -10329,7 +10577,7 @@ typedef void CAMetalLayer; - + @@ -10371,8 +10619,8 @@ typedef void CAMetalLayer; - - + + @@ -10496,7 +10744,7 @@ typedef void CAMetalLayer; - + @@ -11861,7 +12109,7 @@ typedef void CAMetalLayer; - + @@ -12449,7 +12697,7 @@ typedef void CAMetalLayer; - + @@ -13774,7 +14022,7 @@ typedef void CAMetalLayer; - + @@ -13849,7 +14097,7 @@ typedef void CAMetalLayer; - + @@ -14122,10 +14370,101 @@ typedef void CAMetalLayer; - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14188,10 +14527,12 @@ typedef void CAMetalLayer; - + - - + + + + @@ -14209,10 +14550,13 @@ typedef void CAMetalLayer; - + + + + @@ -14252,8 +14596,8 @@ typedef void CAMetalLayer; - - + + @@ -14272,10 +14616,12 @@ typedef void CAMetalLayer; - + - - + + + + @@ -14358,10 +14704,12 @@ typedef void CAMetalLayer; - + - - + + + + @@ -14388,12 +14736,18 @@ typedef void CAMetalLayer; - + - - - - + + + + + + + + + + @@ -14468,7 +14822,7 @@ typedef void CAMetalLayer; - + @@ -14529,12 +14883,16 @@ typedef void CAMetalLayer; + + + + @@ -14549,6 +14907,71 @@ typedef void CAMetalLayer; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14711,6 +15134,13 @@ typedef void CAMetalLayer; + + + + + + + @@ -15093,5 +15523,14 @@ typedef void CAMetalLayer; + + + + + + + + + diff --git a/generator/vulkan/parse.zig b/generator/vulkan/parse.zig index 457d187..c06220b 100644 --- a/generator/vulkan/parse.zig +++ b/generator/vulkan/parse.zig @@ -107,9 +107,21 @@ fn parseBitmaskType(ty: *xml.Element) !registry.Declaration { .decl_type = .{.alias = .{.name = alias, .target = .other_type}}, }; } else { + const flags_type = ty.getCharData("type") orelse return error.InvalidRegistry; + + const bitwidth: u8 = if (mem.eql(u8, flags_type, "VkFlags")) + 32 + else if (mem.eql(u8, flags_type, "VkFlags64")) + 64 + else + return error.InvalidRegistry; + return registry.Declaration{ .name = ty.getCharData("name") orelse return error.InvalidRegistry, - .decl_type = .{.bitmask = .{.bits_enum = ty.getAttribute("requires")}}, + .decl_type = .{.bitmask = .{ + .bits_enum = ty.getAttribute("requires"), + .bitwidth = bitwidth, + }}, }; } } @@ -317,6 +329,11 @@ fn parseEnumFields(allocator: *Allocator, elem: *xml.Element) !registry.Enum { return error.InvalidRegistry; } + const bitwidth = if (elem.getAttribute("bitwidth")) |bitwidth| + try std.fmt.parseInt(u8, bitwidth, 10) + else + 32; + const fields = try allocator.alloc(registry.Enum.Field, elem.children.items.len); var i: usize = 0; @@ -328,6 +345,7 @@ fn parseEnumFields(allocator: *Allocator, elem: *xml.Element) !registry.Enum { return registry.Enum{ .fields = allocator.shrink(fields, i), + .bitwidth = bitwidth, .is_bitmask = is_bitmask, }; } @@ -356,7 +374,7 @@ fn parseEnumField(field: *xml.Element) !registry.Enum.Field { break :blk .{.int = try std.fmt.parseInt(i32, value, 10)}; } } else if (field.getAttribute("bitpos")) |bitpos| { - break :blk .{.bitpos = try std.fmt.parseInt(u5, bitpos, 10)}; + break :blk .{.bitpos = try std.fmt.parseInt(u6, bitpos, 10)}; } else if (field.getAttribute("alias")) |alias| { break :blk .{.alias = .{.name = alias, .is_compat_alias = is_compat_alias}}; } else { diff --git a/generator/vulkan/registry.zig b/generator/vulkan/registry.zig index 244377a..d4efae5 100644 --- a/generator/vulkan/registry.zig +++ b/generator/vulkan/registry.zig @@ -71,7 +71,7 @@ pub const Container = struct { pub const Enum = struct { pub const Value = union(enum) { - bitpos: u5, // 1 << bitpos + bitpos: u6, // 1 << bitpos bit_vector: i32, // Combined flags & some vendor IDs int: i32, alias: struct { @@ -86,11 +86,13 @@ pub const Enum = struct { }; fields: []Field, + bitwidth: u8, is_bitmask: bool, }; pub const Bitmask = struct { bits_enum: ?[]const u8, + bitwidth: u8, }; pub const Handle = struct { diff --git a/generator/vulkan/render.zig b/generator/vulkan/render.zig index 8e3e3a7..8f268c0 100644 --- a/generator/vulkan/render.zig +++ b/generator/vulkan/render.zig @@ -24,9 +24,9 @@ const preamble = \\ .AAPCSVFP \\ else \\ .C; - \\pub fn FlagsMixin(comptime FlagsType: type) type { + \\pub fn FlagsMixin(comptime FlagsType: type, comptime Int: type) type { \\ return struct { - \\ pub const IntType = Flags; + \\ pub const IntType = Int; \\ pub fn toInt(self: FlagsType) IntType { \\ return @bitCast(IntType, self); \\ } @@ -129,15 +129,16 @@ fn Renderer(comptime WriterType: type) type { return struct { const Self = @This(); const WriteError = WriterType.Error; - const RenderTypeInfoError = WriteError || error { - OutOfMemory, - }; + const RenderTypeInfoError = WriteError || std.fmt.ParseIntError || error { OutOfMemory, InvalidRegistry }; const BitflagName = struct { /// Name without FlagBits, so VkSurfaceTransformFlagBitsKHR /// becomes VkSurfaceTransform base_name: []const u8, + /// Optional flag bits revision, used in places like VkAccessFlagBits2KHR + revision: ?[]const u8, + /// Optional tag of the flag tag: ?[]const u8, }; @@ -225,8 +226,8 @@ fn Renderer(comptime WriterType: type) type { while (true) { const rest = field_it.rest(); + const field_segment = field_it.next() orelse return error.InvalidRegistry; const enum_segment = enum_it.next() orelse return rest; - const field_segment = field_it.next() orelse return error.FieldNameEqualsEnumName; if (!eqlIgnoreCase(enum_segment, field_segment)) { return rest; @@ -234,16 +235,51 @@ fn Renderer(comptime WriterType: type) type { } } - fn extractBitflagName(self: Self, name: []const u8) ?BitflagName { - const tag = self.id_renderer.getAuthorTag(name); - const base_name = if (tag) |tag_name| name[0 .. name.len - tag_name.len] else name; + fn extractBitflagFieldName(self: Self, bitflag_name: BitflagName, field_name: []const u8) ![]const u8 { + var flag_it = id_render.SegmentIterator.init(bitflag_name.base_name); + var field_it = id_render.SegmentIterator.init(field_name); - if (!mem.endsWith(u8, base_name, "FlagBits")) { + while (true) { + const rest = field_it.rest(); + const field_segment = field_it.next() orelse return error.InvalidRegistry; + const flag_segment = flag_it.next() orelse { + if (bitflag_name.revision) |revision| { + if (mem.eql(u8, revision, field_segment)) + return field_it.rest(); + } + + return rest; + }; + + if (!eqlIgnoreCase(flag_segment, field_segment)) { + return rest; + } + } + } + + fn extractBitflagName(self: Self, name: []const u8) !?BitflagName { + const tag = self.id_renderer.getAuthorTag(name); + const tagless_name = if (tag) |tag_name| name[0 .. name.len - tag_name.len] else name; + + const maybe_last_number = mem.lastIndexOfAny(u8, tagless_name, "0123456789"); + const base_name = if (maybe_last_number) |last_number| + tagless_name[0 .. last_number] + else + tagless_name; + + const maybe_flag_bits_index = mem.lastIndexOf(u8, base_name, "FlagBits"); + if (maybe_flag_bits_index == null) { return null; + } else if (maybe_flag_bits_index != base_name.len - "FlagBits".len) { + // It is unlikely that a type that is not a flag bit would contain FlagBits, + // and more likely that we have missed something if FlagBits isn't the last + // part of base_name + return error.InvalidRegistry; } return BitflagName{ .base_name = base_name[0 .. base_name.len - "FlagBits".len], + .revision = if (maybe_last_number) |last_number| tagless_name[last_number..] else null, .tag = tag, }; } @@ -333,7 +369,7 @@ fn Renderer(comptime WriterType: type) type { } }, .name => |name| { - if (self.extractBitflagName(param.param_type.name) != null or self.isFlags(param.param_type.name)) { + if ((try self.extractBitflagName(param.param_type.name)) != null or self.isFlags(param.param_type.name)) { return .bitflags; } }, @@ -495,9 +531,10 @@ fn Renderer(comptime WriterType: type) type { if (builtin_types.get(name)) |zig_name| { try self.writer.writeAll(zig_name); return; - } else if (self.extractBitflagName(name)) |bitflag_name| { - try self.writeIdentifierFmt("{s}Flags{s}", .{ + } else if (try self.extractBitflagName(name)) |bitflag_name| { + try self.writeIdentifierFmt("{s}Flags{s}{s}", .{ trimVkNamespace(bitflag_name.base_name), + @as([]const u8, if (bitflag_name.revision) |revision| revision else ""), @as([]const u8, if (bitflag_name.tag) |tag| tag else "") }); return; @@ -534,9 +571,10 @@ fn Renderer(comptime WriterType: type) type { blk: { if (param.param_type == .name) { - if (self.extractBitflagName(param.param_type.name)) |bitflag_name| { - try self.writeIdentifierFmt("{s}Flags{s}", .{ + if (try self.extractBitflagName(param.param_type.name)) |bitflag_name| { + try self.writeIdentifierFmt("{s}Flags{s}{s}", .{ trimVkNamespace(bitflag_name.base_name), + @as([]const u8, if (bitflag_name.revision) |revision| revision else ""), @as([]const u8, if (bitflag_name.tag) |tag| tag else "") }); try self.writer.writeAll(".IntType"); @@ -720,24 +758,48 @@ fn Renderer(comptime WriterType: type) type { try self.writer.writeAll("_,};\n"); } + fn bitmaskFlagsType(bitwidth: u8) ![]const u8 { + return switch (bitwidth) { + 32 => "Flags", + 64 => "Flags64", + else => return error.InvalidRegistry, + }; + } + + fn renderUsingFlagsMixin(self: *Self, name: []const u8, bitwidth: u8) !void { + const flags_type = switch (bitwidth) { + 32 => "Flags", + 64 => "Flags64", + else => return error.InvalidRegistry, + }; + + try self.writer.writeAll("pub usingnamespace FlagsMixin("); + try self.renderName(name); + try self.writer.print(", {s});\n", .{ flags_type }); + } + fn renderBitmaskBits(self: *Self, name: []const u8, bits: reg.Enum) !void { try self.writer.writeAll("pub const "); try self.renderName(name); try self.writer.writeAll(" = packed struct {"); + const bitflag_name = (try self.extractBitflagName(name)) orelse return error.InvalidRegistry; + const flags_type = try bitmaskFlagsType(bits.bitwidth); + if (bits.fields.len == 0) { - try self.writer.writeAll("_reserved_bits: Flags = 0,"); + try self.writer.print("_reserved_bits: {s} = 0,", .{ flags_type }); } else { - var flags_by_bitpos = [_]?[]const u8{null} ** 32; + var flags_by_bitpos = [_]?[]const u8{null} ** 64; for (bits.fields) |field| { if (field.value == .bitpos) { flags_by_bitpos[field.value.bitpos] = field.name; } } - for (flags_by_bitpos) |opt_flag_name, bitpos| { - if (opt_flag_name) |flag_name| { - try self.renderEnumFieldName(name, flag_name); + for (flags_by_bitpos[0.. bits.bitwidth]) |maybe_flag_name, bitpos| { + if (maybe_flag_name) |flag_name| { + const field_name = try self.extractBitflagFieldName(bitflag_name, flag_name); + try self.writeIdentifierWithCase(.snake, field_name); } else { try self.writer.print("_reserved_bit_{}", .{bitpos}); } @@ -751,7 +813,7 @@ fn Renderer(comptime WriterType: type) type { } try self.writer.writeAll("pub usingnamespace FlagsMixin("); try self.renderName(name); - try self.writer.writeAll(");\n};\n"); + try self.writer.print(", {s});\n}};\n", .{ flags_type }); } fn renderBitmask(self: *Self, name: []const u8, bitmask: reg.Bitmask) !void { @@ -759,18 +821,22 @@ fn Renderer(comptime WriterType: type) type { // The bits structure is generated by renderBitmaskBits, but that wont // output flags with no associated bits type. + const flags_type = try bitmaskFlagsType(bitmask.bitwidth); + try self.writer.writeAll("pub const "); try self.renderName(name); - try self.writer.writeAll( - \\ = packed struct { - \\_reserved_bits: Flags = 0, + try self.writer.print( + \\ = packed struct {{ + \\_reserved_bits: {s} = 0, \\pub usingnamespace FlagsMixin( + , .{ flags_type } ); try self.renderName(name); - try self.writer.writeAll( - \\); - \\}; + try self.writer.print( + \\, {s}); + \\}}; \\ + , .{ flags_type } ); } } @@ -786,7 +852,7 @@ fn Renderer(comptime WriterType: type) type { fn renderAlias(self: *Self, name: []const u8, alias: reg.Alias) !void { if (alias.target == .other_command) { return; - } else if (self.extractBitflagName(name) != null) { + } else if ((try self.extractBitflagName(name)) != null) { // Don't make aliases of the bitflag names, as those are replaced by just the flags type return; }