Skip to content

Commit fb7bba2

Browse files
committed
Fix edge case where Flags types were being output as uint instead of the actual enum type
1 parent 35fd9e2 commit fb7bba2

10 files changed

Lines changed: 108 additions & 26 deletions

.silktouch/d48a9fc4a502f7c6.stout

1.15 KB
Binary file not shown.

sources/SilkTouch/SilkTouch/Mods/MixKhronosData.cs

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Threading;
1212
using System.Threading.Tasks;
1313
using System.Xml.Linq;
14+
using ClangSharp;
1415
using Humanizer;
1516
using Microsoft.CodeAnalysis;
1617
using Microsoft.CodeAnalysis.CSharp;
@@ -23,6 +24,7 @@
2324
using Silk.NET.SilkTouch.Mods.Transformation;
2425
using Silk.NET.SilkTouch.Naming;
2526
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
27+
using Type = System.Type;
2628

2729
namespace Silk.NET.SilkTouch.Mods;
2830

@@ -37,6 +39,7 @@ public partial class MixKhronosData(
3739
IOptionsSnapshot<MixKhronosData.Configuration> cfg
3840
)
3941
: IMod,
42+
IResponseFileMod,
4043
INameTrimmer,
4144
IFunctionTransformer,
4245
IApiMetadataProvider<SymbolConstraints>,
@@ -133,6 +136,14 @@ public Dictionary<
133136
/// these are easily solvable breakages.
134137
/// </remarks>
135138
public HashSet<string> DeprecatedAliases = [];
139+
140+
/// <summary>
141+
/// Additional type remappings to pass to ClangSharp.
142+
/// </summary>
143+
/// <remarks>
144+
/// This was added for Vulkan Flags/FlagBits remappings.
145+
/// </remarks>
146+
public Dictionary<string, string> AdditionalTypeRemappings = [];
136147
}
137148

138149
/// <summary>
@@ -311,6 +322,28 @@ .. xml.Element("registry")
311322

312323
job.TypeMap.TryAdd(type, baseType);
313324
}
325+
326+
// Add mappings from Flags storage types to FlagBits enums types
327+
// We want Flags as the output, but in order to generate everything correctly,
328+
// we need to first map Flags to FlagBits, then rename FlagBits back to Flags (this is done in the rewriters).
329+
// Without this, ClangSharp will output the Flags types as the integral storage type instead of the enum
330+
foreach (var typeElement in xml.Elements("registry").Elements("types").Elements("type"))
331+
{
332+
var typedef = typeElement.Element("type")?.Value;
333+
if (typedef != "VkFlags" && typedef != "VkFlags64")
334+
{
335+
continue;
336+
}
337+
338+
var mapFrom = typeElement.Element("name")?.Value;
339+
var mapTo = typeElement.Attribute("requires")?.Value;
340+
if (mapFrom == null || mapTo == null)
341+
{
342+
continue;
343+
}
344+
345+
job.AdditionalTypeRemappings[mapFrom] = mapTo;
346+
}
314347
}
315348

316349
/// <inheritdoc />
@@ -356,6 +389,57 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default)
356389
ctx.SourceProject = proj;
357390
}
358391

