diff --git a/.silktouch/openal-clangsharp.stout b/.silktouch/openal-clangsharp.stout index 98539cef7f..cd15a37e8e 100644 Binary files a/.silktouch/openal-clangsharp.stout and b/.silktouch/openal-clangsharp.stout differ diff --git a/.silktouch/opengl-clangsharp.stout b/.silktouch/opengl-clangsharp.stout index 5d519a64d8..9134b29332 100644 Binary files a/.silktouch/opengl-clangsharp.stout and b/.silktouch/opengl-clangsharp.stout differ diff --git a/.silktouch/vulkan-clangsharp.stout b/.silktouch/vulkan-clangsharp.stout index 07058b6ad7..b6dc0b1f4a 100644 Binary files a/.silktouch/vulkan-clangsharp.stout and b/.silktouch/vulkan-clangsharp.stout differ diff --git a/sources/OpenAL/OpenAL/Enums/ALCEnum.gen.cs b/sources/OpenAL/OpenAL/Enums/ALCEnum.gen.cs index ff0db8e938..9cc6dac56b 100644 --- a/sources/OpenAL/OpenAL/Enums/ALCEnum.gen.cs +++ b/sources/OpenAL/OpenAL/Enums/ALCEnum.gen.cs @@ -10,7 +10,7 @@ namespace Silk.NET.OpenAL; -[NativeName("ALCEnum")] +[NativeName("ALCenum")] public enum ALCEnum : uint { [NativeName("ALC_INVALID")] diff --git a/sources/OpenAL/OpenAL/Enums/ALEnum.gen.cs b/sources/OpenAL/OpenAL/Enums/ALEnum.gen.cs index 97f9834ade..d7afdb321d 100644 --- a/sources/OpenAL/OpenAL/Enums/ALEnum.gen.cs +++ b/sources/OpenAL/OpenAL/Enums/ALEnum.gen.cs @@ -10,7 +10,7 @@ namespace Silk.NET.OpenAL; -[NativeName("ALEnum")] +[NativeName("ALenum")] public enum ALEnum : uint { [NativeName("AL_NONE")] diff --git a/sources/OpenGL/OpenGL/Enums/GLEnum.gen.cs b/sources/OpenGL/OpenGL/Enums/GLEnum.gen.cs index 3109da5ed0..c1f9b5201f 100644 --- a/sources/OpenGL/OpenGL/Enums/GLEnum.gen.cs +++ b/sources/OpenGL/OpenGL/Enums/GLEnum.gen.cs @@ -7,7 +7,7 @@ namespace Silk.NET.OpenGL; -[NativeName("GLEnum")] +[NativeName("GLenum")] public enum GLEnum : uint { [NativeName("GL_DEPTH_BUFFER_BIT")] diff --git a/sources/SilkTouch/SilkTouch/Mods/MixKhronosData.cs b/sources/SilkTouch/SilkTouch/Mods/MixKhronosData.cs index 51bba6e3e6..85dc14d268 100644 --- a/sources/SilkTouch/SilkTouch/Mods/MixKhronosData.cs +++ b/sources/SilkTouch/SilkTouch/Mods/MixKhronosData.cs @@ -248,8 +248,6 @@ public async Task InitializeAsync(IModContext ctx, CancellationToken ct = defaul job.TypeMap.TryAdd("uint32_t", "uint"); job.TypeMap.TryAdd("int64_t", "long"); job.TypeMap.TryAdd("uint64_t", "ulong"); - job.TypeMap.TryAdd("GLenum", "uint"); - job.TypeMap.TryAdd("GLbitfield", "uint"); if (specPath is null) { // No metadata, can't continue. It'd be odd if the Khronos mod is being used in this case. There was once @@ -1986,16 +1984,18 @@ public override SyntaxNode VisitDelegateDeclaration(DelegateDeclarationSyntax no // Trimming is done by PrettifyNames, if PrettifyNames is configured to do so public override SyntaxNode VisitEnumDeclaration(EnumDeclarationSyntax node) { - var typeName = node.AttributeLists.GetNativeNameOrDefault(node.Identifier); - var groupInfo = job.Groups.GetValueOrDefault(typeName); + var nativeTypeName = node.AttributeLists.GetNativeNameOrDefault(node.Identifier); + var managedTypeName = node.Identifier.Text; - var typeVendor = job.Vendors.FirstOrDefault(typeName.EndsWith); + var groupInfo = job.Groups.GetValueOrDefault(managedTypeName); + + var typeVendor = job.Vendors.FirstOrDefault(nativeTypeName.EndsWith); var hasTypeSuffix = typeVendor != null; var vendorAffixType = "KhronosVendor"; // Identify the namespace enum // Eg: GLEnum, ALEnum - if (groupInfo?.Namespace != null && typeName == $"{groupInfo.Namespace}Enum") + if (groupInfo?.Namespace != null && nativeTypeName == $"{groupInfo.Namespace}enum") { node = node.WithAttributeLists( node.AttributeLists.AddNamePrefix("KhronosNamespaceEnum", groupInfo.Namespace) @@ -2023,7 +2023,8 @@ public override SyntaxNode VisitEnumDeclaration(EnumDeclarationSyntax node) // Trimming both would cause conflicts. // Trimming one but not the other would imply one is core and the other is not. var hasMultipleVersions = - job.Groups.Count(x => x.Key.StartsWith(typeName[..^typeVendor.Length])) > 1; + job.Groups.Count(x => x.Key.StartsWith(nativeTypeName[..^typeVendor.Length])) + > 1; var isSafeToTrimType = !hasMultipleVersions; // Identify the affix for trimming if the type vendor suffix does not match the identified exclusive vendor suffix @@ -2139,9 +2140,25 @@ public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node) [SuppressMessage("ReSharper", "MoveLocalFunctionAfterJumpStatement")] internal void ReadGroups(XDocument doc, JobData data, HashSet vendors) { + // For reference: + // Khronos XMLs specify enums in the following format + // - Top level element. + // - Main enum group. + // - Enum member. + // + // Each API has slight variations in how the XML is structured. + // + // Main enum group: + // Either has the "group" and "namespace" properties (OpenGL-style). + // Or has the "name" property. + // + // Enum member: + // The "group" property specifies a list of additional OpenGL-style groups the enum member belongs to. + // Designed to be compatible with OpenGL, EGL, WGL, GLX, and OpenCL. - // This will work for Vulkan as well, but for Vulkan the enums are actually "typedef enum"s in the headers and - // therefore the result of this function will go mostly ignored. + // This will work for Vulkan as well, but for Vulkan the enums are actually "typedef enum"s in the headers. + // This means that for Vulkan, this means that instead of using this information to directly generate the enums + // this information will mostly be used to enhance the enums scraped from the headers (eg: native name and bitmask information). var anyNamespaced = doc.Element("registry")?.Elements("enums").Attributes("namespace").Any() ?? false; var anyGLStyleGroups = @@ -2149,6 +2166,8 @@ internal void ReadGroups(XDocument doc, JobData data, HashSet vendors) ?? false; var likelyOpenCL = false; // OpenCL specific var topLevelIntentionalExclusions = new HashSet(); // OpenCL specific + + // Parse enum groups foreach (var block in doc.Element("registry")?.Elements("enums") ?? []) { // Is it a bitmask? @@ -2162,11 +2181,14 @@ internal void ReadGroups(XDocument doc, JobData data, HashSet vendors) : null; var nativeName = groupName; + // OpenGL-style enums have an uint base type + var baseType = anyGLStyleGroups ? "uint" : null; + // Create an ungrouped group as well i.e. GLEnum, WGLEnum, etc if (enumNamespace is not null) { groupName ??= $"{enumNamespace}Enum"; - nativeName ??= enumNamespace; + nativeName ??= $"{enumNamespace}enum"; } // OpenCL enum name @@ -2176,8 +2198,8 @@ internal void ReadGroups(XDocument doc, JobData data, HashSet vendors) } // Vulkan/OpenXR enum name - nativeName ??= groupName; groupName = groupName?.Replace("FlagBits", "Flags"); + nativeName ??= groupName; // Skip Vulkan API Constants since it is not an enum if (block.Attribute("type")?.Value == "constants") @@ -2207,7 +2229,28 @@ static bool IsUngroupable(string groupName) => FixupGroupNameForOpenCL(ref groupName, ref likelyOpenCL, ref isBitmask); } - // Mark the enums + // Initialize the group before enum members are parsed below + // This ensures two things: + // 1. The native name is correct + // 2. Empty groups are recorded properly + if ( + groupName != null + && !IsUngroupable(groupName) + && !data.Groups.ContainsKey(groupName) + ) + { + data.Groups[groupName] = new EnumGroup( + groupName, + nativeName, + baseType, + [], + isBitmask, + VendorFromString(groupName, vendors), + enumNamespace + ); + } + + // Parse enum members foreach (var @enum in block.Elements("enum")) { var enumName = @@ -2225,7 +2268,7 @@ static bool IsUngroupable(string groupName) => data.EnumsToGroups[enumName] = enumToGroups = []; } - // OpenGL-style groups + // Parse OpenGL-style groups var glGroups = @enum .Attribute("group") ?.Value.Split( @@ -2236,12 +2279,12 @@ static bool IsUngroupable(string groupName) => // Get the vendor (if the enum name ends with a vendor that is). var thisVendor = VendorFromString(enumName, vendors); - foreach ( - var group in (groupName is null ? Enumerable.Empty() : [groupName]) - .Concat(glGroups ?? []) - .Concat(block.Attribute("group")?.Value is { Length: > 0 } g ? [g] : []) - .Distinct() - ) + // Add the enum member to the namespace enum, the main enum group, and its additional OpenGL-style groups + var memberGroups = (groupName is null ? Enumerable.Empty() : [groupName]) + .Concat(block.Attribute("group")?.Value is { Length: > 0 } g ? [g] : []) + .Concat(glGroups ?? []) + .Distinct(); + foreach (var group in memberGroups) { if (IsUngroupable(group)) { @@ -2265,7 +2308,7 @@ var group in (groupName is null ? Enumerable.Empty() : [groupName]) : new EnumGroup( group, group, - anyGLStyleGroups ? "GLenum" : null, + baseType, [], isBitmask, thisVendor, @@ -2276,24 +2319,6 @@ var group in (groupName is null ? Enumerable.Empty() : [groupName]) enumToGroups.Add(group); } } - - // Some enum groups don't have members, meaning that the code above won't catch them - if ( - groupName != null - && !IsUngroupable(groupName) - && !data.Groups.ContainsKey(groupName) - ) - { - data.Groups[groupName] = new EnumGroup( - groupName, - nativeName, - null, - [], - isBitmask, - VendorFromString(groupName, vendors), - enumNamespace - ); - } } var allHandles = doc.Elements("registry") diff --git a/sources/Vulkan/Vulkan/Enums/DataGraphPipelineDispatchFlagsARM.gen.cs b/sources/Vulkan/Vulkan/Enums/DataGraphPipelineDispatchFlagsARM.gen.cs index 7fc496db2e..39e0e0c00b 100644 --- a/sources/Vulkan/Vulkan/Enums/DataGraphPipelineDispatchFlagsARM.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/DataGraphPipelineDispatchFlagsARM.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkDataGraphPipelineDispatchFlagBitsARM")] +[NativeName("VkDataGraphPipelineDispatchFlagsARM")] [Flags] public enum DataGraphPipelineDispatchFlagsARM : ulong { diff --git a/sources/Vulkan/Vulkan/Enums/ImageFormatConstraintsFlagsFUCHSIA.gen.cs b/sources/Vulkan/Vulkan/Enums/ImageFormatConstraintsFlagsFUCHSIA.gen.cs index 5f1d9fbbb7..268cc9c2ba 100644 --- a/sources/Vulkan/Vulkan/Enums/ImageFormatConstraintsFlagsFUCHSIA.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/ImageFormatConstraintsFlagsFUCHSIA.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkImageFormatConstraintsFlagBitsFUCHSIA")] +[NativeName("VkImageFormatConstraintsFlagsFUCHSIA")] [Flags] public enum ImageFormatConstraintsFlagsFUCHSIA : uint { diff --git a/sources/Vulkan/Vulkan/Enums/PrivateDataSlotCreateFlags.gen.cs b/sources/Vulkan/Vulkan/Enums/PrivateDataSlotCreateFlags.gen.cs index 1d0ca3a97a..89bcf2fbe1 100644 --- a/sources/Vulkan/Vulkan/Enums/PrivateDataSlotCreateFlags.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/PrivateDataSlotCreateFlags.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkPrivateDataSlotCreateFlagBits")] +[NativeName("VkPrivateDataSlotCreateFlags")] [Flags] public enum PrivateDataSlotCreateFlags : uint { diff --git a/sources/Vulkan/Vulkan/Enums/RefreshObjectFlagsKHR.gen.cs b/sources/Vulkan/Vulkan/Enums/RefreshObjectFlagsKHR.gen.cs index b6cc814bcd..282bba7349 100644 --- a/sources/Vulkan/Vulkan/Enums/RefreshObjectFlagsKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/RefreshObjectFlagsKHR.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkRefreshObjectFlagBitsKHR")] +[NativeName("VkRefreshObjectFlagsKHR")] [Flags] public enum RefreshObjectFlagsKHR : uint { diff --git a/sources/Vulkan/Vulkan/Enums/SemaphoreCreateFlags.gen.cs b/sources/Vulkan/Vulkan/Enums/SemaphoreCreateFlags.gen.cs index 07a7451f2f..7111b0e08e 100644 --- a/sources/Vulkan/Vulkan/Enums/SemaphoreCreateFlags.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/SemaphoreCreateFlags.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkSemaphoreCreateFlagBits")] +[NativeName("VkSemaphoreCreateFlags")] [Flags] public enum SemaphoreCreateFlags : uint { diff --git a/sources/Vulkan/Vulkan/Enums/ShaderModuleCreateFlags.gen.cs b/sources/Vulkan/Vulkan/Enums/ShaderModuleCreateFlags.gen.cs index a991637ec2..d9f610d801 100644 --- a/sources/Vulkan/Vulkan/Enums/ShaderModuleCreateFlags.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/ShaderModuleCreateFlags.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkShaderModuleCreateFlagBits")] +[NativeName("VkShaderModuleCreateFlags")] [Flags] public enum ShaderModuleCreateFlags : uint { diff --git a/sources/Vulkan/Vulkan/Enums/TensorViewCreateFlagsARM.gen.cs b/sources/Vulkan/Vulkan/Enums/TensorViewCreateFlagsARM.gen.cs index 1940b94047..dab233c115 100644 --- a/sources/Vulkan/Vulkan/Enums/TensorViewCreateFlagsARM.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/TensorViewCreateFlagsARM.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkTensorViewCreateFlagBitsARM")] +[NativeName("VkTensorViewCreateFlagsARM")] [Flags] public enum TensorViewCreateFlagsARM : ulong { diff --git a/sources/Vulkan/Vulkan/Enums/WaylandSurfaceCreateFlagsKHR.gen.cs b/sources/Vulkan/Vulkan/Enums/WaylandSurfaceCreateFlagsKHR.gen.cs index ee7beea1f5..09790b1536 100644 --- a/sources/Vulkan/Vulkan/Enums/WaylandSurfaceCreateFlagsKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Enums/WaylandSurfaceCreateFlagsKHR.gen.cs @@ -8,7 +8,7 @@ namespace Silk.NET.Vulkan; -[NativeName("VkWaylandSurfaceCreateFlagBitsKHR")] +[NativeName("VkWaylandSurfaceCreateFlagsKHR")] [Flags] public enum WaylandSurfaceCreateFlagsKHR : uint { diff --git a/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.IdentifiesNamespaceEnumPrefix.verified.txt b/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.IdentifiesNamespaceEnumPrefix.verified.txt index a463c66a73..4a30909ca0 100644 --- a/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.IdentifiesNamespaceEnumPrefix.verified.txt +++ b/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.IdentifiesNamespaceEnumPrefix.verified.txt @@ -1,4 +1,5 @@ -[NameAffix("Prefix", "KhronosNamespaceEnum", "GL")] +[NativeName("GLenum")] +[NameAffix("Prefix", "KhronosNamespaceEnum", "GL")] public enum GLEnum { } \ No newline at end of file diff --git a/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.cs b/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.cs index f1644dc266..b9a7cf62ef 100644 --- a/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.cs +++ b/tests/SilkTouch/SilkTouch/Khronos/MixKhronosDataTests.cs @@ -424,6 +424,7 @@ public async Task IdentifiesNamespaceEnumPrefix() .AddDocument( "GLEnum.gen.cs", """ + [NativeName("GLenum")] public enum GLEnum { } """ ) @@ -448,7 +449,7 @@ public enum GLEnum { } "GLEnum", new MixKhronosData.EnumGroup( "GLEnum", - "GLEnum", + "GLenum", "Glenum", [], false,