392+
/// <inheritdoc />
393+
public Task<List<ResponseFile>> BeforeScrapeAsync(string key, List<ResponseFile> rsps)
394+
{
395+
var job = Jobs[key];
396+
397+
var tmp = Path.GetTempFileName();
398+
rsps = rsps.Select(rsp =>
399+
{
400+
File.WriteAllText(tmp, rsp.GeneratorConfiguration.HeaderText);
401+
return rsp with
402+
{
403+
GeneratorConfiguration = new PInvokeGeneratorConfiguration(
404+
rsp.GeneratorConfiguration.Language,
405+
rsp.GeneratorConfiguration.LanguageStandard,
406+
rsp.GeneratorConfiguration.DefaultNamespace,
407+
rsp.GeneratorConfiguration.OutputLocation,
408+
tmp,
409+
rsp.GeneratorConfiguration.OutputMode,
410+
rsp.GeneratorConfiguration.ReconstructOptions()
411+
)
412+
{
413+
DefaultClass = rsp.GeneratorConfiguration.DefaultClass,
414+
ExcludedNames = rsp.GeneratorConfiguration.ExcludedNames,
415+
IncludedNames = rsp.GeneratorConfiguration.IncludedNames,
416+
LibraryPath = rsp.GeneratorConfiguration.LibraryPath,
417+
MethodPrefixToStrip = rsp.GeneratorConfiguration.MethodPrefixToStrip,
418+
NativeTypeNamesToStrip = rsp.GeneratorConfiguration.NativeTypeNamesToStrip,
419+
RemappedNames = rsp.GeneratorConfiguration.RemappedNames.Concat(job.AdditionalTypeRemappings).ToDictionary(),
420+
TraversalNames = rsp.GeneratorConfiguration.TraversalNames,
421+
TestOutputLocation = rsp.GeneratorConfiguration.TestOutputLocation,
422+
WithAccessSpecifiers = rsp.GeneratorConfiguration.WithAccessSpecifiers,
423+
WithAttributes = rsp.GeneratorConfiguration.WithAttributes,
424+
WithCallConvs = rsp.GeneratorConfiguration.WithCallConvs,
425+
WithClasses = rsp.GeneratorConfiguration.WithClasses,
426+
WithGuids = rsp.GeneratorConfiguration.WithGuids,
427+
WithLibraryPaths = rsp.GeneratorConfiguration.WithLibraryPaths,
428+
WithManualImports = rsp.GeneratorConfiguration.WithManualImports,
429+
WithNamespaces = rsp.GeneratorConfiguration.WithNamespaces,
430+
WithSetLastErrors = rsp.GeneratorConfiguration.WithSetLastErrors,
431+
WithSuppressGCTransitions = rsp.GeneratorConfiguration.WithSuppressGCTransitions,
432+
WithTransparentStructs = rsp.GeneratorConfiguration.WithTransparentStructs,
433+
WithTypes = rsp.GeneratorConfiguration.WithTypes,
434+
WithUsings = rsp.GeneratorConfiguration.WithUsings,
435+
WithPackings = rsp.GeneratorConfiguration.WithPackings,
436+
}
437+
};
438+
}).ToList();
439+
440+
return Task.FromResult(rsps);
441+
}
442+
359443
internal record EnumGroup(
360444
string Name,
361445
string? Type,
@@ -1286,10 +1370,10 @@ vendorSuffix is null
12861370
!names.ContainsKey(newOriginal)
12871371
&& (
12881372
job.Configuration.UseExtensionVendorTrimmings
1289-
== ExtensionVendorTrimmingMode.All
1373+
== MixKhronosData.ExtensionVendorTrimmingMode.All
12901374
|| (
12911375
job.Configuration.UseExtensionVendorTrimmings
1292-
== ExtensionVendorTrimmingMode.KhronosOnly
1376+
== MixKhronosData.ExtensionVendorTrimmingMode.KhronosOnly
12931377
&& vendor is "KHR" or "ARB"
12941378
)
12951379
|| (
@@ -1571,7 +1655,7 @@ PointerTypeSyntax ptr
15711655
TypeSyntax? GetTypeTransformation(
15721656
string symbolName,
15731657
string paramName,
1574-
JobData job,
1658+
MixKhronosData.JobData job,
15751659
TypeSyntax type,
15761660
int pass,
15771661
ref bool anyNonTrivialParams
@@ -1720,7 +1804,7 @@ jobKey is null
17201804
/// This rewriter is split into two phases because NamespaceFromSyntaxNode breaks due to
17211805
/// the FieldDeclarationSyntax being modified.
17221806
/// </remarks>
1723-
private class RewriterPhase1(JobData job, ILogger logger) : CSharpSyntaxRewriter
1807+
private class RewriterPhase1(MixKhronosData.JobData job, ILogger logger) : CSharpSyntaxRewriter
17241808
{
17251809
/// <summary>
17261810
/// Tracks enum groups that already exist in the project, prior to the generation of missing enums.
@@ -1729,7 +1813,7 @@ private class RewriterPhase1(JobData job, ILogger logger) : CSharpSyntaxRewriter
17291813

17301814
/// <summary>
17311815
/// Tracks enums that exist in the project.
1732-
/// Note that this includes any enum, including enums not present in <see cref="JobData.Groups"/>.
1816+
/// Note that this includes any enum, including enums not present in <see cref="MixKhronosData.JobData.Groups"/>.
17331817
/// </summary>
17341818
public HashSet<string> AllKnownEnums { get; } = [];
17351819

@@ -1998,7 +2082,6 @@ private class RewriterPhase2(JobData job, RewriterPhase1 phase1) : CSharpSyntaxR
19982082
}
19992083

20002084
return base.VisitFieldDeclaration(node);
2001-
20022085
}
20032086

20042087
public override SyntaxNode? VisitPropertyDeclaration(PropertyDeclarationSyntax node)
@@ -2019,7 +2102,6 @@ private class RewriterPhase2(JobData job, RewriterPhase1 phase1) : CSharpSyntaxR
20192102
}
20202103

20212104
return base.VisitParameter(node);
2022-
20232105
}
20242106

20252107
/// <summary>
@@ -2053,7 +2135,7 @@ private bool TryGetManagedEnumType(SyntaxList<AttributeListSyntax> attributes, [
20532135
}
20542136

20552137
[SuppressMessage("ReSharper", "MoveLocalFunctionAfterJumpStatement")]
2056-
internal void ReadGroups(XDocument doc, JobData data, HashSet<string> vendors)
2138+
internal void ReadGroups(XDocument doc, MixKhronosData.JobData data, HashSet<string> vendors)
20572139
{
20582140
// Designed to be compatible with OpenGL, EGL, WGL, GLX, and OpenCL.
20592141
// This will work for Vulkan as well, but for Vulkan the enums are actually "typedef enum"s in the headers and

sources/Vulkan/Vulkan/Vulkan/AccelerationStructureInfoNV.gen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public unsafe partial struct AccelerationStructureInfoNV
5353
"VK_VERSION_1_1",
5454
]
5555
)]
56-
public uint Flags;
56+
public BuildAccelerationStructureFlagsKHR Flags;
5757

5858
[NativeTypeName("uint32_t")]
5959
[SupportedApiProfile(

sources/Vulkan/Vulkan/Vulkan/AccelerationStructureInstanceKHR.gen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public uint instanceShaderBindingTableRecordOffset
102102
"VK_KHR_deferred_host_operations+VK_VERSION_1_2",
103103
]
104104
)]
105-
public uint flags
105+
public GeometryInstanceFlagsKHR flags
106106
{
107107
[MethodImpl(MethodImplOptions.AggressiveInlining)]
108108
readonly get { return (Bitfield2 >> 24) & 0xFFu; }

sources/Vulkan/Vulkan/Vulkan/AccelerationStructureMatrixMotionInstanceNV.gen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public uint instanceShaderBindingTableRecordOffset
8888
["VK_NV_ray_tracing_motion_blur"],
8989
ImpliesSets = ["VK_KHR_ray_tracing_pipeline"]
9090
)]
91-
public uint flags
91+
public GeometryInstanceFlagsKHR flags
9292
{
9393
[MethodImpl(MethodImplOptions.AggressiveInlining)]
9494
readonly get { return (Bitfield2 >> 24) & 0xFFu; }

sources/Vulkan/Vulkan/Vulkan/AccelerationStructureSRTMotionInstanceNV.gen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public uint instanceShaderBindingTableRecordOffset
8888
["VK_NV_ray_tracing_motion_blur"],
8989
ImpliesSets = ["VK_KHR_ray_tracing_pipeline"]
9090
)]
91-
public uint flags
91+
public GeometryInstanceFlagsKHR flags
9292
{
9393
[MethodImpl(MethodImplOptions.AggressiveInlining)]
9494
readonly get { return (Bitfield2 >> 24) & 0xFFu; }

sources/Vulkan/Vulkan/Vulkan/PFNVkDebugReportCallbackEXT.gen.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Silk.NET.Vulkan;
1313
{
1414
private readonly void* Pointer;
1515
public delegate* unmanaged<
16-
uint,
16+
DebugReportFlagsEXT,
1717
DebugReportObjectTypeEXT,
1818
ulong,
1919
nuint,
@@ -23,7 +23,7 @@ public delegate* unmanaged<
2323
void*,
2424
MaybeBool<uint>> Handle =>
2525
(delegate* unmanaged<
26-
uint,
26+
DebugReportFlagsEXT,
2727
DebugReportObjectTypeEXT,
2828
ulong,
2929
nuint,
@@ -35,7 +35,7 @@ public delegate* unmanaged<
3535

3636
public PFNVkDebugReportCallbackEXT(
3737
delegate* unmanaged<
38-
uint,
38+
DebugReportFlagsEXT,
3939
DebugReportObjectTypeEXT,
4040
ulong,
4141
nuint,
@@ -53,7 +53,7 @@ public PFNVkDebugReportCallbackEXT(PFNVkDebugReportCallbackEXTDelegate proc) =>
5353

5454
public static implicit operator PFNVkDebugReportCallbackEXT(
5555
delegate* unmanaged<
56-
uint,
56+
DebugReportFlagsEXT,
5757
DebugReportObjectTypeEXT,
5858
ulong,
5959
nuint,
@@ -65,7 +65,7 @@ MaybeBool<uint>> pfn
6565
) => new(pfn);
6666

6767
public static implicit operator delegate* unmanaged<
68-
uint,
68+
DebugReportFlagsEXT,
6969
DebugReportObjectTypeEXT,
7070
ulong,
7171
nuint,
@@ -75,7 +75,7 @@ public static implicit operator delegate* unmanaged<
7575
void*,
7676
MaybeBool<uint>>(PFNVkDebugReportCallbackEXT pfn) =>
7777
(delegate* unmanaged<
78-
uint,
78+
DebugReportFlagsEXT,
7979
DebugReportObjectTypeEXT,
8080
ulong,
8181
nuint,

sources/Vulkan/Vulkan/Vulkan/PFNVkDebugReportCallbackEXTDelegate.gen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace Silk.NET.Vulkan;
1111

1212
public unsafe delegate MaybeBool<uint> PFNVkDebugReportCallbackEXTDelegate(
13-
uint arg0,
13+
DebugReportFlagsEXT arg0,
1414
DebugReportObjectTypeEXT arg1,
1515
ulong arg2,
1616
nuint arg3,

sources/Vulkan/Vulkan/Vulkan/PFNVkDebugUtilsMessengerCallbackEXT.gen.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ namespace Silk.NET.Vulkan;
1414
private readonly void* Pointer;
1515
public delegate* unmanaged<
1616
DebugUtilsMessageSeverityFlagsEXT,
17-
uint,
17+
DebugUtilsMessageTypeFlagsEXT,
1818
DebugUtilsMessengerCallbackDataEXT*,
1919
void*,
2020
MaybeBool<uint>> Handle =>
2121
(delegate* unmanaged<
2222
DebugUtilsMessageSeverityFlagsEXT,
23-
uint,
23+
DebugUtilsMessageTypeFlagsEXT,
2424
DebugUtilsMessengerCallbackDataEXT*,
2525
void*,
2626
MaybeBool<uint>>)Pointer;
2727

2828
public PFNVkDebugUtilsMessengerCallbackEXT(
2929
delegate* unmanaged<
3030
DebugUtilsMessageSeverityFlagsEXT,
31-
uint,
31+
DebugUtilsMessageTypeFlagsEXT,
3232
DebugUtilsMessengerCallbackDataEXT*,
3333
void*,
3434
MaybeBool<uint>> ptr
@@ -42,21 +42,21 @@ public PFNVkDebugUtilsMessengerCallbackEXT(PFNVkDebugUtilsMessengerCallbackEXTDe
4242
public static implicit operator PFNVkDebugUtilsMessengerCallbackEXT(
4343
delegate* unmanaged<
4444
DebugUtilsMessageSeverityFlagsEXT,
45-
uint,
45+
DebugUtilsMessageTypeFlagsEXT,
4646
DebugUtilsMessengerCallbackDataEXT*,
4747
void*,
4848
MaybeBool<uint>> pfn
4949
) => new(pfn);
5050

5151
public static implicit operator delegate* unmanaged<
5252
DebugUtilsMessageSeverityFlagsEXT,
53-
uint,
53+
DebugUtilsMessageTypeFlagsEXT,
5454
DebugUtilsMessengerCallbackDataEXT*,
5555
void*,
5656
MaybeBool<uint>>(PFNVkDebugUtilsMessengerCallbackEXT pfn) =>
5757
(delegate* unmanaged<
5858
DebugUtilsMessageSeverityFlagsEXT,
59-
uint,
59+
DebugUtilsMessageTypeFlagsEXT,
6060
DebugUtilsMessengerCallbackDataEXT*,
6161
void*,
6262
MaybeBool<uint>>)

sources/Vulkan/Vulkan/Vulkan/PFNVkDebugUtilsMessengerCallbackEXTDelegate.gen.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan;
1111

1212
public unsafe delegate MaybeBool<uint> PFNVkDebugUtilsMessengerCallbackEXTDelegate(
1313
DebugUtilsMessageSeverityFlagsEXT arg0,
14-
uint arg1,
14+
DebugUtilsMessageTypeFlagsEXT arg1,
1515
DebugUtilsMessengerCallbackDataEXT* arg2,
1616
void* arg3
1717
);

0 commit comments

Comments
 (0)