From 3ac76f258d209fac27c5b0b8e279597930fc0f8d Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 24 Mar 2026 05:59:22 -0400 Subject: [PATCH 01/36] Update OpenAL name overrides to match the 2 character acronym threshold used by other bindings The default acronym threshold was changed during https://github.com/Exanite/Silk.NET/pull/29, which was merged as part of https://github.com/dotnet/Silk.NET/pull/2503. --- .silktouch/openal-clangsharp.stout | Bin 40930 -> 40930 bytes generator.json | 6 +- sources/OpenAL/OpenAL/al/AL.gen.cs | 144 ++++++++++++++-------------- sources/OpenAL/OpenAL/al/IAL.gen.cs | 32 +++---- 4 files changed, 89 insertions(+), 93 deletions(-) diff --git a/.silktouch/openal-clangsharp.stout b/.silktouch/openal-clangsharp.stout index 994e242e2efd57c2406b742af54a623bbb358c0a..c00c2aa9e0f1c3c73c6201b020f40b5d4199cb19 100644 GIT binary patch delta 83 zcmaE~pXt$lCf)#VW)=|!CJqh;4*iOayuLBaKzeg*%mgMd<3rpG2%|eu+!iDl( XI?o;?Gx_ buffers SupportedApiProfile("al", ["AL_EXT_direct_context"]), SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] - public static extern int EAXGetBufferModeDirect( + public static extern int EaxGetBufferModeDirect( ContextHandle context, uint buffer, int* pReserved @@ -8218,7 +8218,7 @@ public static extern int EAXGetBufferModeDirect( [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXGetBufferModeDirect( + public static int EaxGetBufferModeDirect( ContextHandle context, uint buffer, Ref pReserved @@ -8226,7 +8226,7 @@ Ref pReserved { fixed (int* __dsl_pReserved = pReserved) { - return (int)EAXGetBufferModeDirect(context, buffer, __dsl_pReserved); + return (int)EaxGetBufferModeDirect(context, buffer, __dsl_pReserved); } } @@ -8236,7 +8236,7 @@ Ref pReserved SupportedApiProfile("al", ["AL_EXT_direct_context"]), SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] - public static extern int EAXGetDirect( + public static extern int EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -8254,7 +8254,7 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXGetDirect( + public static int EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -8266,7 +8266,7 @@ uint value_size fixed (void* __dsl_value = value) fixed (System.Guid* __dsl_property_set_id = property_set_id) { - return (int)EAXGetDirect( + return (int)EaxGetDirect( context, __dsl_property_set_id, property_id, @@ -8283,7 +8283,7 @@ uint value_size SupportedApiProfile("al", ["AL_EXT_direct_context"]), SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] - public static extern sbyte EAXSetBufferModeDirect( + public static extern sbyte EaxSetBufferModeDirect( ContextHandle context, int n, uint* buffers, @@ -8299,7 +8299,7 @@ int value [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static MaybeBool EAXSetBufferModeDirect( + public static MaybeBool EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, @@ -8309,7 +8309,7 @@ int value fixed (uint* __dsl_buffers = buffers) { return (MaybeBool) - (sbyte)EAXSetBufferModeDirect(context, n, __dsl_buffers, value); + (sbyte)EaxSetBufferModeDirect(context, n, __dsl_buffers, value); } } @@ -8319,7 +8319,7 @@ int value SupportedApiProfile("al", ["AL_EXT_direct_context"]), SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] - public static extern int EAXSetDirect( + public static extern int EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -8337,7 +8337,7 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXSetDirect( + public static int EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -8349,7 +8349,7 @@ uint value_size fixed (void* __dsl_value = value) fixed (System.Guid* __dsl_property_set_id = property_set_id) { - return (int)EAXSetDirect( + return (int)EaxSetDirect( context, __dsl_property_set_id, property_id, @@ -16286,8 +16286,8 @@ public void SpeedOfSoundDirect(ContextHandle context, float value) => [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public int EAXGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved) => - T.EAXGetBufferModeDirect(context, buffer, pReserved); + public int EaxGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved) => + T.EaxGetBufferModeDirect(context, buffer, pReserved); [NativeName("EAXGetBufferModeDirect")] [ @@ -16298,8 +16298,8 @@ public int EAXGetBufferModeDirect(ContextHandle context, uint buffer, int* pRese [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public int EAXGetBufferModeDirect(ContextHandle context, uint buffer, Ref pReserved) => - T.EAXGetBufferModeDirect(context, buffer, pReserved); + public int EaxGetBufferModeDirect(ContextHandle context, uint buffer, Ref pReserved) => + T.EaxGetBufferModeDirect(context, buffer, pReserved); [NativeName("EAXGetDirect")] [ @@ -16310,14 +16310,14 @@ public int EAXGetBufferModeDirect(ContextHandle context, uint buffer, Ref p [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public int EAXGetDirect( + public int EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, uint source_id, void* value, uint value_size - ) => T.EAXGetDirect(context, property_set_id, property_id, source_id, value, value_size); + ) => T.EaxGetDirect(context, property_set_id, property_id, source_id, value, value_size); [NativeName("EAXGetDirect")] [ @@ -16328,14 +16328,14 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public int EAXGetDirect( + public int EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, uint source_id, Ref value, uint value_size - ) => T.EAXGetDirect(context, property_set_id, property_id, source_id, value, value_size); + ) => T.EaxGetDirect(context, property_set_id, property_id, source_id, value, value_size); [NativeName("EAXSetBufferModeDirect")] [ @@ -16346,12 +16346,12 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public sbyte EAXSetBufferModeDirect( + public sbyte EaxSetBufferModeDirect( ContextHandle context, int n, uint* buffers, int value - ) => T.EAXSetBufferModeDirect(context, n, buffers, value); + ) => T.EaxSetBufferModeDirect(context, n, buffers, value); [NativeName("EAXSetBufferModeDirect")] [ @@ -16362,12 +16362,12 @@ int value [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public MaybeBool EAXSetBufferModeDirect( + public MaybeBool EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, int value - ) => T.EAXSetBufferModeDirect(context, n, buffers, value); + ) => T.EaxSetBufferModeDirect(context, n, buffers, value); [NativeName("EAXSetDirect")] [ @@ -16378,14 +16378,14 @@ int value [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public int EAXSetDirect( + public int EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, uint source_id, void* value, uint value_size - ) => T.EAXSetDirect(context, property_set_id, property_id, source_id, value, value_size); + ) => T.EaxSetDirect(context, property_set_id, property_id, source_id, value, value_size); [NativeName("EAXSetDirect")] [ @@ -16396,14 +16396,14 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public int EAXSetDirect( + public int EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, uint source_id, Ref value, uint value_size - ) => T.EAXSetDirect(context, property_set_id, property_id, source_id, value, value_size); + ) => T.EaxSetDirect(context, property_set_id, property_id, source_id, value, value_size); } public partial class ThisThread @@ -25946,11 +25946,11 @@ public static void SpeedOfSoundDirect(ContextHandle context, float value) => [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXGetBufferModeDirect( + public static int EaxGetBufferModeDirect( ContextHandle context, uint buffer, int* pReserved - ) => Underlying.Value!.EAXGetBufferModeDirect(context, buffer, pReserved); + ) => Underlying.Value!.EaxGetBufferModeDirect(context, buffer, pReserved); [NativeName("EAXGetBufferModeDirect")] [ @@ -25961,7 +25961,7 @@ public static int EAXGetBufferModeDirect( [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXGetBufferModeDirect( + public static int EaxGetBufferModeDirect( ContextHandle context, uint buffer, Ref pReserved @@ -25969,7 +25969,7 @@ Ref pReserved { fixed (int* __dsl_pReserved = pReserved) { - return (int)EAXGetBufferModeDirect(context, buffer, __dsl_pReserved); + return (int)EaxGetBufferModeDirect(context, buffer, __dsl_pReserved); } } @@ -25982,7 +25982,7 @@ Ref pReserved [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXGetDirect( + public static int EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -25990,7 +25990,7 @@ public static int EAXGetDirect( void* value, uint value_size ) => - Underlying.Value!.EAXGetDirect( + Underlying.Value!.EaxGetDirect( context, property_set_id, property_id, @@ -26008,7 +26008,7 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXGetDirect( + public static int EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -26020,7 +26020,7 @@ uint value_size fixed (void* __dsl_value = value) fixed (System.Guid* __dsl_property_set_id = property_set_id) { - return (int)EAXGetDirect( + return (int)EaxGetDirect( context, __dsl_property_set_id, property_id, @@ -26040,12 +26040,12 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static sbyte EAXSetBufferModeDirect( + public static sbyte EaxSetBufferModeDirect( ContextHandle context, int n, uint* buffers, int value - ) => Underlying.Value!.EAXSetBufferModeDirect(context, n, buffers, value); + ) => Underlying.Value!.EaxSetBufferModeDirect(context, n, buffers, value); [NativeName("EAXSetBufferModeDirect")] [ @@ -26056,7 +26056,7 @@ int value [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static MaybeBool EAXSetBufferModeDirect( + public static MaybeBool EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, @@ -26066,7 +26066,7 @@ int value fixed (uint* __dsl_buffers = buffers) { return (MaybeBool) - (sbyte)EAXSetBufferModeDirect(context, n, __dsl_buffers, value); + (sbyte)EaxSetBufferModeDirect(context, n, __dsl_buffers, value); } } @@ -26079,7 +26079,7 @@ int value [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXSetDirect( + public static int EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -26087,7 +26087,7 @@ public static int EAXSetDirect( void* value, uint value_size ) => - Underlying.Value!.EAXSetDirect( + Underlying.Value!.EaxSetDirect( context, property_set_id, property_id, @@ -26105,7 +26105,7 @@ uint value_size [MethodImpl( MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization )] - public static int EAXSetDirect( + public static int EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -26117,7 +26117,7 @@ uint value_size fixed (void* __dsl_value = value) fixed (System.Guid* __dsl_property_set_id = property_set_id) { - return (int)EAXSetDirect( + return (int)EaxSetDirect( context, __dsl_property_set_id, property_id, @@ -42711,7 +42711,7 @@ public static void SpeedOfSoundDirect(ContextHandle context, float value) => ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - int IAL.EAXGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved) => + int IAL.EaxGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved) => ( (delegate* unmanaged)( _slots[293] is not null and var loadedFnPtr @@ -42727,8 +42727,8 @@ _slots[293] is not null and var loadedFnPtr ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static int EAXGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved) => - ThisThread.EAXGetBufferModeDirect(context, buffer, pReserved); + public static int EaxGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved) => + ThisThread.EaxGetBufferModeDirect(context, buffer, pReserved); [NativeName("EAXGetBufferModeDirect")] [ @@ -42737,11 +42737,11 @@ public static int EAXGetBufferModeDirect(ContextHandle context, uint buffer, int ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - int IAL.EAXGetBufferModeDirect(ContextHandle context, uint buffer, Ref pReserved) + int IAL.EaxGetBufferModeDirect(ContextHandle context, uint buffer, Ref pReserved) { fixed (int* __dsl_pReserved = pReserved) { - return (int)((IAL)this).EAXGetBufferModeDirect(context, buffer, __dsl_pReserved); + return (int)((IAL)this).EaxGetBufferModeDirect(context, buffer, __dsl_pReserved); } } @@ -42752,11 +42752,11 @@ int IAL.EAXGetBufferModeDirect(ContextHandle context, uint buffer, Ref pRes ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static int EAXGetBufferModeDirect( + public static int EaxGetBufferModeDirect( ContextHandle context, uint buffer, Ref pReserved - ) => ThisThread.EAXGetBufferModeDirect(context, buffer, pReserved); + ) => ThisThread.EaxGetBufferModeDirect(context, buffer, pReserved); [NativeName("EAXGetDirect")] [ @@ -42765,7 +42765,7 @@ Ref pReserved ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - int IAL.EAXGetDirect( + int IAL.EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -42788,7 +42788,7 @@ _slots[294] is not null and var loadedFnPtr ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static int EAXGetDirect( + public static int EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -42796,7 +42796,7 @@ public static int EAXGetDirect( void* value, uint value_size ) => - ThisThread.EAXGetDirect( + ThisThread.EaxGetDirect( context, property_set_id, property_id, @@ -42812,7 +42812,7 @@ uint value_size ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - int IAL.EAXGetDirect( + int IAL.EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -42825,7 +42825,7 @@ uint value_size fixed (System.Guid* __dsl_property_set_id = property_set_id) { return (int) - ((IAL)this).EAXGetDirect( + ((IAL)this).EaxGetDirect( context, __dsl_property_set_id, property_id, @@ -42843,7 +42843,7 @@ uint value_size ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static int EAXGetDirect( + public static int EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -42851,7 +42851,7 @@ public static int EAXGetDirect( Ref value, uint value_size ) => - ThisThread.EAXGetDirect( + ThisThread.EaxGetDirect( context, property_set_id, property_id, @@ -42867,7 +42867,7 @@ uint value_size ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - sbyte IAL.EAXSetBufferModeDirect(ContextHandle context, int n, uint* buffers, int value) => + sbyte IAL.EaxSetBufferModeDirect(ContextHandle context, int n, uint* buffers, int value) => ( (delegate* unmanaged)( _slots[295] is not null and var loadedFnPtr @@ -42883,12 +42883,12 @@ _slots[295] is not null and var loadedFnPtr ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static sbyte EAXSetBufferModeDirect( + public static sbyte EaxSetBufferModeDirect( ContextHandle context, int n, uint* buffers, int value - ) => ThisThread.EAXSetBufferModeDirect(context, n, buffers, value); + ) => ThisThread.EaxSetBufferModeDirect(context, n, buffers, value); [NativeName("EAXSetBufferModeDirect")] [ @@ -42897,7 +42897,7 @@ int value ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - MaybeBool IAL.EAXSetBufferModeDirect( + MaybeBool IAL.EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, @@ -42907,7 +42907,7 @@ int value fixed (uint* __dsl_buffers = buffers) { return (MaybeBool) - (sbyte)((IAL)this).EAXSetBufferModeDirect(context, n, __dsl_buffers, value); + (sbyte)((IAL)this).EaxSetBufferModeDirect(context, n, __dsl_buffers, value); } } @@ -42918,12 +42918,12 @@ int value ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static MaybeBool EAXSetBufferModeDirect( + public static MaybeBool EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, int value - ) => ThisThread.EAXSetBufferModeDirect(context, n, buffers, value); + ) => ThisThread.EaxSetBufferModeDirect(context, n, buffers, value); [NativeName("EAXSetDirect")] [ @@ -42932,7 +42932,7 @@ int value ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - int IAL.EAXSetDirect( + int IAL.EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -42955,7 +42955,7 @@ _slots[296] is not null and var loadedFnPtr ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static int EAXSetDirect( + public static int EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -42963,7 +42963,7 @@ public static int EAXSetDirect( void* value, uint value_size ) => - ThisThread.EAXSetDirect( + ThisThread.EaxSetDirect( context, property_set_id, property_id, @@ -42979,7 +42979,7 @@ uint value_size ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - int IAL.EAXSetDirect( + int IAL.EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -42992,7 +42992,7 @@ uint value_size fixed (System.Guid* __dsl_property_set_id = property_set_id) { return (int) - ((IAL)this).EAXSetDirect( + ((IAL)this).EaxSetDirect( context, __dsl_property_set_id, property_id, @@ -43010,7 +43010,7 @@ uint value_size ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static int EAXSetDirect( + public static int EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -43018,7 +43018,7 @@ public static int EAXSetDirect( Ref value, uint value_size ) => - ThisThread.EAXSetDirect( + ThisThread.EaxSetDirect( context, property_set_id, property_id, diff --git a/sources/OpenAL/OpenAL/al/IAL.gen.cs b/sources/OpenAL/OpenAL/al/IAL.gen.cs index 669d756827..8d198744cf 100644 --- a/sources/OpenAL/OpenAL/al/IAL.gen.cs +++ b/sources/OpenAL/OpenAL/al/IAL.gen.cs @@ -6027,7 +6027,7 @@ Ref buffers SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] - static abstract int EAXGetBufferModeDirect( + static abstract int EaxGetBufferModeDirect( ContextHandle context, uint buffer, int* pReserved @@ -6039,7 +6039,7 @@ static abstract int EAXGetBufferModeDirect( SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] - static abstract int EAXGetBufferModeDirect( + static abstract int EaxGetBufferModeDirect( ContextHandle context, uint buffer, Ref pReserved @@ -6051,7 +6051,7 @@ Ref pReserved SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] - static abstract int EAXGetDirect( + static abstract int EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -6066,7 +6066,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] - static abstract int EAXGetDirect( + static abstract int EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -6081,7 +6081,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] - static abstract sbyte EAXSetBufferModeDirect( + static abstract sbyte EaxSetBufferModeDirect( ContextHandle context, int n, uint* buffers, @@ -6094,7 +6094,7 @@ int value SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] - static abstract MaybeBool EAXSetBufferModeDirect( + static abstract MaybeBool EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, @@ -6107,7 +6107,7 @@ int value SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] - static abstract int EAXSetDirect( + static abstract int EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -6122,7 +6122,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] - static abstract int EAXSetDirect( + static abstract int EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -11433,7 +11433,7 @@ long start_time SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] - int EAXGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved); + int EaxGetBufferModeDirect(ContextHandle context, uint buffer, int* pReserved); [NativeName("EAXGetBufferModeDirect")] [ @@ -11441,7 +11441,7 @@ long start_time SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetBufferModeDirect")] - int EAXGetBufferModeDirect(ContextHandle context, uint buffer, Ref pReserved); + int EaxGetBufferModeDirect(ContextHandle context, uint buffer, Ref pReserved); [NativeName("EAXGetDirect")] [ @@ -11449,7 +11449,7 @@ long start_time SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] - int EAXGetDirect( + int EaxGetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -11464,7 +11464,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXGetDirect")] - int EAXGetDirect( + int EaxGetDirect( ContextHandle context, Ref property_set_id, uint property_id, @@ -11479,7 +11479,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] - sbyte EAXSetBufferModeDirect(ContextHandle context, int n, uint* buffers, int value); + sbyte EaxSetBufferModeDirect(ContextHandle context, int n, uint* buffers, int value); [NativeName("EAXSetBufferModeDirect")] [ @@ -11487,7 +11487,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetBufferModeDirect")] - MaybeBool EAXSetBufferModeDirect( + MaybeBool EaxSetBufferModeDirect( ContextHandle context, int n, Ref buffers, @@ -11500,7 +11500,7 @@ int value SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] - int EAXSetDirect( + int EaxSetDirect( ContextHandle context, System.Guid* property_set_id, uint property_id, @@ -11515,7 +11515,7 @@ uint value_size SupportedApiProfile("alc", ["AL_EXT_direct_context"]) ] [NativeFunction("openal", EntryPoint = "EAXSetDirect")] - int EAXSetDirect( + int EaxSetDirect( ContextHandle context, Ref property_set_id, uint property_id, From 634e7361d5b5c79e6af63bc97d7151bde076f8cf Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 24 Mar 2026 06:36:01 -0400 Subject: [PATCH 02/36] Start of feature/nested-struct-name-affixes branch From 35f0f5961d45778951f85dbbfc326f5de6635beb Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 25 Mar 2026 10:46:51 -0400 Subject: [PATCH 03/36] Cleanup leftover return statement --- sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs index 5e958705c6..9f4e8782aa 100644 --- a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs +++ b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs @@ -165,8 +165,6 @@ [new PointerDimensionReductionTransformer()], } ctx.SourceProject = project; - - return; } private class MissingHandleTypeDiscoverer( From cd2ccfd4f7ac0ec5c36e69a207a3b694e2509660 Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 25 Mar 2026 11:16:48 -0400 Subject: [PATCH 04/36] Split TransformHandles into two mods --- generator.json | 6 +- .../SilkTouch/Mods/Common/ModLoader.cs | 1 + .../SilkTouch/Mods/ExtractHandles.cs | 324 ++++++++++++++++++ .../SilkTouch/Mods/TransformHandles.cs | 306 +---------------- 4 files changed, 329 insertions(+), 308 deletions(-) create mode 100644 sources/SilkTouch/SilkTouch/Mods/ExtractHandles.cs diff --git a/generator.json b/generator.json index 8bbae05cda..2831592107 100644 --- a/generator.json +++ b/generator.json @@ -42,6 +42,7 @@ "AddIncludes", "ClangScraper", "MarkNativeNames", + "ExtractHandles", "ExtractNestedTyping", "TransformHandles", "TransformFunctions", @@ -59,7 +60,6 @@ "InputTestRoot": "tests/SDL" }, "TransformHandles": { - "AssumeMissingTypesOpaque": true, "UseDSL": true }, "TransformFunctions": { @@ -228,6 +228,7 @@ "ChangeNativeClass", "AddApiProfiles", "MixKhronosData", + "ExtractHandles", "ExtractNestedTyping", "TransformHandles", "InterceptNativeFunctions", @@ -351,7 +352,6 @@ "BenefitOfTheDoubtArrayTransformation": true }, "TransformHandles": { - "AssumeMissingTypesOpaque": true, "UseDSL": true }, "StripAttributes": { @@ -370,6 +370,7 @@ "AddIncludes", "ClangScraper", "MarkNativeNames", + "ExtractHandles", "ExtractNestedTyping", "TransformHandles", "MixKhronosData", @@ -423,7 +424,6 @@ } }, "TransformHandles": { - "AssumeMissingTypesOpaque": true, "UseDSL": true }, "PrettifyNames": { diff --git a/sources/SilkTouch/SilkTouch/Mods/Common/ModLoader.cs b/sources/SilkTouch/SilkTouch/Mods/Common/ModLoader.cs index 8556bd7539..1f454cb49b 100644 --- a/sources/SilkTouch/SilkTouch/Mods/Common/ModLoader.cs +++ b/sources/SilkTouch/SilkTouch/Mods/Common/ModLoader.cs @@ -25,6 +25,7 @@ public class ModLoader nameof(BakeSourceSets) => typeof(BakeSourceSets), nameof(AddApiProfiles) => typeof(AddApiProfiles), nameof(MixKhronosData) => typeof(MixKhronosData), + nameof(ExtractHandles) => typeof(ExtractHandles), nameof(TransformHandles) => typeof(TransformHandles), nameof(TransformEnums) => typeof(TransformEnums), nameof(ExtractNestedTyping) => typeof(ExtractNestedTyping), diff --git a/sources/SilkTouch/SilkTouch/Mods/ExtractHandles.cs b/sources/SilkTouch/SilkTouch/Mods/ExtractHandles.cs new file mode 100644 index 0000000000..d1018b9caf --- /dev/null +++ b/sources/SilkTouch/SilkTouch/Mods/ExtractHandles.cs @@ -0,0 +1,324 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.Extensions.Logging; +using Silk.NET.SilkTouch.Naming; +using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; + +namespace Silk.NET.SilkTouch.Mods; + +/// +/// Adds empty handle structs by searching for missing types referenced through pointers. +/// If all references to the missing type are through a pointer, +/// that missing type is then added as an empty struct. +/// +/// See for applying further transformations. +/// +public class ExtractHandles(ILogger logger) : Mod +{ + /// + public override async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) + { + await base.ExecuteAsync(ctx, ct); + + var project = ctx.SourceProject; + if (project == null) + { + return; + } + + var compilation = await project.GetCompilationAsync(ct); + if (compilation == null) + { + throw new InvalidOperationException("Failed to get compilation"); + } + + // Find missing handle types + var handleDiscoverer = new MissingHandleTypeDiscoverer(logger, compilation, ct); + var missingHandleTypes = handleDiscoverer.GetMissingHandleTypes(); + + // Generate syntax nodes containing empty structs to represent the missing handle types + var structGenerator = new EmptyStructGenerator(); + var syntaxNodes = structGenerator.GenerateSyntaxNodes(missingHandleTypes); + + // Add syntax nodes to the project as new documents + foreach (var (fullyQualifiedName, node) in syntaxNodes) + { + var relativePath = $"Handles/{PathForFullyQualified(fullyQualifiedName)}"; + project = project + .AddDocument( + Path.GetFileName(relativePath), + node.NormalizeWhitespace(), + filePath: project.FullPath(relativePath) + ) + .Project; + } + + ctx.SourceProject = project; + } + + private class MissingHandleTypeDiscoverer( + ILogger logger, + Compilation compilation, + CancellationToken ct + ) : SymbolVisitor + { + private readonly HashSet _nonHandleTypes = + new(SymbolEqualityComparer.Default); + private readonly Dictionary _missingTypes = + new(SymbolEqualityComparer.Default); + + private string? _currentNamespace = null; + private int _pointerTypeDepth = 0; + + /// + /// Gets all missing handle types that are found and the namespace that they should be created in. + /// + public Dictionary GetMissingHandleTypes() + { + // We need to find and generate all missing handle types + // Handle types are types that are only referenced through a pointer + // We do this by parsing through the list of type errors + var typeErrors = compilation + .GetDiagnostics(ct) + .Where(d => d.Id == "CS0246") // Type errors + .ToList(); + + // Find symbols that contain ITypeErrorSymbols + // These symbols are not necessarily ITypeErrorSymbols + var symbolsFound = new HashSet(SymbolEqualityComparer.Default); + foreach (var typeError in typeErrors) + { + var syntaxTree = typeError.Location.SourceTree; + if (syntaxTree == null) + { + continue; + } + + var semanticModel = compilation.GetSemanticModel(syntaxTree); + + // Get the syntax node the type error corresponds to + var currentSyntax = syntaxTree.GetRoot().FindNode(typeError.Location.SourceSpan); + + // Search upwards to find a syntax node that we can call GetDeclaredSymbol on + // This is because calling GetDeclaredSymbol on the starting node will just return null + var isSuccess = false; + while (currentSyntax != null && currentSyntax is not TypeDeclarationSyntax) + { + switch (currentSyntax) + { + case VariableDeclarationSyntax variableDeclarationSyntax: + { + foreach (var declaratorSyntax in variableDeclarationSyntax.Variables) + { + var symbol = semanticModel.GetDeclaredSymbol(declaratorSyntax, ct); + if (symbol != null) + { + symbolsFound.Add(symbol); + isSuccess = true; + + // All of the declarators will have the same type, so getting the first symbol is enough + break; + } + } + + break; + } + case MemberDeclarationSyntax memberDeclarationSyntax: + { + var symbol = semanticModel.GetDeclaredSymbol( + memberDeclarationSyntax, + ct + ); + if (symbol != null) + { + symbolsFound.Add(symbol); + isSuccess = true; + } + + break; + } + // Skip syntaxes that will never contain handle types + case BaseTypeSyntax: + case AttributeSyntax: + { + isSuccess = true; + break; + } + } + + currentSyntax = currentSyntax.Parent; + } + + if (!isSuccess) + { + // This is to warn of unhandled cases + logger.LogWarning( + "Failed to find corresponding symbol for type error. There may be an unhandled case in the code" + ); + } + } + + // These symbols contain at least one IErrorTypeSymbol, we need to search downwards for them + foreach (var symbol in symbolsFound) + { + Visit(symbol); + } + + return new Dictionary( + _missingTypes.Where(kvp => !_nonHandleTypes.Contains(kvp.Key)), + SymbolEqualityComparer.Default + ); + } + + public override void VisitMethod(IMethodSymbol symbol) + { + base.VisitMethod(symbol); + + _currentNamespace = symbol.NamespaceFromSymbol(); + foreach (var parameterSymbol in symbol.Parameters) + { + Visit(parameterSymbol); + } + _currentNamespace = null; + } + + public override void VisitParameter(IParameterSymbol symbol) + { + base.VisitParameter(symbol); + + _currentNamespace = symbol.NamespaceFromSymbol(); + Visit(symbol.Type); + _currentNamespace = null; + } + + public override void VisitProperty(IPropertySymbol symbol) + { + base.VisitProperty(symbol); + + _currentNamespace = symbol.NamespaceFromSymbol(); + Visit(symbol.Type); + _currentNamespace = null; + } + + public override void VisitField(IFieldSymbol symbol) + { + base.VisitField(symbol); + + _currentNamespace = symbol.NamespaceFromSymbol(); + Visit(symbol.Type); + _currentNamespace = null; + } + + public override void VisitLocal(ILocalSymbol symbol) + { + base.VisitLocal(symbol); + + _currentNamespace = symbol.NamespaceFromSymbol(); + Visit(symbol.Type); + _currentNamespace = null; + } + + public override void VisitPointerType(IPointerTypeSymbol symbol) + { + base.VisitPointerType(symbol); + + _pointerTypeDepth++; + Visit(symbol.PointedAtType); + _pointerTypeDepth--; + } + + public override void VisitNamedType(INamedTypeSymbol symbol) + { + base.VisitNamedType(symbol); + + if (symbol is IErrorTypeSymbol errorTypeSymbol) + { + if (_currentNamespace == null) + { + throw new InvalidOperationException( + $"{nameof(_currentNamespace)} should not be null" + ); + } + + if (_pointerTypeDepth == 0) + { + _nonHandleTypes.Add(errorTypeSymbol); + } + + if (_missingTypes.TryGetValue(errorTypeSymbol, out var sharedNamespace)) + { + _missingTypes[errorTypeSymbol] = NameUtils + .FindCommonPrefix([sharedNamespace, _currentNamespace], true, false, true) + .Trim('.'); + } + else + { + _missingTypes[errorTypeSymbol] = _currentNamespace; + } + } + } + } + + private class EmptyStructGenerator + { + /// + /// Generates a syntax node for each specified type. + /// + /// Map from error type symbol to the namespace the type should be created in. + /// Map from the fully qualified name of the generated type to the syntax node containing code for that type. + public Dictionary GenerateSyntaxNodes( + Dictionary typesToGenerate + ) => + GenerateSyntaxNodes( + typesToGenerate + .Select(kvp => new KeyValuePair(kvp.Key.Name, kvp.Value)) + .ToDictionary() + ); + + /// + /// Generates a syntax node for each specified type. + /// + /// Map from type name to the namespace the type should be created in. + /// Map from the fully qualified name of the generated type to the syntax node containing code for that type. + public Dictionary GenerateSyntaxNodes( + Dictionary missingHandleTypes + ) + { + var results = new Dictionary(); + foreach (var (name, ns) in missingHandleTypes) + { + var fullyQualifiedName = string.IsNullOrWhiteSpace(ns) ? name : $"{ns}.{name}"; + var structDeclarationSyntax = StructDeclaration(name) + .WithModifiers( + TokenList( + Token(SyntaxKind.PublicKeyword), + Token(SyntaxKind.UnsafeKeyword), + Token(SyntaxKind.PartialKeyword) + ) + ); + + results[fullyQualifiedName] = CompilationUnit() + .WithMembers( + SingletonList( + string.IsNullOrWhiteSpace(ns) + ? structDeclarationSyntax + : FileScopedNamespaceDeclaration( + ModUtils.NamespaceIntoIdentifierName(ns) + ) + .WithMembers( + SingletonList( + structDeclarationSyntax + ) + ) + ) + ); + } + + return results; + } + } +} diff --git a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs index 9f4e8782aa..fb57d9db1f 100644 --- a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs +++ b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs @@ -25,11 +25,6 @@ namespace Silk.NET.SilkTouch.Mods; /// VkBuffer*, usages of that pointer will be replaced by VkBufferHandle. For a 2-dimensional pointer, /// VkBuffer**, the resulting replacement is VkBufferHandle*. /// -/// -/// It is assumed that all handle types in the generated syntax do not require a using directive in order to be -/// in scope. That is, if a file with the namespace Silk.NET.OpenGL is encountered and it is referencing -/// Program, Program must be declared in Silk.NET.OpenGL, Silk.NET, or Silk. -/// [ModConfiguration] public class TransformHandles( IOptionsSnapshot config, @@ -41,12 +36,6 @@ ILogger logger /// public class Config { - /// - /// Whether it should be assumed that missing types are likely opaque if they are only used as a pointer type - /// and therefore should be subjected to handle transformations. - /// - public bool AssumeMissingTypesOpaque { get; init; } - /// /// Whether the DSL (i.e. nullptr) should be usable with handle types. /// @@ -58,6 +47,7 @@ public override async Task ExecuteAsync(IModContext ctx, CancellationToken ct = { await base.ExecuteAsync(ctx, ct); + var cfg = config.Get(ctx.JobKey); var project = ctx.SourceProject; if (project == null) { @@ -70,38 +60,6 @@ public override async Task ExecuteAsync(IModContext ctx, CancellationToken ct = throw new InvalidOperationException("Failed to get compilation"); } - var cfg = config.Get(ctx.JobKey); - if (cfg.AssumeMissingTypesOpaque) - { - // Find missing handle types - var handleDiscoverer = new MissingHandleTypeDiscoverer(logger, compilation, ct); - var missingHandleTypes = handleDiscoverer.GetMissingHandleTypes(); - - // Generate syntax nodes containing empty structs to represent the missing handle types - var structGenerator = new EmptyStructGenerator(); - var syntaxNodes = structGenerator.GenerateSyntaxNodes(missingHandleTypes); - - // Add syntax nodes to the project as new documents - foreach (var (fullyQualifiedName, node) in syntaxNodes) - { - var relativePath = $"Handles/{PathForFullyQualified(fullyQualifiedName)}"; - project = project - .AddDocument( - Path.GetFileName(relativePath), - node.NormalizeWhitespace(), - filePath: project.FullPath(relativePath) - ) - .Project; - } - - // Update compilation - compilation = await project.GetCompilationAsync(ct); - if (compilation == null) - { - throw new InvalidOperationException("Failed to get compilation"); - } - } - // Find handle documents var handleTypeDiscoverer = new HandleTypeDiscoverer(project, compilation, ct); var handleTypes = await handleTypeDiscoverer.GetHandleTypesAsync(); @@ -167,268 +125,6 @@ [new PointerDimensionReductionTransformer()], ctx.SourceProject = project; } - private class MissingHandleTypeDiscoverer( - ILogger logger, - Compilation compilation, - CancellationToken ct - ) : SymbolVisitor - { - private readonly HashSet _nonHandleTypes = - new(SymbolEqualityComparer.Default); - private readonly Dictionary _missingTypes = - new(SymbolEqualityComparer.Default); - - private string? _currentNamespace = null; - private int _pointerTypeDepth = 0; - - /// - /// Gets all missing handle types that are found and the namespace that they should be created in. - /// - public Dictionary GetMissingHandleTypes() - { - // We need to find and generate all missing handle types - // Handle types are types that are only referenced through a pointer - // We do this by parsing through the list of type errors - var typeErrors = compilation - .GetDiagnostics(ct) - .Where(d => d.Id == "CS0246") // Type errors - .ToList(); - - // Find symbols that contain ITypeErrorSymbols - // These symbols are not necessarily ITypeErrorSymbols - var symbolsFound = new HashSet(SymbolEqualityComparer.Default); - foreach (var typeError in typeErrors) - { - var syntaxTree = typeError.Location.SourceTree; - if (syntaxTree == null) - { - continue; - } - - var semanticModel = compilation.GetSemanticModel(syntaxTree); - - // Get the syntax node the type error corresponds to - var currentSyntax = syntaxTree.GetRoot().FindNode(typeError.Location.SourceSpan); - - // Search upwards to find a syntax node that we can call GetDeclaredSymbol on - // This is because calling GetDeclaredSymbol on the starting node will just return null - var isSuccess = false; - while (currentSyntax != null && currentSyntax is not TypeDeclarationSyntax) - { - switch (currentSyntax) - { - case VariableDeclarationSyntax variableDeclarationSyntax: - { - foreach (var declaratorSyntax in variableDeclarationSyntax.Variables) - { - var symbol = semanticModel.GetDeclaredSymbol(declaratorSyntax, ct); - if (symbol != null) - { - symbolsFound.Add(symbol); - isSuccess = true; - - // All of the declarators will have the same type, so getting the first symbol is enough - break; - } - } - - break; - } - case MemberDeclarationSyntax memberDeclarationSyntax: - { - var symbol = semanticModel.GetDeclaredSymbol( - memberDeclarationSyntax, - ct - ); - if (symbol != null) - { - symbolsFound.Add(symbol); - isSuccess = true; - } - - break; - } - // Skip syntaxes that will never contain handle types - case BaseTypeSyntax: - case AttributeSyntax: - { - isSuccess = true; - break; - } - } - - currentSyntax = currentSyntax.Parent; - } - - if (!isSuccess) - { - // This is to warn of unhandled cases - logger.LogWarning( - "Failed to find corresponding symbol for type error. There may be an unhandled case in the code" - ); - } - } - - // These symbols contain at least one IErrorTypeSymbol, we need to search downwards for them - foreach (var symbol in symbolsFound) - { - Visit(symbol); - } - - return new Dictionary( - _missingTypes.Where(kvp => !_nonHandleTypes.Contains(kvp.Key)), - SymbolEqualityComparer.Default - ); - } - - public override void VisitMethod(IMethodSymbol symbol) - { - base.VisitMethod(symbol); - - _currentNamespace = symbol.NamespaceFromSymbol(); - foreach (var parameterSymbol in symbol.Parameters) - { - Visit(parameterSymbol); - } - _currentNamespace = null; - } - - public override void VisitParameter(IParameterSymbol symbol) - { - base.VisitParameter(symbol); - - _currentNamespace = symbol.NamespaceFromSymbol(); - Visit(symbol.Type); - _currentNamespace = null; - } - - public override void VisitProperty(IPropertySymbol symbol) - { - base.VisitProperty(symbol); - - _currentNamespace = symbol.NamespaceFromSymbol(); - Visit(symbol.Type); - _currentNamespace = null; - } - - public override void VisitField(IFieldSymbol symbol) - { - base.VisitField(symbol); - - _currentNamespace = symbol.NamespaceFromSymbol(); - Visit(symbol.Type); - _currentNamespace = null; - } - - public override void VisitLocal(ILocalSymbol symbol) - { - base.VisitLocal(symbol); - - _currentNamespace = symbol.NamespaceFromSymbol(); - Visit(symbol.Type); - _currentNamespace = null; - } - - public override void VisitPointerType(IPointerTypeSymbol symbol) - { - base.VisitPointerType(symbol); - - _pointerTypeDepth++; - Visit(symbol.PointedAtType); - _pointerTypeDepth--; - } - - public override void VisitNamedType(INamedTypeSymbol symbol) - { - base.VisitNamedType(symbol); - - if (symbol is IErrorTypeSymbol errorTypeSymbol) - { - if (_currentNamespace == null) - { - throw new InvalidOperationException( - $"{nameof(_currentNamespace)} should not be null" - ); - } - - if (_pointerTypeDepth == 0) - { - _nonHandleTypes.Add(errorTypeSymbol); - } - - if (_missingTypes.TryGetValue(errorTypeSymbol, out var sharedNamespace)) - { - _missingTypes[errorTypeSymbol] = NameUtils - .FindCommonPrefix([sharedNamespace, _currentNamespace], true, false, true) - .Trim('.'); - } - else - { - _missingTypes[errorTypeSymbol] = _currentNamespace; - } - } - } - } - - private class EmptyStructGenerator - { - /// - /// Generates a syntax node for each specified type. - /// - /// Map from error type symbol to the namespace the type should be created in. - /// Map from the fully qualified name of the generated type to the syntax node containing code for that type. - public Dictionary GenerateSyntaxNodes( - Dictionary typesToGenerate - ) => - GenerateSyntaxNodes( - typesToGenerate - .Select(kvp => new KeyValuePair(kvp.Key.Name, kvp.Value)) - .ToDictionary() - ); - - /// - /// Generates a syntax node for each specified type. - /// - /// Map from type name to the namespace the type should be created in. - /// Map from the fully qualified name of the generated type to the syntax node containing code for that type. - public Dictionary GenerateSyntaxNodes( - Dictionary missingHandleTypes - ) - { - var results = new Dictionary(); - foreach (var (name, ns) in missingHandleTypes) - { - var fullyQualifiedName = string.IsNullOrWhiteSpace(ns) ? name : $"{ns}.{name}"; - var structDeclarationSyntax = StructDeclaration(name) - .WithModifiers( - TokenList( - Token(SyntaxKind.PublicKeyword), - Token(SyntaxKind.UnsafeKeyword), - Token(SyntaxKind.PartialKeyword) - ) - ); - - results[fullyQualifiedName] = CompilationUnit() - .WithMembers( - SingletonList( - string.IsNullOrWhiteSpace(ns) - ? structDeclarationSyntax - : FileScopedNamespaceDeclaration( - ModUtils.NamespaceIntoIdentifierName(ns) - ) - .WithMembers( - SingletonList( - structDeclarationSyntax - ) - ) - ) - ); - } - - return results; - } - } - private class HandleTypeDiscoverer( Project project, Compilation compilation, From 4b119b292ed23f13ee192ad8b640d38adef02864 Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 25 Mar 2026 11:19:10 -0400 Subject: [PATCH 05/36] Rename UseDSL to UseDsl Considering we decided to follow Microsoft's Framework Design Guidelines (acronym threshold of 2) for the bindings and rest of the API, might as well be consistent here. --- generator.json | 6 +++--- sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/generator.json b/generator.json index 2831592107..54df300afb 100644 --- a/generator.json +++ b/generator.json @@ -60,7 +60,7 @@ "InputTestRoot": "tests/SDL" }, "TransformHandles": { - "UseDSL": true + "UseDsl": true }, "TransformFunctions": { "BoolTypes": { @@ -352,7 +352,7 @@ "BenefitOfTheDoubtArrayTransformation": true }, "TransformHandles": { - "UseDSL": true + "UseDsl": true }, "StripAttributes": { "Remove": [ @@ -424,7 +424,7 @@ } }, "TransformHandles": { - "UseDSL": true + "UseDsl": true }, "PrettifyNames": { "GlobalPrefixHints": ["PFN_vk","vk"], diff --git a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs index fb57d9db1f..9938826448 100644 --- a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs +++ b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs @@ -39,7 +39,7 @@ public class Config /// /// Whether the DSL (i.e. nullptr) should be usable with handle types. /// - public bool UseDSL { get; init; } + public bool UseDsl { get; init; } } /// @@ -99,7 +99,7 @@ [new PointerDimensionReductionTransformer()], project = ctx.SourceProject; // Use document IDs from earlier - var handleTypeRewriter = new HandleTypeRewriter(cfg.UseDSL); + var handleTypeRewriter = new HandleTypeRewriter(cfg.UseDsl); foreach (var (originalName, documentId) in handleTypeDocumentIds) { var document = @@ -227,7 +227,7 @@ public override void VisitNamedType(INamedTypeSymbol symbol) } } - private class HandleTypeRewriter(bool useDSL) : CSharpSyntaxRewriter + private class HandleTypeRewriter(bool useDsl) : CSharpSyntaxRewriter { public override SyntaxNode VisitStructDeclaration(StructDeclarationSyntax node) { @@ -241,7 +241,7 @@ public override SyntaxNode VisitStructDeclaration(StructDeclarationSyntax node) .WithMembers( List( GetDefaultHandleMembers(structName) - .Concat(useDSL ? GetDSLHandleMembers(structName) : []) + .Concat(useDsl ? GetDslHandleMembers(structName) : []) ) ) .WithModifiers( @@ -465,7 +465,7 @@ string structName .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); } - private static IEnumerable GetDSLHandleMembers(string structName) + private static IEnumerable GetDslHandleMembers(string structName) { yield return MethodDeclaration( PredefinedType(Token(SyntaxKind.BoolKeyword)), From f3900b93327261f25622b094c6d654b32cea0be2 Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 25 Mar 2026 11:21:01 -0400 Subject: [PATCH 06/36] Cleanup unused property in TransformHandles --- sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs index 9938826448..024215d5e4 100644 --- a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs +++ b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs @@ -66,7 +66,7 @@ public override async Task ExecuteAsync(IModContext ctx, CancellationToken ct = // Store handle document IDs for later // We will use these IDs to know which documents to rewrite and rename - var handleTypeDocumentIds = new List<(string OriginalName, DocumentId DocumentId)>(); + var handleTypeDocumentIds = new List(); foreach (var handleTypeSymbol in handleTypes) { if (handleTypeSymbol.DeclaringSyntaxReferences.Length > 1) @@ -82,7 +82,7 @@ public override async Task ExecuteAsync(IModContext ctx, CancellationToken ct = var documentId = project.GetDocumentId(declaringSyntaxReference.SyntaxTree); if (documentId != null) { - handleTypeDocumentIds.Add((handleTypeSymbol.Name, documentId)); + handleTypeDocumentIds.Add(documentId); } } @@ -100,7 +100,7 @@ [new PointerDimensionReductionTransformer()], // Use document IDs from earlier var handleTypeRewriter = new HandleTypeRewriter(cfg.UseDsl); - foreach (var (originalName, documentId) in handleTypeDocumentIds) + foreach (var documentId in handleTypeDocumentIds) { var document = project.GetDocument(documentId) From 851c3ff81412a595ec9925d7ca37f2234512e2f2 Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 25 Mar 2026 11:21:28 -0400 Subject: [PATCH 07/36] Cleanup usages of redundant collections expressions in TransformHandles --- .../SilkTouch/SilkTouch/Mods/TransformHandles.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs index 024215d5e4..04feaa8cd0 100644 --- a/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs +++ b/sources/SilkTouch/SilkTouch/Mods/TransformHandles.cs @@ -323,7 +323,7 @@ string structName Identifier("Equals") ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.OverrideKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.OverrideKeyword)) ) .WithParameterList( ParameterList( @@ -362,7 +362,7 @@ string structName Identifier("GetHashCode") ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.OverrideKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.OverrideKeyword)) ) .WithExpressionBody( ArrowExpressionClause( @@ -394,7 +394,7 @@ string structName Token(SyntaxKind.EqualsEqualsToken) ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)) ) .WithParameterList( ParameterList( @@ -431,7 +431,7 @@ string structName Token(SyntaxKind.ExclamationEqualsToken) ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)) ) .WithParameterList( ParameterList( @@ -494,7 +494,7 @@ private static IEnumerable GetDslHandleMembers(string s Token(SyntaxKind.EqualsEqualsToken) ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)) ) .WithParameterList( ParameterList( @@ -531,7 +531,7 @@ private static IEnumerable GetDslHandleMembers(string s Token(SyntaxKind.ExclamationEqualsToken) ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)) ) .WithParameterList( ParameterList( @@ -569,7 +569,7 @@ private static IEnumerable GetDslHandleMembers(string s IdentifierName(structName) ) .WithModifiers( - TokenList([Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)]) + TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword)) ) .WithParameterList( ParameterList( From 2f018ff96904e14e07462385f8168c17f3c85399 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 15:08:11 -0400 Subject: [PATCH 08/36] Add NameAffixer.AddResolvedNameAffix() for handling compound names --- .../SilkTouch/SilkTouch/Naming/NameAffixer.cs | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs index a778a7d2dc..5a160814f2 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs @@ -92,17 +92,87 @@ public static SyntaxList AddNameAffix( Literal($"\"{affixType}\"", affixType) ) ); + var categoryArgument = AttributeArgument( LiteralExpression( SyntaxKind.StringLiteralExpression, Literal($"\"{category}\"", category) ) ); + var affixArgument = AttributeArgument( LiteralExpression(SyntaxKind.StringLiteralExpression, Literal($"\"{affix}\"", affix)) ); + var argumentList = AttributeArgumentList([typeArgument, categoryArgument, affixArgument]); + var attribute = AttributeList([Attribute(IdentifierName("NameAffix"), argumentList)]); + + return addToInner ? [attribute, .. attributeLists] : [.. attributeLists, attribute]; + } + + /// + /// This is similar to + /// but allows the name of another symbol to be referenced. + /// + /// This ensures transformations applied to the referenced symbol's name + /// are also applied to this affix. + /// + /// + /// This allows compound names to be handled more cleanly. + /// + /// + /// For example, PerformanceCounterDescriptionARM can be used as a resolved prefix for PerformanceCounterDescriptionARMName. + /// If PerformanceCounterDescriptionARM becomes ARMPerformanceCounterDescription, + /// then PerformanceCounterDescriptionARMName will also be output as ARMPerformanceCounterDescriptionName. + /// + public static SyntaxList AddResolvedNameAffix( + this IEnumerable attributeLists, + NameAffixType type, + string category, + string resolvedAffix, + bool addToInner = false + ) + { + var affixType = type switch + { + NameAffixType.Prefix => "Prefix", + NameAffixType.Suffix => "Suffix", + _ => throw new ArgumentOutOfRangeException(nameof(type)), + }; + + var typeArgument = AttributeArgument( + LiteralExpression( + SyntaxKind.StringLiteralExpression, + Literal($"\"{affixType}\"", affixType) + ) + ); + + var categoryArgument = AttributeArgument( + LiteralExpression( + SyntaxKind.StringLiteralExpression, + Literal($"\"{category}\"", category) + ) + ); + // nameof(resolvedAffix) + var affixArgument = AttributeArgument( + InvocationExpression( + IdentifierName( + Identifier( + TriviaList(), + SyntaxKind.NameOfKeyword, + "nameof", + "nameof", + TriviaList() + ) + ) + ) + .WithArgumentList( + ArgumentList(SingletonSeparatedList(Argument(IdentifierName(resolvedAffix)))) + ) + ); + + var argumentList = AttributeArgumentList([typeArgument, categoryArgument, affixArgument]); var attribute = AttributeList([Attribute(IdentifierName("NameAffix"), argumentList)]); return addToInner ? [attribute, .. attributeLists] : [.. attributeLists, attribute]; From 50a411535b8fb87c3c0bc4baf42e9d7ef6f696a8 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 15:17:38 -0400 Subject: [PATCH 09/36] Use AddResolvedNameAffix for extracted function pointer delegate types --- sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs b/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs index fd53e3a615..6267ec59b0 100644 --- a/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs +++ b/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs @@ -529,6 +529,11 @@ _fallbackFromOuterFunctionPointer is not null : default ) .WithNativeName(currentNativeTypeName) + .AddResolvedNameAffix( + NameAffixType.Prefix, + "FunctionPointerParent", + currentNativeTypeName + ) .AddNameAffix( NameAffixType.Suffix, "FunctionPointerDelegateType", From 83888787a396bfa7a3863acb565e619f932fed0e Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 15:18:07 -0400 Subject: [PATCH 10/36] Use AddResolvedNameAffix for extracted nested structs and remove name separation hack (no longer necessary) --- .../SilkTouch/Mods/ExtractNestedTyping.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs b/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs index 6267ec59b0..215028fb15 100644 --- a/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs +++ b/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs @@ -322,11 +322,20 @@ mem is not StructDeclarationSyntax struc continue; } - var iden = $"{node.Identifier}_{match.Groups[1].Value}"; + var iden = $"{node.Identifier}{match.Groups[1].Value}"; _typeRenames[struc.Identifier.ToString()] = iden; struc = - VisitStructDeclaration(struc.WithIdentifier(Identifier(iden))) - as StructDeclarationSyntax + VisitStructDeclaration( + struc + .WithIdentifier(Identifier(iden)) + .WithAttributeLists( + struc.AttributeLists.AddResolvedNameAffix( + NameAffixType.Prefix, + "NestedStructParent", + node.Identifier.ToString() + ) + ) + ) as StructDeclarationSyntax ?? struc; ExtractedNestedStructs.Add(struc); members = members.RemoveAt(i--); From 674c61a00679feacdc296be5b3f6348809faf5f2 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 19:28:44 -0400 Subject: [PATCH 11/36] Rename resolved affix to referenced affix and add parsing code for referenced affixes --- .../SilkTouch/Mods/ExtractNestedTyping.cs | 4 +- .../SilkTouch/SilkTouch/Naming/NameAffix.cs | 7 ++- .../SilkTouch/SilkTouch/Naming/NameAffixer.cs | 62 +++++++++++++++---- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs b/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs index 215028fb15..0a028011ca 100644 --- a/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs +++ b/sources/SilkTouch/SilkTouch/Mods/ExtractNestedTyping.cs @@ -329,7 +329,7 @@ mem is not StructDeclarationSyntax struc struc .WithIdentifier(Identifier(iden)) .WithAttributeLists( - struc.AttributeLists.AddResolvedNameAffix( + struc.AttributeLists.AddReferencedNameAffix( NameAffixType.Prefix, "NestedStructParent", node.Identifier.ToString() @@ -538,7 +538,7 @@ _fallbackFromOuterFunctionPointer is not null : default ) .WithNativeName(currentNativeTypeName) - .AddResolvedNameAffix( + .AddReferencedNameAffix( NameAffixType.Prefix, "FunctionPointerParent", currentNativeTypeName diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffix.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffix.cs index c5c132a9fc..90be238ffa 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffix.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffix.cs @@ -13,9 +13,14 @@ namespace Silk.NET.SilkTouch.Naming; /// The order that the attribute was declared in. /// 0 is the first and indicates that the affix is on the inside of the name. /// +/// +/// Whether the affix uses the name of a referenced symbol. +/// See . +/// public record struct NameAffix( NameAffixType Type, string Category, string Affix, - int DeclarationOrder + int DeclarationOrder, + bool IsReference = false ); diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs index 5a160814f2..c55edd6b82 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs @@ -32,13 +32,21 @@ public static NameAffix[] GetNameAffixes(this SyntaxList at var argumentList = attribute.ArgumentList; if ( - argumentList != null - && argumentList.Arguments[0].Expression - is LiteralExpressionSyntax { Token.Value: string type } - && argumentList.Arguments[1].Expression - is LiteralExpressionSyntax { Token.Value: string category } - && argumentList.Arguments[2].Expression - is LiteralExpressionSyntax { Token.Value: string affix } + argumentList == null + || argumentList.Arguments[0].Expression + is not LiteralExpressionSyntax { Token.Value: string type } + || argumentList.Arguments[1].Expression + is not LiteralExpressionSyntax { Token.Value: string category } + ) + { + continue; + } + + if ( + argumentList.Arguments[2].Expression is LiteralExpressionSyntax + { + Token.Value: string affix + } ) { affixes = @@ -51,8 +59,36 @@ public static NameAffix[] GetNameAffixes(this SyntaxList at declarationOrder ), ]; - declarationOrder++; } + else if ( + argumentList.Arguments[2].Expression is InvocationExpressionSyntax + { + Expression: IdentifierNameSyntax { Identifier.ValueText: "nameof" }, + ArgumentList.Arguments: [ + { + Expression: IdentifierNameSyntax + { + Identifier.ValueText: var referencedAffix, + }, + }, + ], + } + ) + { + affixes = + [ + .. affixes, + new NameAffix( + type == "Prefix" ? NameAffixType.Prefix : NameAffixType.Suffix, + category, + referencedAffix, + declarationOrder, + true + ), + ]; + } + + declarationOrder++; } } @@ -121,15 +157,15 @@ public static SyntaxList AddNameAffix( /// This allows compound names to be handled more cleanly. /// /// - /// For example, PerformanceCounterDescriptionARM can be used as a resolved prefix for PerformanceCounterDescriptionARMName. + /// For example, PerformanceCounterDescriptionARM can be used as a referenced prefix for PerformanceCounterDescriptionARMName. /// If PerformanceCounterDescriptionARM becomes ARMPerformanceCounterDescription, /// then PerformanceCounterDescriptionARMName will also be output as ARMPerformanceCounterDescriptionName. /// - public static SyntaxList AddResolvedNameAffix( + public static SyntaxList AddReferencedNameAffix( this IEnumerable attributeLists, NameAffixType type, string category, - string resolvedAffix, + string referencedAffix, bool addToInner = false ) { @@ -154,7 +190,7 @@ public static SyntaxList AddResolvedNameAffix( ) ); - // nameof(resolvedAffix) + // nameof(referencedAffix) var affixArgument = AttributeArgument( InvocationExpression( IdentifierName( @@ -168,7 +204,7 @@ public static SyntaxList AddResolvedNameAffix( ) ) .WithArgumentList( - ArgumentList(SingletonSeparatedList(Argument(IdentifierName(resolvedAffix)))) + ArgumentList(SingletonSeparatedList(Argument(IdentifierName(referencedAffix)))) ) ); From d2ae93d95e57c485430b14af5a377c34f1572923 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 19:44:50 -0400 Subject: [PATCH 12/36] Add extra ConsecutiveNumbers test case documenting that Xs between numbers are normalized --- tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs b/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs index 206162a001..3a70c35676 100644 --- a/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs @@ -82,6 +82,7 @@ public string StartsWithNumber(string input, int longAcronymThreshold = 0) => // Add x between numbers to maintain separation [TestCase("123_123_123", ExpectedResult = "X123x123x123")] [TestCase("Hello123_123_123", ExpectedResult = "Hello123x123x123")] + [TestCase("Hello123X123X123", ExpectedResult = "Hello123x123x123")] public string ConsecutiveNumbers(string input, int longAcronymThreshold = 0) => new NamePrettifier(longAcronymThreshold).Prettify(input); From d51a68e1660fe685ead343d101e5f3de92a007ae Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 19:58:41 -0400 Subject: [PATCH 13/36] Fix incorrect declarationOrder implementation --- sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs index c55edd6b82..974c78aec9 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs @@ -59,6 +59,8 @@ argumentList.Arguments[2].Expression is LiteralExpressionSyntax declarationOrder ), ]; + + declarationOrder++; } else if ( argumentList.Arguments[2].Expression is InvocationExpressionSyntax @@ -86,9 +88,9 @@ argumentList.Arguments[2].Expression is InvocationExpressionSyntax true ), ]; - } - declarationOrder++; + declarationOrder++; + } } } From a30ac45400cb45e54c8680b8e52e457db4f48d00 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 20:18:54 -0400 Subject: [PATCH 14/36] Change Prettify to not prefix identifiers starting with numbers This lets us handle prefixing and prettification separately, which notably is important if we add prefixes after prettification. We want to prefix the final name, not the intermediate name in this case. --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 3 ++- .../SilkTouch/Naming/NamePrettifier.cs | 24 ++---------------- .../SilkTouch/SilkTouch/Naming/NameUtils.cs | 13 ++++++++++ .../SilkTouch/Naming/NamePrettifierTests.cs | 25 ++++++++++++++++--- .../SilkTouch/Naming/NameTrimmerTests.cs | 2 +- 5 files changed, 39 insertions(+), 28 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index a803b7ab6b..a490d6c3e9 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -508,6 +508,7 @@ NamePrettifier namePrettifier result = nameAffixer.RemoveAffixes(result, container, name, null); result = namePrettifier.Prettify(result, allowAllCaps); result = nameAffixer.ApplyAffixes(result, container, name, null); + result = NameUtils.PrefixIfStartsWithNumber(result); return result; } @@ -1505,7 +1506,7 @@ public void Trim(NameTrimmerContext context) foreach (var (original, (primary, secondary)) in context.Names) { var secondaries = secondary; - var newPrimary = affixer.ApplyAffixes(primary, null, original, secondaries); + var newPrimary = affixer.ApplyAffixes(primary, null, original, secondaries); // TODO: Prefix names starting with numbers context.Names[original] = new CandidateNames(newPrimary, secondaries); } diff --git a/sources/SilkTouch/SilkTouch/Naming/NamePrettifier.cs b/sources/SilkTouch/SilkTouch/Naming/NamePrettifier.cs index 1e9f5387ea..71e91d7375 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NamePrettifier.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NamePrettifier.cs @@ -31,11 +31,6 @@ public class NamePrettifier(int longAcronymThreshold) /// Thrown when the input or output is an empty identifier. public string Prettify(string identifier, bool allowAllCaps = false) { - if (identifier.Length == 0) - { - throw new InvalidOperationException("Cannot prettify an empty identifier"); - } - var words = NameSplitter.BreakIntoWords(identifier); // Add "X" to separate out numbers @@ -50,15 +45,6 @@ public string Prettify(string identifier, bool allowAllCaps = false) } } - // Add "X" if first word is a number - if (words.Count > 0) - { - if (NameUtils.GetCharType(words[0][0]) is CharType.Number) - { - words.Insert(0, "X"); - } - } - // Pretend there is an underscore between each word // This is used as a heuristic for determining whether we can treat short, all uppercase words as acronyms // @@ -179,17 +165,11 @@ public string Prettify(string identifier, bool allowAllCaps = false) } } - var result = string.Join("", words); - if (result.Length == 0) - { - throw new InvalidOperationException( - $"Prettification for '{identifier}' led to an empty identifier" - ); - } + var result = string.Join(null, words); // Disallow all capitals var resultSpan = result.AsSpan(); - if (!allowAllCaps && IsAllCaps(result)) + if (result.Length > 0 && !allowAllCaps && IsAllCaps(result)) { Span caps = stackalloc char[resultSpan.Length - 1]; resultSpan[1..].ToLower(caps, CultureInfo.InvariantCulture); diff --git a/sources/SilkTouch/SilkTouch/Naming/NameUtils.cs b/sources/SilkTouch/SilkTouch/Naming/NameUtils.cs index 9f0b34e21c..67459499df 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameUtils.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameUtils.cs @@ -38,6 +38,19 @@ public static partial class NameUtils "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" ); + /// + /// Prefixes the given identifier with the specified prefix if it starts with a number. + /// + public static string PrefixIfStartsWithNumber(string identifier, string prefix = "X") + { + if (identifier.Length > 0 && char.IsDigit(identifier[0])) + { + return $"X{identifier}"; + } + + return identifier; + } + /// /// Gets the char type for the specified character according /// to the categorization defined by . diff --git a/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs b/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs index 3a70c35676..b60e81f769 100644 --- a/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/NamePrettifierTests.cs @@ -71,16 +71,19 @@ public string AcronymsWithNumbers2(string input, int longAcronymThreshold = 0) = public string ConsecutiveAcronyms(string input, int longAcronymThreshold = 0) => new NamePrettifier(longAcronymThreshold).Prettify(input); + /// + /// C# identifiers cannot start with numbers, but no longer handles this + /// in favor of calling separately. + /// [Theory] - // C# identifiers cannot start with numbers - [TestCase("123", ExpectedResult = "X123")] - [TestCase("123Hello", ExpectedResult = "X123Hello")] + [TestCase("123", ExpectedResult = "123")] + [TestCase("123Hello", ExpectedResult = "123Hello")] public string StartsWithNumber(string input, int longAcronymThreshold = 0) => new NamePrettifier(longAcronymThreshold).Prettify(input); [Theory] // Add x between numbers to maintain separation - [TestCase("123_123_123", ExpectedResult = "X123x123x123")] + [TestCase("123_123_123", ExpectedResult = "123x123x123")] [TestCase("Hello123_123_123", ExpectedResult = "Hello123x123x123")] [TestCase("Hello123X123X123", ExpectedResult = "Hello123x123x123")] public string ConsecutiveNumbers(string input, int longAcronymThreshold = 0) => @@ -172,4 +175,18 @@ public void Lowercase_AfterNumber_IsPartOf_NewWord() Assert.That(nameTransformer.Prettify("MONO16f"), Is.EqualTo("Mono16F")); } } + + [Test] + public void EmptyInput_IsAllowed() + { + var nameTransformer = new NamePrettifier(4); + nameTransformer.Prettify(""); + } + + [Test] + public void EmptyOutput_IsAllowed() + { + var nameTransformer = new NamePrettifier(4); + nameTransformer.Prettify("_"); + } } diff --git a/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs b/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs index c2dcdae2f8..f9ab67e30a 100644 --- a/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs @@ -77,7 +77,7 @@ public void RegressionFragmentShaderColorModMaskATI() ); var expected = new Dictionary { - { "GL_2X_BIT_ATI", "X2XBitAti" }, + { "GL_2X_BIT_ATI", "2XBitAti" }, { "GL_COMP_BIT_ATI", "CompBitAti" }, { "GL_NEGATE_BIT_ATI", "NegateBitAti" }, { "GL_BIAS_BIT_ATI", "BiasBitAti" }, From fb98f409fc19ca57570e034e04b75563e7d006e4 Mon Sep 17 00:00:00 2001 From: William Chen Date: Thu, 15 Jan 2026 00:14:12 -0500 Subject: [PATCH 15/36] Change the list and order of INameTrimmers used to be statically configured (cherry picked from commit bc94260c4b22344a1cc4eceb29a26711e2ade531) --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 33 +++++--------- .../SilkTouch/Naming/INameTrimmer.cs | 11 +---- .../SilkTouch/SilkTouch/Naming/NameTrimmer.cs | 3 -- .../SilkTouch/Naming/NameTrimmer217.cs | 3 -- .../SilkTouch/Naming/NameTrimmer218.cs | 3 -- .../SilkTouch/Naming/TrimmerOrder.cs | 20 --------- .../SilkTouch/ServiceCollectionExtensions.cs | 3 -- .../SilkTouch/Naming/PrettifyNamesTests.cs | 45 +++++++------------ 8 files changed, 27 insertions(+), 94 deletions(-) delete mode 100644 sources/SilkTouch/SilkTouch/Naming/TrimmerOrder.cs diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index a490d6c3e9..2f9d941ae6 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -14,12 +14,10 @@ namespace Silk.NET.SilkTouch.Mods; /// /// The logger. /// Configuration snapshot. -/// Name trimmer providers. [ModConfiguration] public class PrettifyNames( ILogger logger, - IOptionsSnapshot config, - IEnumerable> trimmerProviders + IOptionsSnapshot config ) : IMod, IResponseFileMod { /// @@ -179,13 +177,13 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) // couldn't be bothered to introduce a weight property. It is also unclear what effect this has on 2.17/2.18 // but to be honest those trimmers aren't used and are only included for posterity and understanding of the // old logic. - var trimmers = trimmerProviders - .SelectMany(x => x.Get(ctx.JobKey)) - .Append(new NameAffixerEarlyTrimmer(nameAffixer)) - .Append(new NameAffixerLateTrimmer(nameAffixer)) - .Append(new PrettifyNamesTrimmer(namePrettifier)) - .OrderBy(x => x.Order) - .ToArray(); + var trimmers = new INameTrimmer[] + { + new NameAffixerEarlyTrimmer(nameAffixer), + new NameTrimmer(), + new PrettifyNamesTrimmer(namePrettifier), + new NameAffixerLateTrimmer(nameAffixer), + }; // Create a type name dictionary to trim the type names. var typeNames = visitor.TrimmableTypes.ToDictionary( @@ -1455,10 +1453,7 @@ private NameAffixConfiguration GetConfiguration(string category) => private class NameAffixerEarlyTrimmer(PrettifyNamesAffixer affixer) : INameTrimmer { /// - public Version Version => new(0, 0, 0); - - /// - public int Order => (int)TrimmerOrder.NameAffixerEarlyTrimmer; + public Version Version => new(3, 0); public void Trim(NameTrimmerContext context) { @@ -1494,10 +1489,7 @@ public void Trim(NameTrimmerContext context) private class NameAffixerLateTrimmer(PrettifyNamesAffixer affixer) : INameTrimmer { /// - public Version Version => new(0, 0, 0); - - /// - public int Order => (int)TrimmerOrder.NameAffixerLateTrimmer; + public Version Version => new(3, 0); public void Trim(NameTrimmerContext context) { @@ -1530,10 +1522,7 @@ public void Trim(NameTrimmerContext context) private class PrettifyNamesTrimmer(NamePrettifier namePrettifier) : INameTrimmer { /// - public Version Version => new(0, 0, 0); - - /// - public int Order => (int)TrimmerOrder.PrettifyNamesTrimmer; + public Version Version => new(3, 0); public void Trim(NameTrimmerContext context) { diff --git a/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs b/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs index ec77fef58e..1e63aff4b3 100644 --- a/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Silk.NET.SilkTouch.Naming; +namespace Silk.NET.SilkTouch.Naming; /// /// Represents a name trimmer. @@ -15,12 +12,6 @@ public interface INameTrimmer /// Version Version { get; } - /// - /// Used to define the order that the trimmers will run in. - /// Higher values indicate that the trimmer should run later. - /// - int Order { get; } - /// /// Trims prefixes from the given constituent names within the given container. /// diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs index 3bc9c92deb..480305bfce 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs @@ -14,9 +14,6 @@ public class NameTrimmer : INameTrimmer /// public virtual Version Version => new(3, 0); - /// - public virtual int Order => (int)TrimmerOrder.NameTrimmer; - /// /// Determines whether a second pass without using is warranted. /// diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs index e188daad90..87287fea40 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs @@ -13,9 +13,6 @@ public class NameTrimmer217 : NameTrimmer /// public override Version Version => new(2, 17); - /// - public override int Order => (int)TrimmerOrder.NameTrimmer217; - /// protected override bool HasRawPass => false; diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs index fd9a0b8fbf..de89020c0a 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs @@ -11,9 +11,6 @@ public class NameTrimmer218 : NameTrimmer /// public override Version Version => new(2, 18); - /// - public override int Order => (int)TrimmerOrder.NameTrimmer218; - /// protected override bool HasRawPass => false; diff --git a/sources/SilkTouch/SilkTouch/Naming/TrimmerOrder.cs b/sources/SilkTouch/SilkTouch/Naming/TrimmerOrder.cs deleted file mode 100644 index 1ec873a1e9..0000000000 --- a/sources/SilkTouch/SilkTouch/Naming/TrimmerOrder.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Silk.NET.SilkTouch.Naming; - -/// -/// Defines the order for SilkTouch's implementations. -/// -internal enum TrimmerOrder -{ - NameAffixerEarlyTrimmer = 100, - - NameTrimmer = 200, - NameTrimmer217 = 210, - NameTrimmer218 = 220, - - PrettifyNamesTrimmer = 400, - - NameAffixerLateTrimmer = 500, -} diff --git a/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs b/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs index 4809f51f0b..b16b0e95c1 100644 --- a/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs +++ b/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs @@ -96,16 +96,13 @@ IConfiguration config // - https://andrewlock.net/how-to-register-a-service-with-multiple-interfaces-for-in-asp-net-core-di/ // - https://discordapp.com/channels/143867839282020352/663803973119115264/1129546023388332075 (C# Discord) - // services.AddSingleton(); <-- this is a mod now services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.TryAddSingleton(s => s.GetRequiredService() ); - services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(s => s.GetRequiredService()); services.AddSingleton(s => s.GetRequiredService()); services.AddSingleton(typeof(IJobDependency<>), typeof(JobDependencies.Global<>)); services.TryAddSingleton(); diff --git a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs index d4576a8c84..910d3dba8b 100644 --- a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs @@ -39,8 +39,7 @@ public enum OcclusionQueryParameterNameNV var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -73,8 +72,7 @@ public enum VocalMorpherPhoneme var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -103,8 +101,7 @@ public enum VkPresentIdKHR { } var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -138,8 +135,7 @@ public enum OcclusionQueryParameterNameNV var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -181,8 +177,7 @@ public enum OcclusionQueryParameterNameNV NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { GlobalPrefixHints = ["gl"] } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -210,8 +205,7 @@ public enum OcclusionQueryParameterNameNV var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -255,8 +249,7 @@ public enum OcclusionQueryParameterNameNV NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { GlobalPrefixHints = ["gl"] } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -287,8 +280,7 @@ public enum OcclusionQueryParameterNameNV var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -327,8 +319,7 @@ public enum VkPresentModeKHR var prettifyNames = new PrettifyNames( NullLogger.Instance, - new DummyOptions(new PrettifyNames.Configuration()), - [new DummyJobDependency([new NameTrimmer()])] + new DummyOptions(new PrettifyNames.Configuration()) ); await prettifyNames.ExecuteAsync(context); @@ -354,8 +345,7 @@ public async Task TrimsPrefix_WhenMatchingHint() NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { GlobalPrefixHints = ["vk"] } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -382,8 +372,7 @@ public async Task DoesNotTrimTypeName_WhenNotMatchingHint_AndOnlyOneType() NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { GlobalPrefixHints = ["gl"] } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -419,8 +408,7 @@ public enum InternalFormat NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { LongAcronymThreshold = 3 } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -470,8 +458,7 @@ public enum ALEnum NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { LongAcronymThreshold = 4 } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -529,8 +516,7 @@ public void alFilteri() { } }, }, } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); @@ -562,8 +548,7 @@ public enum GLEnum { } NullLogger.Instance, new DummyOptions( new PrettifyNames.Configuration() { GlobalPrefixHints = ["gl"] } - ), - [new DummyJobDependency([new NameTrimmer()])] + ) ); await prettifyNames.ExecuteAsync(context); From 68153fffb7d7dcb22d4e59c001c38e70ef2507b6 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 20:26:18 -0400 Subject: [PATCH 16/36] Replace now outdated comment --- sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 2f9d941ae6..bca1f03cec 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -173,10 +173,7 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) { // Trim and prettify the trimmable names - // Get all the trimmers that are above this baseline. We also sort by the version. Why? Because someone - // couldn't be bothered to introduce a weight property. It is also unclear what effect this has on 2.17/2.18 - // but to be honest those trimmers aren't used and are only included for posterity and understanding of the - // old logic. + // Define trimmers var trimmers = new INameTrimmer[] { new NameAffixerEarlyTrimmer(nameAffixer), From e0fb52e91a061ce157861e35fe4d47f400ca1ada Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 20:33:21 -0400 Subject: [PATCH 17/36] Move PrettifyNamesTrimmer higher up in the class to make it more obvious that it is not the last trimmer --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index bca1f03cec..7950ba73fc 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1480,6 +1480,35 @@ public void Trim(NameTrimmerContext context) } } + private class PrettifyNamesTrimmer(NamePrettifier namePrettifier) : INameTrimmer + { + /// + public Version Version => new(3, 0); + + public void Trim(NameTrimmerContext context) + { + foreach (var (original, (primary, secondary)) in context.Names) + { + // Be lenient about caps for type names (e.g. GL) + var allowAllCaps = context.Container == null; + + for (var i = 0; i < secondary.Count; i++) + { + secondary[i] = NameUtils.PrefixIfStartsWithNumber( + namePrettifier.Prettify(secondary[i], allowAllCaps) + ); + } + + context.Names[original] = new CandidateNames( + NameUtils.PrefixIfStartsWithNumber( + namePrettifier.Prettify(primary, allowAllCaps) + ), + secondary + ); + } + } + } + /// /// Reapplies and transforms identified affixes based on . /// @@ -1515,29 +1544,4 @@ public void Trim(NameTrimmerContext context) } } } - - private class PrettifyNamesTrimmer(NamePrettifier namePrettifier) : INameTrimmer - { - /// - public Version Version => new(3, 0); - - public void Trim(NameTrimmerContext context) - { - foreach (var (original, (primary, secondary)) in context.Names) - { - // Be lenient about caps for type names (e.g. GL) - var allowAllCaps = context.Container == null; - - for (var i = 0; i < secondary.Count; i++) - { - secondary[i] = namePrettifier.Prettify(secondary[i], allowAllCaps); - } - - context.Names[original] = new CandidateNames( - namePrettifier.Prettify(primary, allowAllCaps), - secondary - ); - } - } - } } From 044c84b90f782aaacf3dd398e8c887cbfd8e7bbc Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 20:43:52 -0400 Subject: [PATCH 18/36] Remove INameTrimmer.Version This no longer makes sense to keep and enabling features by baseline version seems fiddly. If we need to toggle features for newer versions, we can explicitly add a boolean config option. --- sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 9 --------- sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs | 9 +-------- sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs | 11 +---------- sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs | 7 +------ sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs | 7 +------ 5 files changed, 4 insertions(+), 39 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 7950ba73fc..9033015700 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1449,9 +1449,6 @@ private NameAffixConfiguration GetConfiguration(string category) => /// private class NameAffixerEarlyTrimmer(PrettifyNamesAffixer affixer) : INameTrimmer { - /// - public Version Version => new(3, 0); - public void Trim(NameTrimmerContext context) { if (context.Container == null) @@ -1482,9 +1479,6 @@ public void Trim(NameTrimmerContext context) private class PrettifyNamesTrimmer(NamePrettifier namePrettifier) : INameTrimmer { - /// - public Version Version => new(3, 0); - public void Trim(NameTrimmerContext context) { foreach (var (original, (primary, secondary)) in context.Names) @@ -1514,9 +1508,6 @@ public void Trim(NameTrimmerContext context) /// private class NameAffixerLateTrimmer(PrettifyNamesAffixer affixer) : INameTrimmer { - /// - public Version Version => new(3, 0); - public void Trim(NameTrimmerContext context) { if (context.Container == null) diff --git a/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs b/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs index 1e63aff4b3..1894988eaa 100644 --- a/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs @@ -5,16 +5,9 @@ /// public interface INameTrimmer { - /// - /// Gets the name trimmer version i.e. the Silk.NET version that introduced this name trimming method. This is so - /// new bindings released with or after this version don't have to have older trimming methods executed (the name - /// version can be specified in the mod configuration) - /// - Version Version { get; } - /// /// Trims prefixes from the given constituent names within the given container. /// /// The arguments. - void Trim(NameTrimmerContext context); + public void Trim(NameTrimmerContext context); } diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs index 480305bfce..6ca857a0da 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs @@ -1,19 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text.Json; - -namespace Silk.NET.SilkTouch.Naming; +namespace Silk.NET.SilkTouch.Naming; /// /// The default name trimmer ported from Silk.NET 2.18 with modifications for 3.0. /// public class NameTrimmer : INameTrimmer { - /// - public virtual Version Version => new(3, 0); - /// /// Determines whether a second pass without using is warranted. /// diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs index 87287fea40..391b10a347 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer217.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using Humanizer; +using Humanizer; namespace Silk.NET.SilkTouch.Naming; @@ -10,9 +8,6 @@ namespace Silk.NET.SilkTouch.Naming; [Obsolete("Use NameTrimmer instead for 3.0 names")] public class NameTrimmer217 : NameTrimmer { - /// - public override Version Version => new(2, 17); - /// protected override bool HasRawPass => false; diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs index de89020c0a..5e206446fb 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer218.cs @@ -1,6 +1,4 @@ -using System; - -namespace Silk.NET.SilkTouch.Naming; +namespace Silk.NET.SilkTouch.Naming; /// /// The 2.18 name trimmer. @@ -8,9 +6,6 @@ namespace Silk.NET.SilkTouch.Naming; [Obsolete("Use NameTrimmer instead for 3.0 names")] public class NameTrimmer218 : NameTrimmer { - /// - public override Version Version => new(2, 18); - /// protected override bool HasRawPass => false; From e9b23778889fc5063e0882f75d39cbbf6072c6d9 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 20:53:36 -0400 Subject: [PATCH 19/36] Add PrefixIfStartsWithNumberTrimmer --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 9033015700..94032212b3 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -180,6 +180,7 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) new NameTrimmer(), new PrettifyNamesTrimmer(namePrettifier), new NameAffixerLateTrimmer(nameAffixer), + new PrefixIfStartsWithNumberTrimmer(), }; // Create a type name dictionary to trim the type names. @@ -1488,15 +1489,11 @@ public void Trim(NameTrimmerContext context) for (var i = 0; i < secondary.Count; i++) { - secondary[i] = NameUtils.PrefixIfStartsWithNumber( - namePrettifier.Prettify(secondary[i], allowAllCaps) - ); + secondary[i] = namePrettifier.Prettify(secondary[i], allowAllCaps); } context.Names[original] = new CandidateNames( - NameUtils.PrefixIfStartsWithNumber( - namePrettifier.Prettify(primary, allowAllCaps) - ), + namePrettifier.Prettify(primary, allowAllCaps), secondary ); } @@ -1515,7 +1512,7 @@ public void Trim(NameTrimmerContext context) foreach (var (original, (primary, secondary)) in context.Names) { var secondaries = secondary; - var newPrimary = affixer.ApplyAffixes(primary, null, original, secondaries); // TODO: Prefix names starting with numbers + var newPrimary = affixer.ApplyAffixes(primary, null, original, secondaries); context.Names[original] = new CandidateNames(newPrimary, secondaries); } @@ -1535,4 +1532,23 @@ public void Trim(NameTrimmerContext context) } } } + + private class PrefixIfStartsWithNumberTrimmer : INameTrimmer + { + public void Trim(NameTrimmerContext context) + { + foreach (var (original, (primary, secondary)) in context.Names) + { + for (var i = 0; i < secondary.Count; i++) + { + secondary[i] = NameUtils.PrefixIfStartsWithNumber(secondary[i]); + } + + context.Names[original] = new CandidateNames( + NameUtils.PrefixIfStartsWithNumber(primary), + secondary + ); + } + } + } } From 464703c812399d0134ee9b78d7364f3a28a5e114 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 21:33:57 -0400 Subject: [PATCH 20/36] Remove TrimmerBaseline config option --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 206 +++++++----------- 1 file changed, 79 insertions(+), 127 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 94032212b3..ad433836c7 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -35,11 +35,6 @@ public class PrettifyNames( /// public Dictionary NameOverrides { get; init; } = []; - /// - /// The base trimmer version. If null, trimming is disabled. - /// - public Version? TrimmerBaseline { get; init; } = new(3, 0); - /// /// The maximum length of an all capitals string to be treated as a single acronym, rather than as an all /// capitals word. @@ -129,138 +124,95 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) var nameAffixer = new PrettifyNamesAffixer(visitor.AffixTypes, cfg.Affixes); var namePrettifier = new NamePrettifier(cfg.LongAcronymThreshold); - // Trim the trimmable names if the trimmer baseline is set - // Otherwise, we just prettify the trimmable names - if (cfg.TrimmerBaseline is null) - { - // Only prettify the trimmable names - foreach (var (name, (nonFunctions, functions)) in visitor.TrimmableTypes) - { - newNames[name] = new RenamedType( - ApplyPrettifyOnlyPipeline( - null, - name, - cfg.NameOverrides, - nameAffixer, - namePrettifier - ), - nonFunctions.ToDictionary( - x => x, - x => - ApplyPrettifyOnlyPipeline( - name, - x, - cfg.NameOverrides, - nameAffixer, - namePrettifier - ) - ), - functions.ToDictionary( - x => x.Name, - x => - ApplyPrettifyOnlyPipeline( - name, - x.Name, - cfg.NameOverrides, - nameAffixer, - namePrettifier - ) - ) - ); - } - } - else - { - // Trim and prettify the trimmable names + // Trim and prettify the trimmable names - // Define trimmers - var trimmers = new INameTrimmer[] - { - new NameAffixerEarlyTrimmer(nameAffixer), - new NameTrimmer(), - new PrettifyNamesTrimmer(namePrettifier), - new NameAffixerLateTrimmer(nameAffixer), - new PrefixIfStartsWithNumberTrimmer(), - }; + // Define trimmers + var trimmers = new INameTrimmer[] + { + new NameAffixerEarlyTrimmer(nameAffixer), + new NameTrimmer(), + new PrettifyNamesTrimmer(namePrettifier), + new NameAffixerLateTrimmer(nameAffixer), + new PrefixIfStartsWithNumberTrimmer(), + }; + + // Create a type name dictionary to trim the type names. + var typeNames = visitor.TrimmableTypes.ToDictionary( + x => x.Key, + x => new CandidateNames(x.Key, []) + ); - // Create a type name dictionary to trim the type names. - var typeNames = visitor.TrimmableTypes.ToDictionary( - x => x.Key, - x => new CandidateNames(x.Key, []) + // If we don't have a prefix hint and don't have more than one type, we can't determine a prefix so don't + // trim. + if (typeNames.Count > 1 || cfg.GlobalPrefixHints is not null) + { + Trim( + new NameTrimmerContext + { + Container = null, + Names = typeNames, + Configuration = cfg, + JobKey = ctx.JobKey, + NonDeterminant = visitor.NonDeterminant, + }, + trimmers ); + } - // If we don't have a prefix hint and don't have more than one type, we can't determine a prefix so don't - // trim. - if (typeNames.Count > 1 || cfg.GlobalPrefixHints is not null) - { - Trim( - new NameTrimmerContext - { - Container = null, - Names = typeNames, - Configuration = cfg, - JobKey = ctx.JobKey, - NonDeterminant = visitor.NonDeterminant, - }, - trimmers - ); - } - - // Now rename everything within each type. - foreach (var (typeName, (newTypeName, _)) in typeNames) - { - var (_, (consts, functions)) = visitor.TrimmableTypes.First(x => x.Key == typeName); + // Now rename everything within each type. + foreach (var (typeName, (newTypeName, _)) in typeNames) + { + var (_, (consts, functions)) = visitor.TrimmableTypes.First(x => x.Key == typeName); - // Rename the "constants" i.e. all the consts/static readonlys in this type. These are treated - // individually because everything that isn't a constant or a function is only prettified instead of prettified & trimmed. - var constNames = consts.ToDictionary(x => x, x => new CandidateNames(x, [])); + // Rename the "constants" i.e. all the consts/static readonlys in this type. These are treated + // individually because everything that isn't a constant or a function is only prettified instead of prettified & trimmed. + var constNames = consts.ToDictionary(x => x, x => new CandidateNames(x, [])); - // Trim the constants. - Trim( - new NameTrimmerContext - { - Container = typeName, - Names = constNames, - Configuration = cfg, - JobKey = ctx.JobKey, - NonDeterminant = visitor.NonDeterminant, - }, - trimmers - ); + // Trim the constants. + Trim( + new NameTrimmerContext + { + Container = typeName, + Names = constNames, + Configuration = cfg, + JobKey = ctx.JobKey, + NonDeterminant = visitor.NonDeterminant, + }, + trimmers + ); - // Rename the functions. More often that not functions have different nomenclature to constants, so we - // treat them separately. - var functionNames = functions - .DistinctBy(x => x.Name) - .ToDictionary(x => x.Name, x => new CandidateNames(x.Name, [])); + // Rename the functions. More often that not functions have different nomenclature to constants, so we + // treat them separately. + var functionNames = functions + .DistinctBy(x => x.Name) + .ToDictionary(x => x.Name, x => new CandidateNames(x.Name, [])); - // Collect the syntax as this is used for conflict resolution in the Trim function. - var functionSyntax = functionNames.Keys.ToDictionary( - x => x, - x => functions.Where(y => y.Name == x).Select(y => y.Syntax) - ); + // Collect the syntax as this is used for conflict resolution in the Trim function. + var functionSyntax = functionNames.Keys.ToDictionary( + x => x, + x => functions.Where(y => y.Name == x).Select(y => y.Syntax) + ); - // Trim the functions. - Trim( - new NameTrimmerContext - { - Container = typeName, - Names = functionNames, - Configuration = cfg, - JobKey = ctx.JobKey, - NonDeterminant = visitor.NonDeterminant, - }, - trimmers, - functionSyntax - ); + // Trim the functions. + Trim( + new NameTrimmerContext + { + Container = typeName, + Names = functionNames, + Configuration = cfg, + JobKey = ctx.JobKey, + NonDeterminant = visitor.NonDeterminant, + }, + trimmers, + functionSyntax + ); - // Add it to the rewriter's list of names to... rewrite... - newNames[typeName] = new RenamedType( - newTypeName, - constNames.ToDictionary(x => x.Key, x => x.Value.Primary), - functionNames.ToDictionary(x => x.Key, x => x.Value.Primary) - ); - } + // Add it to the rewriter's list of names to... rewrite... + newNames[typeName] = new RenamedType( + newTypeName, + constNames.ToDictionary(x => x.Key, x => x.Value.Primary), + functionNames.ToDictionary(x => x.Key, x => x.Value.Primary) + ); } // Prettify the prettify only names From adf4eeebbe4a602a59979078009e6f551f08a2f2 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 22:15:24 -0400 Subject: [PATCH 21/36] Rename INameTrimmer to INameProcessor and update rest of codebase --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 84 +++++++++---------- .../SilkTouch/Naming/INameProcessor.cs | 12 +++ .../SilkTouch/Naming/INameTrimmer.cs | 13 --- ...mmerContext.cs => NameProcessorContext.cs} | 4 +- .../SilkTouch/SilkTouch/Naming/NameTrimmer.cs | 4 +- .../SilkTouch/ServiceCollectionExtensions.cs | 2 +- .../SilkTouch/Naming/NameTrimmerTests.cs | 20 ++--- 7 files changed, 69 insertions(+), 70 deletions(-) create mode 100644 sources/SilkTouch/SilkTouch/Naming/INameProcessor.cs delete mode 100644 sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs rename sources/SilkTouch/SilkTouch/Naming/{NameTrimmerContext.cs => NameProcessorContext.cs} (90%) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index ad433836c7..7621d87bc0 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -126,14 +126,14 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) // Trim and prettify the trimmable names - // Define trimmers - var trimmers = new INameTrimmer[] + // Define name processors + var nameProcessors = new INameProcessor[] { - new NameAffixerEarlyTrimmer(nameAffixer), + new NameAffixerEarlyNameProcessor(nameAffixer), new NameTrimmer(), - new PrettifyNamesTrimmer(namePrettifier), - new NameAffixerLateTrimmer(nameAffixer), - new PrefixIfStartsWithNumberTrimmer(), + new PrettifyNameProcessor(namePrettifier), + new NameAffixerLateNameProcessor(nameAffixer), + new PrefixIfStartsWithNumberNameProcessor(), }; // Create a type name dictionary to trim the type names. @@ -146,8 +146,8 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) // trim. if (typeNames.Count > 1 || cfg.GlobalPrefixHints is not null) { - Trim( - new NameTrimmerContext + ProcessNames( + new NameProcessorContext { Container = null, Names = typeNames, @@ -155,7 +155,7 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) JobKey = ctx.JobKey, NonDeterminant = visitor.NonDeterminant, }, - trimmers + nameProcessors ); } @@ -169,8 +169,8 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) var constNames = consts.ToDictionary(x => x, x => new CandidateNames(x, [])); // Trim the constants. - Trim( - new NameTrimmerContext + ProcessNames( + new NameProcessorContext { Container = typeName, Names = constNames, @@ -178,7 +178,7 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) JobKey = ctx.JobKey, NonDeterminant = visitor.NonDeterminant, }, - trimmers + nameProcessors ); // Rename the functions. More often that not functions have different nomenclature to constants, so we @@ -194,8 +194,8 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) ); // Trim the functions. - Trim( - new NameTrimmerContext + ProcessNames( + new NameProcessorContext { Container = typeName, Names = functionNames, @@ -203,7 +203,7 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) JobKey = ctx.JobKey, NonDeterminant = visitor.NonDeterminant, }, - trimmers, + nameProcessors, functionSyntax ); @@ -461,15 +461,15 @@ NamePrettifier namePrettifier return result; } - private void Trim( - NameTrimmerContext context, - IEnumerable trimmers, + private void ProcessNames( + NameProcessorContext context, + IEnumerable nameProcessors, Dictionary>? functionSyntax = null ) { // Ensure the trimmers don't see names that have been manually overridden, as we don't want them to influence // automatic prefix determination for example - var namesToTrim = context.Names; + var namesToProcess = context.Names; foreach (var (nativeName, overriddenName) in context.Configuration.NameOverrides) { var nameToAdd = nativeName; @@ -497,21 +497,21 @@ private void Trim( } } - if (!namesToTrim.TryGetValue(nameToAdd, out var v)) + if (!namesToProcess.TryGetValue(nameToAdd, out var v)) { continue; } // If we haven't created the differentiated dictionary yet, then do so now. We do want to keep the original // dictionary so we can actually apply the renames; if we have created two different branching dictionaries - // they are recombined following trimming. - if (namesToTrim == context.Names) + // they are recombined following name processing. + if (namesToProcess == context.Names) { - namesToTrim = namesToTrim.ToDictionary(); + namesToProcess = namesToProcess.ToDictionary(); } - // Don't let the trimmers see the overridden native name. - namesToTrim.Remove(nameToAdd); + // Don't let the name processors see the overridden native name. + namesToProcess.Remove(nameToAdd); // Apply the name override to the dictionary we actually use. context.Names[nameToAdd] = new CandidateNames( @@ -520,16 +520,16 @@ private void Trim( ); } - // Run each trimmer - foreach (var trimmer in trimmers) + // Run each name processor + foreach (var nameProcessor in nameProcessors) { - trimmer.Trim(context with { Names = namesToTrim }); + nameProcessor.ProcessNames(context with { Names = namesToProcess }); } // Apply changes - if (namesToTrim != context.Names) + if (namesToProcess != context.Names) { - foreach (var (evalName, result) in namesToTrim) + foreach (var (evalName, result) in namesToProcess) { context.Names[evalName] = result; } @@ -1201,7 +1201,7 @@ Dictionary config /// Removes affixes from the specified primary name and adds the original specified primary to the secondary list if provided. /// /// - /// Designed to be used by either or . + /// Designed to be used by either or . /// /// The current primary name. /// The container name. Either null or the containing type. @@ -1234,7 +1234,7 @@ public string RemoveAffixes( /// Applies affixes to the specified primary name and adds fallbacks to the secondary list if provided. /// /// - /// Designed to be used by either or . + /// Designed to be used by either or . /// /// The current primary name. /// The container name. Either null or the containing type. @@ -1397,12 +1397,12 @@ private NameAffixConfiguration GetConfiguration(string category) => } /// - /// Removes identified affixes so that other trimmers can process the base name separately. - /// These affixes should be reapplied by . + /// Removes identified affixes so that other name processors can process the base name separately. + /// These affixes should be reapplied by . /// - private class NameAffixerEarlyTrimmer(PrettifyNamesAffixer affixer) : INameTrimmer + private class NameAffixerEarlyNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor { - public void Trim(NameTrimmerContext context) + public void ProcessNames(NameProcessorContext context) { if (context.Container == null) { @@ -1430,9 +1430,9 @@ public void Trim(NameTrimmerContext context) } } - private class PrettifyNamesTrimmer(NamePrettifier namePrettifier) : INameTrimmer + private class PrettifyNameProcessor(NamePrettifier namePrettifier) : INameProcessor { - public void Trim(NameTrimmerContext context) + public void ProcessNames(NameProcessorContext context) { foreach (var (original, (primary, secondary)) in context.Names) { @@ -1455,9 +1455,9 @@ public void Trim(NameTrimmerContext context) /// /// Reapplies and transforms identified affixes based on . /// - private class NameAffixerLateTrimmer(PrettifyNamesAffixer affixer) : INameTrimmer + private class NameAffixerLateNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor { - public void Trim(NameTrimmerContext context) + public void ProcessNames(NameProcessorContext context) { if (context.Container == null) { @@ -1485,9 +1485,9 @@ public void Trim(NameTrimmerContext context) } } - private class PrefixIfStartsWithNumberTrimmer : INameTrimmer + private class PrefixIfStartsWithNumberNameProcessor : INameProcessor { - public void Trim(NameTrimmerContext context) + public void ProcessNames(NameProcessorContext context) { foreach (var (original, (primary, secondary)) in context.Names) { diff --git a/sources/SilkTouch/SilkTouch/Naming/INameProcessor.cs b/sources/SilkTouch/SilkTouch/Naming/INameProcessor.cs new file mode 100644 index 0000000000..6adb7e687e --- /dev/null +++ b/sources/SilkTouch/SilkTouch/Naming/INameProcessor.cs @@ -0,0 +1,12 @@ +namespace Silk.NET.SilkTouch.Naming; + +/// +/// Represents a name processor. +/// +public interface INameProcessor +{ + /// + /// Process and transform the names within the given container. + /// + public void ProcessNames(NameProcessorContext context); +} diff --git a/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs b/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs deleted file mode 100644 index 1894988eaa..0000000000 --- a/sources/SilkTouch/SilkTouch/Naming/INameTrimmer.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Silk.NET.SilkTouch.Naming; - -/// -/// Represents a name trimmer. -/// -public interface INameTrimmer -{ - /// - /// Trims prefixes from the given constituent names within the given container. - /// - /// The arguments. - public void Trim(NameTrimmerContext context); -} diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmerContext.cs b/sources/SilkTouch/SilkTouch/Naming/NameProcessorContext.cs similarity index 90% rename from sources/SilkTouch/SilkTouch/Naming/NameTrimmerContext.cs rename to sources/SilkTouch/SilkTouch/Naming/NameProcessorContext.cs index caede1740e..935d1a3b08 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmerContext.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameProcessorContext.cs @@ -6,9 +6,9 @@ namespace Silk.NET.SilkTouch.Naming; /// -/// State made available to implementations when determining a trimmed name. +/// State made available to implementations when determining a trimmed name. /// -public readonly struct NameTrimmerContext +public readonly struct NameProcessorContext { /// /// Gets the name of the "container" (e.g. a type name) of the APIs in . diff --git a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs index 6ca857a0da..71d80b1b72 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameTrimmer.cs @@ -3,7 +3,7 @@ /// /// The default name trimmer ported from Silk.NET 2.18 with modifications for 3.0. /// -public class NameTrimmer : INameTrimmer +public class NameTrimmer : INameProcessor { /// /// Determines whether a second pass without using is warranted. @@ -20,7 +20,7 @@ public class NameTrimmer : INameTrimmer private static readonly HashSet s_forbiddenTrimmings = new() { "unsigned", "per" }; /// - public void Trim(NameTrimmerContext context) + public void ProcessNames(NameProcessorContext context) { string? identifiedPrefix = null; List localNames = null!; diff --git a/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs b/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs index b16b0e95c1..17265500d1 100644 --- a/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs +++ b/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs @@ -55,7 +55,7 @@ static ServiceCollectionExtensions() /// /// /// - /// One or more s + /// One or more s /// An appropriate implementation of /// Mod implementations referenced in the configurations /// diff --git a/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs b/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs index f9ab67e30a..6b0ff019fe 100644 --- a/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/NameTrimmerTests.cs @@ -27,8 +27,8 @@ public void SimpleGlfwTestDetermination(string? hint) GetPrefix(null, hint, test, null, null, false, true)?.Prefix, Is.EqualTo("GLFW") ); - Trim( - new NameTrimmerContext + ProcessNames( + new NameProcessorContext { Configuration = new PrettifyNames.Configuration { @@ -66,8 +66,8 @@ public void RegressionFragmentShaderColorModMaskATI() { "GL_NEGATE_BIT_ATI", new CandidateNames("GL_NEGATE_BIT_ATI", []) }, { "GL_BIAS_BIT_ATI", new CandidateNames("GL_BIAS_BIT_ATI", []) }, }; - Trim( - new NameTrimmerContext + ProcessNames( + new NameProcessorContext { Container = "FragmentShaderColorModMaskATI", Configuration = new PrettifyNames.Configuration { GlobalPrefixHints = ["gl"] }, @@ -96,8 +96,8 @@ public void RegressionEvalTargetNV() { "GL_EVAL_2D_NV", new CandidateNames("GL_EVAL_2D_NV", []) }, { "GL_EVAL_TRIANGULAR_2D_NV", new CandidateNames("GL_EVAL_TRIANGULAR_2D_NV", []) }, }; - Trim( - new NameTrimmerContext + ProcessNames( + new NameProcessorContext { Container = "EvalTargetNV", Configuration = new PrettifyNames.Configuration { GlobalPrefixHints = ["gl"] }, @@ -123,7 +123,7 @@ public void RegressionSingleMemberEnumUsesGlobalPrefixHint() { { "GL_FILL_NV", new CandidateNames("GL_FILL_NV", []) }, }; - var ctx = new NameTrimmerContext + var ctx = new NameProcessorContext { Configuration = new PrettifyNames.Configuration { GlobalPrefixHints = ["gl"] }, Container = "EvalMapsModeNV", @@ -131,7 +131,7 @@ public void RegressionSingleMemberEnumUsesGlobalPrefixHint() Names = names, }; var uut = new NameTrimmer(); - uut.Trim(ctx); + uut.ProcessNames(ctx); Assert.That(names["GL_FILL_NV"].Primary, Is.EqualTo("FILL_NV")); } @@ -142,7 +142,7 @@ public void MultipleGlobalPrefixHints() { { "ALC_CONTEXT_DEBUG_BIT_EXT", new CandidateNames("ALC_CONTEXT_DEBUG_BIT_EXT", []) }, }; - var ctx = new NameTrimmerContext + var ctx = new NameProcessorContext { Configuration = new PrettifyNames.Configuration { GlobalPrefixHints = ["alc", "al"] }, Container = "ContextFlagsEXT", @@ -150,7 +150,7 @@ public void MultipleGlobalPrefixHints() Names = names, }; var uut = new NameTrimmer(); - uut.Trim(ctx); + uut.ProcessNames(ctx); Assert.That( names["ALC_CONTEXT_DEBUG_BIT_EXT"].Primary, Is.EqualTo("CONTEXT_DEBUG_BIT_EXT") From f321238c93c2d2732584e1781016bc379ddde6c4 Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 22:20:36 -0400 Subject: [PATCH 22/36] Simplify name affixer name processor names to be StripAffixesNameProcessor and ReapplyAffixesNameProcessor --- sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 7621d87bc0..152651588e 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -129,10 +129,10 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) // Define name processors var nameProcessors = new INameProcessor[] { - new NameAffixerEarlyNameProcessor(nameAffixer), + new StripAffixesNameProcessor(nameAffixer), new NameTrimmer(), new PrettifyNameProcessor(namePrettifier), - new NameAffixerLateNameProcessor(nameAffixer), + new ReapplyAffixesNameProcessor(nameAffixer), new PrefixIfStartsWithNumberNameProcessor(), }; @@ -1201,7 +1201,7 @@ Dictionary config /// Removes affixes from the specified primary name and adds the original specified primary to the secondary list if provided. /// /// - /// Designed to be used by either or . + /// Designed to be used by either or . /// /// The current primary name. /// The container name. Either null or the containing type. @@ -1234,7 +1234,7 @@ public string RemoveAffixes( /// Applies affixes to the specified primary name and adds fallbacks to the secondary list if provided. /// /// - /// Designed to be used by either or . + /// Designed to be used by either or . /// /// The current primary name. /// The container name. Either null or the containing type. @@ -1398,9 +1398,9 @@ private NameAffixConfiguration GetConfiguration(string category) => /// /// Removes identified affixes so that other name processors can process the base name separately. - /// These affixes should be reapplied by . + /// These affixes should be reapplied by . /// - private class NameAffixerEarlyNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor + private class StripAffixesNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor { public void ProcessNames(NameProcessorContext context) { @@ -1455,7 +1455,7 @@ public void ProcessNames(NameProcessorContext context) /// /// Reapplies and transforms identified affixes based on . /// - private class NameAffixerLateNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor + private class ReapplyAffixesNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor { public void ProcessNames(NameProcessorContext context) { From d8e808deab4e3f7f43c9903997fa7956cae1b13c Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 22:21:29 -0400 Subject: [PATCH 23/36] Shorten names a bit more for readability --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 152651588e..1f26824f5b 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -129,11 +129,11 @@ public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default) // Define name processors var nameProcessors = new INameProcessor[] { - new StripAffixesNameProcessor(nameAffixer), + new StripAffixesProcessor(nameAffixer), new NameTrimmer(), - new PrettifyNameProcessor(namePrettifier), - new ReapplyAffixesNameProcessor(nameAffixer), - new PrefixIfStartsWithNumberNameProcessor(), + new PrettifyProcessor(namePrettifier), + new ReapplyAffixesProcessor(nameAffixer), + new PrefixIfStartsWithNumberProcessor(), }; // Create a type name dictionary to trim the type names. @@ -1201,7 +1201,7 @@ Dictionary config /// Removes affixes from the specified primary name and adds the original specified primary to the secondary list if provided. /// /// - /// Designed to be used by either or . + /// Designed to be used by either or . /// /// The current primary name. /// The container name. Either null or the containing type. @@ -1234,7 +1234,7 @@ public string RemoveAffixes( /// Applies affixes to the specified primary name and adds fallbacks to the secondary list if provided. /// /// - /// Designed to be used by either or . + /// Designed to be used by either or . /// /// The current primary name. /// The container name. Either null or the containing type. @@ -1398,9 +1398,9 @@ private NameAffixConfiguration GetConfiguration(string category) => /// /// Removes identified affixes so that other name processors can process the base name separately. - /// These affixes should be reapplied by . + /// These affixes should be reapplied by . /// - private class StripAffixesNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor + private class StripAffixesProcessor(PrettifyNamesAffixer affixer) : INameProcessor { public void ProcessNames(NameProcessorContext context) { @@ -1430,7 +1430,7 @@ public void ProcessNames(NameProcessorContext context) } } - private class PrettifyNameProcessor(NamePrettifier namePrettifier) : INameProcessor + private class PrettifyProcessor(NamePrettifier namePrettifier) : INameProcessor { public void ProcessNames(NameProcessorContext context) { @@ -1455,7 +1455,7 @@ public void ProcessNames(NameProcessorContext context) /// /// Reapplies and transforms identified affixes based on . /// - private class ReapplyAffixesNameProcessor(PrettifyNamesAffixer affixer) : INameProcessor + private class ReapplyAffixesProcessor(PrettifyNamesAffixer affixer) : INameProcessor { public void ProcessNames(NameProcessorContext context) { @@ -1485,7 +1485,7 @@ public void ProcessNames(NameProcessorContext context) } } - private class PrefixIfStartsWithNumberNameProcessor : INameProcessor + private class PrefixIfStartsWithNumberProcessor : INameProcessor { public void ProcessNames(NameProcessorContext context) { From 69831720bf741b356d2a7c0fc23585b1630fb53b Mon Sep 17 00:00:00 2001 From: William Chen Date: Fri, 27 Mar 2026 22:26:11 -0400 Subject: [PATCH 24/36] Decide to only support references within the same scope depth Kinda a cop out decision, but it keeps thing simple (and thus maintainable) and implementing it fully seems overkill for what we need. --- sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs index 974c78aec9..72c87c7b9a 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs @@ -157,6 +157,11 @@ public static SyntaxList AddNameAffix( /// /// /// This allows compound names to be handled more cleanly. + /// + /// For simplicity, only names within the same scope depth are currently supported. + /// This should cover most real world use cases since + /// if something is nested and has the parent name as a prefix, + /// then the prefix is likely unnecessary. /// /// /// For example, PerformanceCounterDescriptionARM can be used as a referenced prefix for PerformanceCounterDescriptionARMName. From 14d9d6534f8155d9986d70dd74d1895296429667 Mon Sep 17 00:00:00 2001 From: William Chen Date: Sat, 28 Mar 2026 17:26:42 -0400 Subject: [PATCH 25/36] Restrict feature set of AddReferencedNameAffix even more for simplicity --- sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs index 72c87c7b9a..67b7657594 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs @@ -158,10 +158,13 @@ public static SyntaxList AddNameAffix( /// /// This allows compound names to be handled more cleanly. /// - /// For simplicity, only names within the same scope depth are currently supported. - /// This should cover most real world use cases since - /// if something is nested and has the parent name as a prefix, - /// then the prefix is likely unnecessary. + /// For simplicity, only names within the same name container are currently supported. + /// This lets us skip sorting across different containers. + /// This should cover most real world use cases since if something is nested and + /// has the parent name as a prefix, then the prefix is likely unnecessary. + /// + /// Similarly, only direct references are supported. Transitive references are not. + /// This lets us naively sort all references to the end of the container without a topological sort. /// /// /// For example, PerformanceCounterDescriptionARM can be used as a referenced prefix for PerformanceCounterDescriptionARMName. From 0228a568633e1a89cad1897b62afe5dacae9e4a2 Mon Sep 17 00:00:00 2001 From: William Chen Date: Sat, 28 Mar 2026 18:38:12 -0400 Subject: [PATCH 26/36] Implement referenced affixes and change how -Delegate types generated for function pointer types are named --- .silktouch/vulkan-clangsharp.stout | Bin 1974639 -> 1974639 bytes .../SilkTouch/Mods/MixKhronosData.cs | 3 +- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 63 +++++++++--------- .../Vulkan/DebugMarkerMarkerInfoEXT.gen.cs | 2 +- ...s => DebugMarkerMarkerInfoEXTColor.gen.cs} | 2 +- .../Vulkan/DebugReportCallbackEXT.gen.cs | 2 +- ... => DebugReportCallbackEXTDelegate.gen.cs} | 2 +- .../Vulkan/Vulkan/DebugUtilsLabelEXT.gen.cs | 2 +- ....gen.cs => DebugUtilsLabelEXTColor.gen.cs} | 2 +- .../DebugUtilsMessengerCallbackEXT.gen.cs | 2 +- ...gUtilsMessengerCallbackEXTDelegate.gen.cs} | 2 +- .../Vulkan/Vulkan/DeviceFaultInfoEXT.gen.cs | 2 +- ...s => DeviceFaultInfoEXTDescription.gen.cs} | 2 +- ...aultVendorBinaryHeaderVersionOneEXT.gen.cs | 2 +- ...aderVersionOneEXTPipelineCacheUuid.gen.cs} | 2 +- .../Vulkan/DeviceFaultVendorInfoEXT.gen.cs | 2 +- ...eviceFaultVendorInfoEXTDescription.gen.cs} | 2 +- .../DeviceGroupPresentCapabilitiesKHR.gen.cs | 2 +- ...pPresentCapabilitiesKHRPresentMask.gen.cs} | 2 +- .../DeviceMemoryReportCallbackEXT.gen.cs | 2 +- ...iceMemoryReportCallbackEXTDelegate.gen.cs} | 2 +- .../Vulkan/GetInstanceProcAddrLUNARG.gen.cs | 2 +- ... GetInstanceProcAddrLUNARGDelegate.gen.cs} | 2 +- .../PerformanceCounterDescriptionARM.gen.cs | 2 +- ...rformanceCounterDescriptionARMName.gen.cs} | 2 +- .../PerformanceCounterDescriptionKHR.gen.cs | 6 +- ...manceCounterDescriptionKHRCategory.gen.cs} | 2 +- ...ceCounterDescriptionKHRDescription.gen.cs} | 2 +- ...rformanceCounterDescriptionKHRName.gen.cs} | 2 +- .../Vulkan/PerformanceCounterKHR.gen.cs | 2 +- ...en.cs => PerformanceCounterKHRUuid.gen.cs} | 2 +- ...lusterCullingShaderPropertiesHUAWEI.gen.cs | 4 +- ...rPropertiesHUAWEIMaxWorkGroupCount.gen.cs} | 2 +- ...erPropertiesHUAWEIMaxWorkGroupSize.gen.cs} | 2 +- ...lDeviceDataGraphOperationSupportARM.gen.cs | 2 +- ...ceDataGraphOperationSupportARMName.gen.cs} | 2 +- ...ysicalDeviceLayeredApiPropertiesKHR.gen.cs | 2 +- ...eLayeredApiPropertiesKHRDeviceName.gen.cs} | 2 +- ...icalDeviceMemoryBudgetPropertiesEXT.gen.cs | 4 +- ...emoryBudgetPropertiesEXTHeapBudget.gen.cs} | 2 +- ...MemoryBudgetPropertiesEXTHeapUsage.gen.cs} | 2 +- ...ysicalDeviceMeshShaderPropertiesEXT.gen.cs | 8 +-- ...PropertiesEXTMaxMeshWorkGroupCount.gen.cs} | 2 +- ...rPropertiesEXTMaxMeshWorkGroupSize.gen.cs} | 2 +- ...PropertiesEXTMaxTaskWorkGroupCount.gen.cs} | 2 +- ...rPropertiesEXTMaxTaskWorkGroupSize.gen.cs} | 2 +- ...lDeviceSampleLocationsPropertiesEXT.gen.cs | 2 +- ...esEXTSampleLocationCoordinateRange.gen.cs} | 2 +- ...ShaderModuleIdentifierPropertiesEXT.gen.cs | 2 +- ...haderModuleIdentifierAlgorithmUuid.gen.cs} | 2 +- ...icalDeviceShaderObjectPropertiesEXT.gen.cs | 2 +- ...bjectPropertiesEXTShaderBinaryUuid.gen.cs} | 2 +- .../Vulkan/Vulkan/PipelineBinaryKeyKHR.gen.cs | 2 +- ....gen.cs => PipelineBinaryKeyKHRKey.gen.cs} | 2 +- ...lineCacheHeaderVersionDataGraphQCOM.gen.cs | 2 +- ...rsionDataGraphQCOMToolchainVersion.gen.cs} | 2 +- ...ExecutableInternalRepresentationKHR.gen.cs | 4 +- ...ternalRepresentationKHRDescription.gen.cs} | 2 +- ...tableInternalRepresentationKHRName.gen.cs} | 2 +- .../PipelineExecutablePropertiesKHR.gen.cs | 4 +- ...ExecutablePropertiesKHRDescription.gen.cs} | 2 +- ...ipelineExecutablePropertiesKHRName.gen.cs} | 2 +- .../PipelineExecutableStatisticKHR.gen.cs | 4 +- ...eExecutableStatisticKHRDescription.gen.cs} | 2 +- ...PipelineExecutableStatisticKHRName.gen.cs} | 2 +- ...agmentShadingRateStateCreateInfoKHR.gen.cs | 2 +- ...gRateStateCreateInfoKHRCombinerOps.gen.cs} | 2 +- .../PipelinePropertiesIdentifierEXT.gen.cs | 2 +- ...iesIdentifierEXTPipelineIdentifier.gen.cs} | 2 +- .../RenderPassSubpassFeedbackInfoEXT.gen.cs | 2 +- ...sSubpassFeedbackInfoEXTDescription.gen.cs} | 2 +- .../Vulkan/ShaderModuleIdentifierEXT.gen.cs | 2 +- ...haderModuleIdentifierEXTIdentifier.gen.cs} | 2 +- .../Vulkan/ShaderStatisticsInfoAMD.gen.cs | 2 +- ...tisticsInfoAMDComputeWorkGroupSize.gen.cs} | 2 +- .../Vulkan/Vulkan/TransformMatrixKHR.gen.cs | 2 +- ...gen.cs => TransformMatrixKHRMatrix.gen.cs} | 2 +- .../VideoDecodeAv1PictureInfoKHR.gen.cs | 2 +- ...ureInfoKHRReferenceNameSlotIndices.gen.cs} | 2 +- .../VideoDecodeVp9PictureInfoKHR.gen.cs | 2 +- ...ureInfoKHRReferenceNameSlotIndices.gen.cs} | 2 +- .../VideoEncodeAv1PictureInfoKHR.gen.cs | 2 +- ...ureInfoKHRReferenceNameSlotIndices.gen.cs} | 2 +- 83 files changed, 124 insertions(+), 122 deletions(-) rename sources/Vulkan/Vulkan/Vulkan/{DebugMarkerMarkerInfoExtColor.gen.cs => DebugMarkerMarkerInfoEXTColor.gen.cs} (91%) rename sources/Vulkan/Vulkan/Vulkan/{DebugReportCallbackDelegateEXT.gen.cs => DebugReportCallbackEXTDelegate.gen.cs} (91%) rename sources/Vulkan/Vulkan/Vulkan/{DebugUtilsLabelExtColor.gen.cs => DebugUtilsLabelEXTColor.gen.cs} (92%) rename sources/Vulkan/Vulkan/Vulkan/{DebugUtilsMessengerCallbackDelegateEXT.gen.cs => DebugUtilsMessengerCallbackEXTDelegate.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{DeviceFaultInfoExtDescription.gen.cs => DeviceFaultInfoEXTDescription.gen.cs} (92%) rename sources/Vulkan/Vulkan/Vulkan/{DeviceFaultVendorBinaryHeaderVersionOneExtPipelineCacheUuid.gen.cs => DeviceFaultVendorBinaryHeaderVersionOneEXTPipelineCacheUuid.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{DeviceFaultVendorInfoExtDescription.gen.cs => DeviceFaultVendorInfoEXTDescription.gen.cs} (91%) rename sources/Vulkan/Vulkan/Vulkan/{DeviceGroupPresentCapabilitiesKhrPresentMask.gen.cs => DeviceGroupPresentCapabilitiesKHRPresentMask.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{DeviceMemoryReportCallbackDelegateEXT.gen.cs => DeviceMemoryReportCallbackEXTDelegate.gen.cs} (89%) rename sources/Vulkan/Vulkan/Vulkan/{GetInstanceProcAddrDelegateLUNARG.gen.cs => GetInstanceProcAddrLUNARGDelegate.gen.cs} (96%) rename sources/Vulkan/Vulkan/Vulkan/{PerformanceCounterDescriptionArmName.gen.cs => PerformanceCounterDescriptionARMName.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PerformanceCounterDescriptionKhrCategory.gen.cs => PerformanceCounterDescriptionKHRCategory.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PerformanceCounterDescriptionKhrDescription.gen.cs => PerformanceCounterDescriptionKHRDescription.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PerformanceCounterDescriptionKhrName.gen.cs => PerformanceCounterDescriptionKHRName.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PerformanceCounterKhrUuid.gen.cs => PerformanceCounterKHRUuid.gen.cs} (92%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupCount.gen.cs => PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupCount.gen.cs} (96%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupSize.gen.cs => PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupSize.gen.cs} (96%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceDataGraphOperationSupportArmName.gen.cs => PhysicalDeviceDataGraphOperationSupportARMName.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceLayeredApiPropertiesKhrDeviceName.gen.cs => PhysicalDeviceLayeredApiPropertiesKHRDeviceName.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceMemoryBudgetPropertiesExtHeapBudget.gen.cs => PhysicalDeviceMemoryBudgetPropertiesEXTHeapBudget.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceMemoryBudgetPropertiesExtHeapUsage.gen.cs => PhysicalDeviceMemoryBudgetPropertiesEXTHeapUsage.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupCount.gen.cs => PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupCount.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupSize.gen.cs => PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupSize.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupCount.gen.cs => PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupCount.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupSize.gen.cs => PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupSize.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceSampleLocationsPropertiesExtSampleLocationCoordinateRange.gen.cs => PhysicalDeviceSampleLocationsPropertiesEXTSampleLocationCoordinateRange.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceShaderModuleIdentifierPropertiesExtShaderModuleIdentifierAlgorithmUuid.gen.cs => PhysicalDeviceShaderModuleIdentifierPropertiesEXTShaderModuleIdentifierAlgorithmUuid.gen.cs} (94%) rename sources/Vulkan/Vulkan/Vulkan/{PhysicalDeviceShaderObjectPropertiesExtShaderBinaryUuid.gen.cs => PhysicalDeviceShaderObjectPropertiesEXTShaderBinaryUuid.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineBinaryKeyKhrKey.gen.cs => PipelineBinaryKeyKHRKey.gen.cs} (92%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineCacheHeaderVersionDataGraphQcomToolchainVersion.gen.cs => PipelineCacheHeaderVersionDataGraphQCOMToolchainVersion.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineExecutableInternalRepresentationKhrDescription.gen.cs => PipelineExecutableInternalRepresentationKHRDescription.gen.cs} (88%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineExecutableInternalRepresentationKhrName.gen.cs => PipelineExecutableInternalRepresentationKHRName.gen.cs} (89%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineExecutablePropertiesKhrDescription.gen.cs => PipelineExecutablePropertiesKHRDescription.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineExecutablePropertiesKhrName.gen.cs => PipelineExecutablePropertiesKHRName.gen.cs} (91%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineExecutableStatisticKhrDescription.gen.cs => PipelineExecutableStatisticKHRDescription.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineExecutableStatisticKhrName.gen.cs => PipelineExecutableStatisticKHRName.gen.cs} (91%) rename sources/Vulkan/Vulkan/Vulkan/{PipelineFragmentShadingRateStateCreateInfoKhrCombinerOps.gen.cs => PipelineFragmentShadingRateStateCreateInfoKHRCombinerOps.gen.cs} (97%) rename sources/Vulkan/Vulkan/Vulkan/{PipelinePropertiesIdentifierExtPipelineIdentifier.gen.cs => PipelinePropertiesIdentifierEXTPipelineIdentifier.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{RenderPassSubpassFeedbackInfoExtDescription.gen.cs => RenderPassSubpassFeedbackInfoEXTDescription.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{ShaderModuleIdentifierExtIdentifier.gen.cs => ShaderModuleIdentifierEXTIdentifier.gen.cs} (91%) rename sources/Vulkan/Vulkan/Vulkan/{ShaderStatisticsInfoAmdComputeWorkGroupSize.gen.cs => ShaderStatisticsInfoAMDComputeWorkGroupSize.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{TransformMatrixKhrMatrix.gen.cs => TransformMatrixKHRMatrix.gen.cs} (92%) rename sources/Vulkan/Vulkan/Vulkan/{VideoDecodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs => VideoDecodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{VideoDecodeVp9PictureInfoKhrReferenceNameSlotIndices.gen.cs => VideoDecodeVp9PictureInfoKHRReferenceNameSlotIndices.gen.cs} (90%) rename sources/Vulkan/Vulkan/Vulkan/{VideoEncodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs => VideoEncodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs} (90%) diff --git a/.silktouch/vulkan-clangsharp.stout b/.silktouch/vulkan-clangsharp.stout index d905b7ace2b508db95effb716e49e8612ea059d5..4680dfe9eb976dd6e3c4889582d21702172d1bea 100644 GIT binary patch delta 88865 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"Igi<_48l#QDG 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 ProcessAndGetNewAttributes( MethodDeclarationSyntax? methodDeclaration = null ) { - // Get the name of the identifier, preferring the native one if available // This name will be modified by the code below as different suffixes are identified - var trimmedName = attributeLists.GetNativeNameOrDefault(identifier); + var trimmedName = identifier.ToString(); if (trimHandleSuffix) { diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 1f26824f5b..0568abcb99 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -401,6 +401,7 @@ z.MethodKind is MethodKind.Constructor or MethodKind.Destructor ctx.SourceProject = proj; } + // TODO: Remove this method and unify the name processing code. /// /// Applies the prettify only pipeline. /// This currently consists of checking for name overrides first. @@ -455,7 +456,7 @@ NamePrettifier namePrettifier var result = name; result = nameAffixer.RemoveAffixes(result, container, name, null); result = namePrettifier.Prettify(result, allowAllCaps); - result = nameAffixer.ApplyAffixes(result, container, name, null); + result = nameAffixer.ApplyAffixes(result, container, name, null, null); result = NameUtils.PrefixIfStartsWithNumber(result); return result; @@ -1240,12 +1241,14 @@ public string RemoveAffixes( /// The container name. Either null or the containing type. /// The original name of the identifier. Either the type name or the member name. /// The list of secondary names. This should be null if used by . + /// The context containing the current names for the current container. /// The new primary name. public string ApplyAffixes( string primary, string? container, string originalName, - List? secondary + List? secondary, + NameProcessorContext? context // TODO: Handle this better. Exposing the entire context is excessive. ) { var affixes = GetAffixes(container, originalName); @@ -1333,15 +1336,28 @@ void CreateName(string name, Span currentAffixes) foreach (var affix in currentAffixes) { + var affixValue = affix.Affix; + if ( + affix.IsReference + && context.HasValue + && context.Value.Names.TryGetValue( + affixValue, + out var referencedCandidateNames + ) + ) + { + affixValue = referencedCandidateNames.Primary; + } + if (!GetConfiguration(affix).Remove) { if (affix.Type == NameAffixType.Prefix) { - name = affix.Affix + name; + name = affixValue + name; } else { - name += affix.Affix; + name += affixValue; } } } @@ -1363,7 +1379,7 @@ void CreateName(string name, Span currentAffixes) /// The container name. Either null or the containing type. /// The original name of the identifier. Either the type name or the member name. /// The name affixes for the specified identifier. - private NameAffix[] GetAffixes(string? container, string originalName) + public NameAffix[] GetAffixes(string? container, string originalName) { TypeAffixData typeAffixData; if (container == null) @@ -1404,18 +1420,6 @@ private class StripAffixesProcessor(PrettifyNamesAffixer affixer) : INameProcess { public void ProcessNames(NameProcessorContext context) { - if (context.Container == null) - { - foreach (var (original, (primary, secondary)) in context.Names) - { - var secondaries = secondary; - var newPrimary = affixer.RemoveAffixes(primary, null, original, secondaries); - context.Names[original] = new CandidateNames(newPrimary, secondaries); - } - - return; - } - foreach (var (original, (primary, secondary)) in context.Names) { var secondaries = secondary; @@ -1425,6 +1429,7 @@ public void ProcessNames(NameProcessorContext context) original, secondaries ); + context.Names[original] = new CandidateNames(newPrimary, secondaries); } } @@ -1459,27 +1464,25 @@ private class ReapplyAffixesProcessor(PrettifyNamesAffixer affixer) : INameProce { public void ProcessNames(NameProcessorContext context) { - if (context.Container == null) - { - foreach (var (original, (primary, secondary)) in context.Names) - { - var secondaries = secondary; - var newPrimary = affixer.ApplyAffixes(primary, null, original, secondaries); - context.Names[original] = new CandidateNames(newPrimary, secondaries); - } - - return; - } + var processingOrder = context + .Names.Keys.OrderBy(original => + affixer.GetAffixes(context.Container, original).Any(x => x.IsReference) + ) + .ToArray(); - foreach (var (original, (primary, secondary)) in context.Names) + foreach (var original in processingOrder) { + var (primary, secondary) = context.Names[original]; + var secondaries = secondary; var newPrimary = affixer.ApplyAffixes( primary, context.Container, original, - secondaries + secondaries, + context ); + context.Names[original] = new CandidateNames(newPrimary, secondaries); } } diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXT.gen.cs index 13b4dabafe..77a76d9b27 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXT.gen.cs @@ -26,5 +26,5 @@ public unsafe partial struct DebugMarkerMarkerInfoEXT [NativeName("color")] [SupportedApiProfile("vulkan", ["VK_EXT_debug_marker"], ImpliesSets = ["VK_EXT_debug_report"])] - public DebugMarkerMarkerInfoExtColor Color; + public DebugMarkerMarkerInfoEXTColor Color; } diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoExtColor.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXTColor.gen.cs similarity index 91% rename from sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoExtColor.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXTColor.gen.cs index a087892818..d5f5533600 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoExtColor.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugMarkerMarkerInfoEXTColor.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_color_e__FixedBuffer")] [InlineArray(4)] [SupportedApiProfile("vulkan")] -public partial struct DebugMarkerMarkerInfoExtColor +public partial struct DebugMarkerMarkerInfoEXTColor { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXT.gen.cs index 1fbcc76130..17ca5c46b9 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXT.gen.cs @@ -52,7 +52,7 @@ public DebugReportCallbackEXT( ) => Pointer = ptr; [SupportedApiProfile("vulkan", ["VK_EXT_debug_report"])] - public DebugReportCallbackEXT(DebugReportCallbackDelegateEXT proc) => + public DebugReportCallbackEXT(DebugReportCallbackEXTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); [SupportedApiProfile("vulkan", ["VK_EXT_debug_report"])] diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackDelegateEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXTDelegate.gen.cs similarity index 91% rename from sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackDelegateEXT.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXTDelegate.gen.cs index 6d5f18666f..1fc82b973b 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackDelegateEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugReportCallbackEXTDelegate.gen.cs @@ -10,7 +10,7 @@ namespace Silk.NET.Vulkan; [NativeName("PFN_vkDebugReportCallbackEXT")] [SupportedApiProfile("vulkan")] -public unsafe delegate uint DebugReportCallbackDelegateEXT( +public unsafe delegate uint DebugReportCallbackEXTDelegate( DebugReportFlagsEXT arg0, DebugReportObjectTypeEXT arg1, ulong arg2, diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXT.gen.cs index 13684e4abe..ef3b1e23fd 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXT.gen.cs @@ -26,5 +26,5 @@ public unsafe partial struct DebugUtilsLabelEXT [NativeName("color")] [SupportedApiProfile("vulkan", ["VK_EXT_debug_utils"])] - public DebugUtilsLabelExtColor Color; + public DebugUtilsLabelEXTColor Color; } diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelExtColor.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXTColor.gen.cs similarity index 92% rename from sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelExtColor.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXTColor.gen.cs index ead85ca18f..26aabcef9d 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelExtColor.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsLabelEXTColor.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_color_e__FixedBuffer")] [InlineArray(4)] [SupportedApiProfile("vulkan")] -public partial struct DebugUtilsLabelExtColor +public partial struct DebugUtilsLabelEXTColor { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXT.gen.cs index 282236565a..1ac52b77f8 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXT.gen.cs @@ -40,7 +40,7 @@ public DebugUtilsMessengerCallbackEXT( ) => Pointer = ptr; [SupportedApiProfile("vulkan", ["VK_EXT_debug_utils"])] - public DebugUtilsMessengerCallbackEXT(DebugUtilsMessengerCallbackDelegateEXT proc) => + public DebugUtilsMessengerCallbackEXT(DebugUtilsMessengerCallbackEXTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); [SupportedApiProfile("vulkan", ["VK_EXT_debug_utils"])] diff --git a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackDelegateEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXTDelegate.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackDelegateEXT.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXTDelegate.gen.cs index 91a410e8c5..4b0d3d12ee 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackDelegateEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DebugUtilsMessengerCallbackEXTDelegate.gen.cs @@ -10,7 +10,7 @@ namespace Silk.NET.Vulkan; [NativeName("PFN_vkDebugUtilsMessengerCallbackEXT")] [SupportedApiProfile("vulkan")] -public unsafe delegate uint DebugUtilsMessengerCallbackDelegateEXT( +public unsafe delegate uint DebugUtilsMessengerCallbackEXTDelegate( DebugUtilsMessageSeverityFlagsEXT arg0, DebugUtilsMessageTypeFlagsEXT arg1, DebugUtilsMessengerCallbackDataEXT* arg2, diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXT.gen.cs index c241a1bc4d..0428db281f 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXT.gen.cs @@ -42,7 +42,7 @@ public unsafe partial struct DeviceFaultInfoEXT "VK_EXT_device_fault+VK_VERSION_1_1", ] )] - public DeviceFaultInfoExtDescription Description; + public DeviceFaultInfoEXTDescription Description; [NativeName("pAddressInfos")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoExtDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXTDescription.gen.cs similarity index 92% rename from sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoExtDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXTDescription.gen.cs index c4cbc58aa9..a2f27be648 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoExtDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultInfoEXTDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct DeviceFaultInfoExtDescription +public partial struct DeviceFaultInfoEXTDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXT.gen.cs index 0a7a83c41a..603198dba3 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXT.gen.cs @@ -75,7 +75,7 @@ public partial struct DeviceFaultVendorBinaryHeaderVersionOneEXT "VK_EXT_device_fault+VK_VERSION_1_1", ] )] - public DeviceFaultVendorBinaryHeaderVersionOneExtPipelineCacheUuid PipelineCacheUuid; + public DeviceFaultVendorBinaryHeaderVersionOneEXTPipelineCacheUuid PipelineCacheUuid; [NativeName("applicationNameOffset")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneExtPipelineCacheUuid.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXTPipelineCacheUuid.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneExtPipelineCacheUuid.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXTPipelineCacheUuid.gen.cs index ed9aa0c92f..6ce5eea9de 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneExtPipelineCacheUuid.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorBinaryHeaderVersionOneEXTPipelineCacheUuid.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_pipelineCacheUUID_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct DeviceFaultVendorBinaryHeaderVersionOneExtPipelineCacheUuid +public partial struct DeviceFaultVendorBinaryHeaderVersionOneEXTPipelineCacheUuid { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXT.gen.cs index b4e39a666c..753adcbc03 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXT.gen.cs @@ -21,7 +21,7 @@ public partial struct DeviceFaultVendorInfoEXT "VK_EXT_device_fault+VK_VERSION_1_1", ] )] - public DeviceFaultVendorInfoExtDescription Description; + public DeviceFaultVendorInfoEXTDescription Description; [NativeName("vendorFaultCode")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoExtDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXTDescription.gen.cs similarity index 91% rename from sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoExtDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXTDescription.gen.cs index f84c0d4223..6f754dab2e 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoExtDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceFaultVendorInfoEXTDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct DeviceFaultVendorInfoExtDescription +public partial struct DeviceFaultVendorInfoEXTDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHR.gen.cs index 44e75160f8..fed8459d69 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHR.gen.cs @@ -37,7 +37,7 @@ public unsafe partial struct DeviceGroupPresentCapabilitiesKHR ImpliesSets = ["VK_KHR_surface"], RequireAll = true )] - public DeviceGroupPresentCapabilitiesKhrPresentMask PresentMask; + public DeviceGroupPresentCapabilitiesKHRPresentMask PresentMask; [NativeName("modes")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKhrPresentMask.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHRPresentMask.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKhrPresentMask.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHRPresentMask.gen.cs index d6b865390b..ebee5fd756 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKhrPresentMask.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceGroupPresentCapabilitiesKHRPresentMask.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_presentMask_e__FixedBuffer")] [InlineArray(32)] [SupportedApiProfile("vulkan")] -public partial struct DeviceGroupPresentCapabilitiesKhrPresentMask +public partial struct DeviceGroupPresentCapabilitiesKHRPresentMask { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXT.gen.cs index 547894dd2f..9f9fa3e3e3 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXT.gen.cs @@ -53,7 +53,7 @@ public DeviceMemoryReportCallbackEXT( "VK_EXT_device_memory_report+VK_VERSION_1_1", ] )] - public DeviceMemoryReportCallbackEXT(DeviceMemoryReportCallbackDelegateEXT proc) => + public DeviceMemoryReportCallbackEXT(DeviceMemoryReportCallbackEXTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackDelegateEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXTDelegate.gen.cs similarity index 89% rename from sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackDelegateEXT.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXTDelegate.gen.cs index deaccc8c73..c5ca8bf774 100644 --- a/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackDelegateEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/DeviceMemoryReportCallbackEXTDelegate.gen.cs @@ -10,7 +10,7 @@ namespace Silk.NET.Vulkan; [NativeName("PFN_vkDeviceMemoryReportCallbackEXT")] [SupportedApiProfile("vulkan")] -public unsafe delegate void DeviceMemoryReportCallbackDelegateEXT( +public unsafe delegate void DeviceMemoryReportCallbackEXTDelegate( DeviceMemoryReportCallbackDataEXT* arg0, void* arg1 ); diff --git a/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARG.gen.cs b/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARG.gen.cs index efa078ca71..d6faa30480 100644 --- a/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARG.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARG.gen.cs @@ -25,7 +25,7 @@ public GetInstanceProcAddrLUNARG( ) => Pointer = ptr; [SupportedApiProfile("vulkan", ["VK_LUNARG_direct_driver_loading"])] - public GetInstanceProcAddrLUNARG(GetInstanceProcAddrDelegateLUNARG proc) => + public GetInstanceProcAddrLUNARG(GetInstanceProcAddrLUNARGDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); [SupportedApiProfile("vulkan", ["VK_LUNARG_direct_driver_loading"])] diff --git a/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrDelegateLUNARG.gen.cs b/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARGDelegate.gen.cs similarity index 96% rename from sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrDelegateLUNARG.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARGDelegate.gen.cs index 3a8b09e9da..2f7915729f 100644 --- a/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrDelegateLUNARG.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/GetInstanceProcAddrLUNARGDelegate.gen.cs @@ -10,7 +10,7 @@ namespace Silk.NET.Vulkan; [NativeName("PFN_vkGetInstanceProcAddrLUNARG")] [SupportedApiProfile("vulkan")] -public unsafe delegate GetInstanceProcAddrLunargP2 GetInstanceProcAddrDelegateLUNARG( +public unsafe delegate GetInstanceProcAddrLunargP2 GetInstanceProcAddrLUNARGDelegate( InstanceHandle arg0, sbyte* arg1 ); diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARM.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARM.gen.cs index dec072b919..b97c601f2f 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARM.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARM.gen.cs @@ -54,5 +54,5 @@ public unsafe partial struct PerformanceCounterDescriptionARM "VK_ARM_performance_counters_by_region+VK_VERSION_1_1", ] )] - public PerformanceCounterDescriptionArmName Name; + public PerformanceCounterDescriptionARMName Name; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionArmName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARMName.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionArmName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARMName.gen.cs index e20908c4ce..5a86dc4127 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionArmName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionARMName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_name_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PerformanceCounterDescriptionArmName +public partial struct PerformanceCounterDescriptionARMName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHR.gen.cs index 2eb342b252..d1652a9826 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHR.gen.cs @@ -53,7 +53,7 @@ public unsafe partial struct PerformanceCounterDescriptionKHR "VK_KHR_performance_query+VK_VERSION_1_1", ] )] - public PerformanceCounterDescriptionKhrName Name; + public PerformanceCounterDescriptionKHRName Name; [NativeName("category")] [SupportedApiProfile( @@ -64,7 +64,7 @@ public unsafe partial struct PerformanceCounterDescriptionKHR "VK_KHR_performance_query+VK_VERSION_1_1", ] )] - public PerformanceCounterDescriptionKhrCategory Category; + public PerformanceCounterDescriptionKHRCategory Category; [NativeName("description")] [SupportedApiProfile( @@ -75,5 +75,5 @@ public unsafe partial struct PerformanceCounterDescriptionKHR "VK_KHR_performance_query+VK_VERSION_1_1", ] )] - public PerformanceCounterDescriptionKhrDescription Description; + public PerformanceCounterDescriptionKHRDescription Description; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrCategory.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRCategory.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrCategory.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRCategory.gen.cs index ee58dfe571..41ebd3e9fe 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrCategory.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRCategory.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_category_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PerformanceCounterDescriptionKhrCategory +public partial struct PerformanceCounterDescriptionKHRCategory { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRDescription.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRDescription.gen.cs index e3dfc1c0dd..8a1728d76d 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PerformanceCounterDescriptionKhrDescription +public partial struct PerformanceCounterDescriptionKHRDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRName.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRName.gen.cs index a35447ccba..f58216aeb8 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKhrName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterDescriptionKHRName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_name_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PerformanceCounterDescriptionKhrName +public partial struct PerformanceCounterDescriptionKHRName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHR.gen.cs index 4802d80517..62d78a8919 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHR.gen.cs @@ -75,5 +75,5 @@ public unsafe partial struct PerformanceCounterKHR "VK_KHR_performance_query+VK_VERSION_1_1", ] )] - public PerformanceCounterKhrUuid Uuid; + public PerformanceCounterKHRUuid Uuid; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKhrUuid.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHRUuid.gen.cs similarity index 92% rename from sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKhrUuid.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHRUuid.gen.cs index 3a78cef254..dbb1421f79 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKhrUuid.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PerformanceCounterKHRUuid.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_uuid_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct PerformanceCounterKhrUuid +public partial struct PerformanceCounterKHRUuid { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEI.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEI.gen.cs index b92c913fde..77b0b6c226 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEI.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEI.gen.cs @@ -43,7 +43,7 @@ public unsafe partial struct PhysicalDeviceClusterCullingShaderPropertiesHUAWEI "VK_HUAWEI_cluster_culling_shader+VK_VERSION_1_1", ] )] - public PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupCount MaxWorkGroupCount; + public PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupCount MaxWorkGroupCount; [NativeName("maxWorkGroupSize")] [SupportedApiProfile( @@ -54,7 +54,7 @@ public unsafe partial struct PhysicalDeviceClusterCullingShaderPropertiesHUAWEI "VK_HUAWEI_cluster_culling_shader+VK_VERSION_1_1", ] )] - public PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupSize MaxWorkGroupSize; + public PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupSize MaxWorkGroupSize; [NativeName("maxOutputClusterCount")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupCount.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupCount.gen.cs similarity index 96% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupCount.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupCount.gen.cs index 48dab6dbde..b7d88a6160 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupCount.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupCount.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_maxWorkGroupCount_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupCount +public partial struct PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupCount { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupSize.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupSize.gen.cs similarity index 96% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupSize.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupSize.gen.cs index 0485b6731f..65713a1cec 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupSize.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupSize.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_maxWorkGroupSize_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceClusterCullingShaderPropertiesHuaweiMaxWorkGroupSize +public partial struct PhysicalDeviceClusterCullingShaderPropertiesHUAWEIMaxWorkGroupSize { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARM.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARM.gen.cs index 8ba7a9716d..61f19560dd 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARM.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARM.gen.cs @@ -26,7 +26,7 @@ public partial struct PhysicalDeviceDataGraphOperationSupportARM ["VK_ARM_data_graph"], ImpliesSets = ["VK_KHR_deferred_host_operations", "VK_KHR_maintenance5", "VK_VERSION_1_3"] )] - public PhysicalDeviceDataGraphOperationSupportArmName Name; + public PhysicalDeviceDataGraphOperationSupportARMName Name; [NativeName("version")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportArmName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARMName.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportArmName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARMName.gen.cs index 2576ec8325..d9e71b528e 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportArmName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceDataGraphOperationSupportARMName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_name_e__FixedBuffer")] [InlineArray(128)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceDataGraphOperationSupportArmName +public partial struct PhysicalDeviceDataGraphOperationSupportARMName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHR.gen.cs index 1c49013c9e..8cdd72e207 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHR.gen.cs @@ -34,5 +34,5 @@ public unsafe partial struct PhysicalDeviceLayeredApiPropertiesKHR [NativeName("deviceName")] [SupportedApiProfile("vulkan", ["VK_KHR_maintenance7"], ImpliesSets = ["VK_VERSION_1_1"])] - public PhysicalDeviceLayeredApiPropertiesKhrDeviceName DeviceName; + public PhysicalDeviceLayeredApiPropertiesKHRDeviceName DeviceName; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKhrDeviceName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHRDeviceName.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKhrDeviceName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHRDeviceName.gen.cs index 865e576fb0..22f7aac188 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKhrDeviceName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceLayeredApiPropertiesKHRDeviceName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_deviceName_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceLayeredApiPropertiesKhrDeviceName +public partial struct PhysicalDeviceLayeredApiPropertiesKHRDeviceName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs index c90d993fb7..2ad35cf788 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs @@ -43,7 +43,7 @@ public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT "VK_EXT_memory_budget+VK_VERSION_1_1", ] )] - public PhysicalDeviceMemoryBudgetPropertiesExtHeapBudget HeapBudget; + public PhysicalDeviceMemoryBudgetPropertiesEXTHeapBudget HeapBudget; [NativeName("heapUsage")] [SupportedApiProfile( @@ -54,5 +54,5 @@ public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT "VK_EXT_memory_budget+VK_VERSION_1_1", ] )] - public PhysicalDeviceMemoryBudgetPropertiesExtHeapUsage HeapUsage; + public PhysicalDeviceMemoryBudgetPropertiesEXTHeapUsage HeapUsage; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesExtHeapBudget.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXTHeapBudget.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesExtHeapBudget.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXTHeapBudget.gen.cs index 894f05aec0..ad7dd9f29d 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesExtHeapBudget.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXTHeapBudget.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_heapBudget_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceMemoryBudgetPropertiesExtHeapBudget +public partial struct PhysicalDeviceMemoryBudgetPropertiesEXTHeapBudget { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesExtHeapUsage.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXTHeapUsage.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesExtHeapUsage.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXTHeapUsage.gen.cs index d0a0f80ac0..0e4dba1860 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesExtHeapUsage.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMemoryBudgetPropertiesEXTHeapUsage.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_heapUsage_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceMemoryBudgetPropertiesExtHeapUsage +public partial struct PhysicalDeviceMemoryBudgetPropertiesEXTHeapUsage { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXT.gen.cs index cc7a986b13..e0de0c0c94 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXT.gen.cs @@ -42,7 +42,7 @@ public unsafe partial struct PhysicalDeviceMeshShaderPropertiesEXT ["VK_EXT_mesh_shader"], ImpliesSets = ["VK_EXT_mesh_shader+VK_KHR_spirv_1_4", "VK_EXT_mesh_shader+VK_VERSION_1_2"] )] - public PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupCount MaxTaskWorkGroupCount; + public PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupCount MaxTaskWorkGroupCount; [NativeName("maxTaskWorkGroupInvocations")] [SupportedApiProfile( @@ -58,7 +58,7 @@ public unsafe partial struct PhysicalDeviceMeshShaderPropertiesEXT ["VK_EXT_mesh_shader"], ImpliesSets = ["VK_EXT_mesh_shader+VK_KHR_spirv_1_4", "VK_EXT_mesh_shader+VK_VERSION_1_2"] )] - public PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupSize MaxTaskWorkGroupSize; + public PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupSize MaxTaskWorkGroupSize; [NativeName("maxTaskPayloadSize")] [SupportedApiProfile( @@ -98,7 +98,7 @@ public unsafe partial struct PhysicalDeviceMeshShaderPropertiesEXT ["VK_EXT_mesh_shader"], ImpliesSets = ["VK_EXT_mesh_shader+VK_KHR_spirv_1_4", "VK_EXT_mesh_shader+VK_VERSION_1_2"] )] - public PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupCount MaxMeshWorkGroupCount; + public PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupCount MaxMeshWorkGroupCount; [NativeName("maxMeshWorkGroupInvocations")] [SupportedApiProfile( @@ -114,7 +114,7 @@ public unsafe partial struct PhysicalDeviceMeshShaderPropertiesEXT ["VK_EXT_mesh_shader"], ImpliesSets = ["VK_EXT_mesh_shader+VK_KHR_spirv_1_4", "VK_EXT_mesh_shader+VK_VERSION_1_2"] )] - public PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupSize MaxMeshWorkGroupSize; + public PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupSize MaxMeshWorkGroupSize; [NativeName("maxMeshSharedMemorySize")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupCount.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupCount.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupCount.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupCount.gen.cs index d1f2310b36..977a31b1fa 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupCount.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupCount.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_maxMeshWorkGroupCount_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupCount +public partial struct PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupCount { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupSize.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupSize.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupSize.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupSize.gen.cs index 12961ac8a9..b30925a2a9 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupSize.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupSize.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_maxMeshWorkGroupSize_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceMeshShaderPropertiesExtMaxMeshWorkGroupSize +public partial struct PhysicalDeviceMeshShaderPropertiesEXTMaxMeshWorkGroupSize { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupCount.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupCount.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupCount.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupCount.gen.cs index a557c05273..e41d505b44 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupCount.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupCount.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_maxTaskWorkGroupCount_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupCount +public partial struct PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupCount { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupSize.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupSize.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupSize.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupSize.gen.cs index b06d3e34c6..2f4d299bac 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupSize.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupSize.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_maxTaskWorkGroupSize_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceMeshShaderPropertiesExtMaxTaskWorkGroupSize +public partial struct PhysicalDeviceMeshShaderPropertiesEXTMaxTaskWorkGroupSize { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs index 5ab9bde64a..3d88b2a27e 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs @@ -65,7 +65,7 @@ public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT "VK_EXT_sample_locations+VK_VERSION_1_1", ] )] - public PhysicalDeviceSampleLocationsPropertiesExtSampleLocationCoordinateRange SampleLocationCoordinateRange; + public PhysicalDeviceSampleLocationsPropertiesEXTSampleLocationCoordinateRange SampleLocationCoordinateRange; [NativeName("sampleLocationSubPixelBits")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesExtSampleLocationCoordinateRange.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXTSampleLocationCoordinateRange.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesExtSampleLocationCoordinateRange.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXTSampleLocationCoordinateRange.gen.cs index 3417743e63..4d369f33c8 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesExtSampleLocationCoordinateRange.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceSampleLocationsPropertiesEXTSampleLocationCoordinateRange.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_sampleLocationCoordinateRange_e__FixedBuffer")] [InlineArray(2)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceSampleLocationsPropertiesExtSampleLocationCoordinateRange +public partial struct PhysicalDeviceSampleLocationsPropertiesEXTSampleLocationCoordinateRange { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXT.gen.cs index 0b5368f576..d5a8af6c6a 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXT.gen.cs @@ -46,5 +46,5 @@ public unsafe partial struct PhysicalDeviceShaderModuleIdentifierPropertiesEXT "VK_VERSION_1_3", ] )] - public PhysicalDeviceShaderModuleIdentifierPropertiesExtShaderModuleIdentifierAlgorithmUuid ShaderModuleIdentifierAlgorithmUuid; + public PhysicalDeviceShaderModuleIdentifierPropertiesEXTShaderModuleIdentifierAlgorithmUuid ShaderModuleIdentifierAlgorithmUuid; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesExtShaderModuleIdentifierAlgorithmUuid.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXTShaderModuleIdentifierAlgorithmUuid.gen.cs similarity index 94% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesExtShaderModuleIdentifierAlgorithmUuid.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXTShaderModuleIdentifierAlgorithmUuid.gen.cs index a424c4fe84..f9eef0036e 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesExtShaderModuleIdentifierAlgorithmUuid.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderModuleIdentifierPropertiesEXTShaderModuleIdentifierAlgorithmUuid.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_shaderModuleIdentifierAlgorithmUUID_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceShaderModuleIdentifierPropertiesExtShaderModuleIdentifierAlgorithmUuid +public partial struct PhysicalDeviceShaderModuleIdentifierPropertiesEXTShaderModuleIdentifierAlgorithmUuid { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXT.gen.cs index fae13ddf43..69948c0476 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXT.gen.cs @@ -46,7 +46,7 @@ public unsafe partial struct PhysicalDeviceShaderObjectPropertiesEXT "VK_VERSION_1_3", ] )] - public PhysicalDeviceShaderObjectPropertiesExtShaderBinaryUuid ShaderBinaryUuid; + public PhysicalDeviceShaderObjectPropertiesEXTShaderBinaryUuid ShaderBinaryUuid; [NativeName("shaderBinaryVersion")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesExtShaderBinaryUuid.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXTShaderBinaryUuid.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesExtShaderBinaryUuid.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXTShaderBinaryUuid.gen.cs index d5d7775d49..158faa64c8 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesExtShaderBinaryUuid.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PhysicalDeviceShaderObjectPropertiesEXTShaderBinaryUuid.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_shaderBinaryUUID_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct PhysicalDeviceShaderObjectPropertiesExtShaderBinaryUuid +public partial struct PhysicalDeviceShaderObjectPropertiesEXTShaderBinaryUuid { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHR.gen.cs index 1b625fb2ad..8277e212c0 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHR.gen.cs @@ -54,5 +54,5 @@ public unsafe partial struct PipelineBinaryKeyKHR "VK_KHR_pipeline_binary+VK_VERSION_1_4", ] )] - public PipelineBinaryKeyKhrKey Key; + public PipelineBinaryKeyKHRKey Key; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKhrKey.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHRKey.gen.cs similarity index 92% rename from sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKhrKey.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHRKey.gen.cs index 2ebcc9e12b..64cc2768fe 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKhrKey.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineBinaryKeyKHRKey.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_key_e__FixedBuffer")] [InlineArray(32)] [SupportedApiProfile("vulkan")] -public partial struct PipelineBinaryKeyKhrKey +public partial struct PipelineBinaryKeyKHRKey { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOM.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOM.gen.cs index 4fd572d78c..a11b1850c3 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOM.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOM.gen.cs @@ -49,5 +49,5 @@ public partial struct PipelineCacheHeaderVersionDataGraphQCOM ["VK_QCOM_data_graph_model"], ImpliesSets = ["VK_ARM_data_graph"] )] - public PipelineCacheHeaderVersionDataGraphQcomToolchainVersion ToolchainVersion; + public PipelineCacheHeaderVersionDataGraphQCOMToolchainVersion ToolchainVersion; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQcomToolchainVersion.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOMToolchainVersion.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQcomToolchainVersion.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOMToolchainVersion.gen.cs index 6b3d5605f2..deb955425d 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQcomToolchainVersion.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineCacheHeaderVersionDataGraphQCOMToolchainVersion.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_toolchainVersion_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct PipelineCacheHeaderVersionDataGraphQcomToolchainVersion +public partial struct PipelineCacheHeaderVersionDataGraphQCOMToolchainVersion { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHR.gen.cs index 185d3d494a..2bacc42a67 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHR.gen.cs @@ -42,7 +42,7 @@ public unsafe partial struct PipelineExecutableInternalRepresentationKHR "VK_KHR_pipeline_executable_properties+VK_VERSION_1_1", ] )] - public PipelineExecutableInternalRepresentationKhrName Name; + public PipelineExecutableInternalRepresentationKHRName Name; [NativeName("description")] [SupportedApiProfile( @@ -53,7 +53,7 @@ public unsafe partial struct PipelineExecutableInternalRepresentationKHR "VK_KHR_pipeline_executable_properties+VK_VERSION_1_1", ] )] - public PipelineExecutableInternalRepresentationKhrDescription Description; + public PipelineExecutableInternalRepresentationKHRDescription Description; [NativeName("isText")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKhrDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHRDescription.gen.cs similarity index 88% rename from sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKhrDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHRDescription.gen.cs index 312e53184c..c67b997886 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKhrDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHRDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PipelineExecutableInternalRepresentationKhrDescription +public partial struct PipelineExecutableInternalRepresentationKHRDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKhrName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHRName.gen.cs similarity index 89% rename from sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKhrName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHRName.gen.cs index 0349deb036..b6a86fbd66 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKhrName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableInternalRepresentationKHRName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_name_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PipelineExecutableInternalRepresentationKhrName +public partial struct PipelineExecutableInternalRepresentationKHRName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHR.gen.cs index f3df15140f..39c513e0de 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHR.gen.cs @@ -54,7 +54,7 @@ public unsafe partial struct PipelineExecutablePropertiesKHR "VK_KHR_pipeline_executable_properties+VK_VERSION_1_1", ] )] - public PipelineExecutablePropertiesKhrName Name; + public PipelineExecutablePropertiesKHRName Name; [NativeName("description")] [SupportedApiProfile( @@ -65,7 +65,7 @@ public unsafe partial struct PipelineExecutablePropertiesKHR "VK_KHR_pipeline_executable_properties+VK_VERSION_1_1", ] )] - public PipelineExecutablePropertiesKhrDescription Description; + public PipelineExecutablePropertiesKHRDescription Description; [NativeName("subgroupSize")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKhrDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHRDescription.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKhrDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHRDescription.gen.cs index 98a785eccc..5087c7a96f 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKhrDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHRDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PipelineExecutablePropertiesKhrDescription +public partial struct PipelineExecutablePropertiesKHRDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKhrName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHRName.gen.cs similarity index 91% rename from sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKhrName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHRName.gen.cs index 2ef8155c5c..34610b935b 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKhrName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutablePropertiesKHRName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_name_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PipelineExecutablePropertiesKhrName +public partial struct PipelineExecutablePropertiesKHRName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHR.gen.cs index afd8dd8105..68684fac74 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHR.gen.cs @@ -43,7 +43,7 @@ public unsafe partial struct PipelineExecutableStatisticKHR "VK_KHR_pipeline_executable_properties+VK_VERSION_1_1", ] )] - public PipelineExecutableStatisticKhrName Name; + public PipelineExecutableStatisticKHRName Name; [NativeName("description")] [SupportedApiProfile( @@ -54,7 +54,7 @@ public unsafe partial struct PipelineExecutableStatisticKHR "VK_KHR_pipeline_executable_properties+VK_VERSION_1_1", ] )] - public PipelineExecutableStatisticKhrDescription Description; + public PipelineExecutableStatisticKHRDescription Description; [NativeName("format")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKhrDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHRDescription.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKhrDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHRDescription.gen.cs index f0ac80cbde..415856170c 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKhrDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHRDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PipelineExecutableStatisticKhrDescription +public partial struct PipelineExecutableStatisticKHRDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKhrName.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHRName.gen.cs similarity index 91% rename from sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKhrName.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHRName.gen.cs index a375d53881..83ad7e8b27 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKhrName.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineExecutableStatisticKHRName.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_name_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct PipelineExecutableStatisticKhrName +public partial struct PipelineExecutableStatisticKHRName { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs index 6bbf687e7a..501fbdc92e 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs @@ -58,5 +58,5 @@ public unsafe partial struct PipelineFragmentShadingRateStateCreateInfoKHR "VK_VERSION_1_2", ] )] - public PipelineFragmentShadingRateStateCreateInfoKhrCombinerOps CombinerOps; + public PipelineFragmentShadingRateStateCreateInfoKHRCombinerOps CombinerOps; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKhrCombinerOps.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHRCombinerOps.gen.cs similarity index 97% rename from sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKhrCombinerOps.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHRCombinerOps.gen.cs index 610ce41098..09d0f5a570 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKhrCombinerOps.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelineFragmentShadingRateStateCreateInfoKHRCombinerOps.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_combinerOps_e__FixedBuffer")] [InlineArray(2)] [SupportedApiProfile("vulkan")] -public partial struct PipelineFragmentShadingRateStateCreateInfoKhrCombinerOps +public partial struct PipelineFragmentShadingRateStateCreateInfoKHRCombinerOps { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXT.gen.cs index 3399de1e61..033a8f07e2 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXT.gen.cs @@ -42,5 +42,5 @@ public unsafe partial struct PipelinePropertiesIdentifierEXT "VK_EXT_pipeline_properties+VK_VERSION_1_1", ] )] - public PipelinePropertiesIdentifierExtPipelineIdentifier PipelineIdentifier; + public PipelinePropertiesIdentifierEXTPipelineIdentifier PipelineIdentifier; } diff --git a/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierExtPipelineIdentifier.gen.cs b/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXTPipelineIdentifier.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierExtPipelineIdentifier.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXTPipelineIdentifier.gen.cs index 5ea1bbef40..094bcb22ea 100644 --- a/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierExtPipelineIdentifier.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/PipelinePropertiesIdentifierEXTPipelineIdentifier.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_pipelineIdentifier_e__FixedBuffer")] [InlineArray(16)] [SupportedApiProfile("vulkan")] -public partial struct PipelinePropertiesIdentifierExtPipelineIdentifier +public partial struct PipelinePropertiesIdentifierEXTPipelineIdentifier { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXT.gen.cs index e438d100dc..0b5bac773a 100644 --- a/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXT.gen.cs @@ -31,7 +31,7 @@ public partial struct RenderPassSubpassFeedbackInfoEXT "VK_EXT_subpass_merge_feedback+VK_VERSION_1_1", ] )] - public RenderPassSubpassFeedbackInfoExtDescription Description; + public RenderPassSubpassFeedbackInfoEXTDescription Description; [NativeName("postMergeIndex")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoExtDescription.gen.cs b/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXTDescription.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoExtDescription.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXTDescription.gen.cs index 5fe2577487..524f869655 100644 --- a/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoExtDescription.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/RenderPassSubpassFeedbackInfoEXTDescription.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_description_e__FixedBuffer")] [InlineArray(256)] [SupportedApiProfile("vulkan")] -public partial struct RenderPassSubpassFeedbackInfoExtDescription +public partial struct RenderPassSubpassFeedbackInfoEXTDescription { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXT.gen.cs b/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXT.gen.cs index 03390913c3..fd46feafdb 100644 --- a/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXT.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXT.gen.cs @@ -58,5 +58,5 @@ public unsafe partial struct ShaderModuleIdentifierEXT "VK_VERSION_1_3", ] )] - public ShaderModuleIdentifierExtIdentifier Identifier; + public ShaderModuleIdentifierEXTIdentifier Identifier; } diff --git a/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierExtIdentifier.gen.cs b/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXTIdentifier.gen.cs similarity index 91% rename from sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierExtIdentifier.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXTIdentifier.gen.cs index 0bdc1fbe07..bd65d09623 100644 --- a/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierExtIdentifier.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/ShaderModuleIdentifierEXTIdentifier.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_identifier_e__FixedBuffer")] [InlineArray(32)] [SupportedApiProfile("vulkan")] -public partial struct ShaderModuleIdentifierExtIdentifier +public partial struct ShaderModuleIdentifierEXTIdentifier { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMD.gen.cs b/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMD.gen.cs index ff42a5f68d..90b1d3d7e1 100644 --- a/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMD.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMD.gen.cs @@ -38,5 +38,5 @@ public partial struct ShaderStatisticsInfoAMD [NativeName("computeWorkGroupSize")] [SupportedApiProfile("vulkan", ["VK_AMD_shader_info"])] - public ShaderStatisticsInfoAmdComputeWorkGroupSize ComputeWorkGroupSize; + public ShaderStatisticsInfoAMDComputeWorkGroupSize ComputeWorkGroupSize; } diff --git a/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAmdComputeWorkGroupSize.gen.cs b/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMDComputeWorkGroupSize.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAmdComputeWorkGroupSize.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMDComputeWorkGroupSize.gen.cs index 27cb1d8d62..bd4f621b25 100644 --- a/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAmdComputeWorkGroupSize.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/ShaderStatisticsInfoAMDComputeWorkGroupSize.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_computeWorkGroupSize_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct ShaderStatisticsInfoAmdComputeWorkGroupSize +public partial struct ShaderStatisticsInfoAMDComputeWorkGroupSize { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHR.gen.cs index f4738cc432..d607fcd235 100644 --- a/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHR.gen.cs @@ -21,5 +21,5 @@ public partial struct TransformMatrixKHR "VK_KHR_deferred_host_operations+VK_VERSION_1_2", ] )] - public TransformMatrixKhrMatrix Matrix; + public TransformMatrixKHRMatrix Matrix; } diff --git a/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKhrMatrix.gen.cs b/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHRMatrix.gen.cs similarity index 92% rename from sources/Vulkan/Vulkan/Vulkan/TransformMatrixKhrMatrix.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHRMatrix.gen.cs index 4e4539a9a0..50e6bcdcfc 100644 --- a/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKhrMatrix.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/TransformMatrixKHRMatrix.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_matrix_e__FixedBuffer")] [InlineArray(3 * 4)] [SupportedApiProfile("vulkan")] -public partial struct TransformMatrixKhrMatrix +public partial struct TransformMatrixKHRMatrix { [NativeName("e0_0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHR.gen.cs index 5a0f43fb19..90fbb40509 100644 --- a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHR.gen.cs @@ -42,7 +42,7 @@ public unsafe partial struct VideoDecodeAv1PictureInfoKHR ["VK_KHR_video_decode_av1"], ImpliesSets = ["VK_KHR_video_decode_queue"] )] - public VideoDecodeAv1PictureInfoKhrReferenceNameSlotIndices ReferenceNameSlotIndices; + public VideoDecodeAv1PictureInfoKHRReferenceNameSlotIndices ReferenceNameSlotIndices; [NativeName("frameHeaderOffset")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs index 2366c0fb58..b2393cbd5f 100644 --- a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_referenceNameSlotIndices_e__FixedBuffer")] [InlineArray(7)] [SupportedApiProfile("vulkan")] -public partial struct VideoDecodeAv1PictureInfoKhrReferenceNameSlotIndices +public partial struct VideoDecodeAv1PictureInfoKHRReferenceNameSlotIndices { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHR.gen.cs index 5d182704e4..c6a7ff5ab9 100644 --- a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHR.gen.cs @@ -41,7 +41,7 @@ public unsafe partial struct VideoDecodeVp9PictureInfoKHR ["VK_KHR_video_decode_vp9"], ImpliesSets = ["VK_KHR_video_decode_queue"] )] - public VideoDecodeVp9PictureInfoKhrReferenceNameSlotIndices ReferenceNameSlotIndices; + public VideoDecodeVp9PictureInfoKHRReferenceNameSlotIndices ReferenceNameSlotIndices; [NativeName("uncompressedHeaderOffset")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKhrReferenceNameSlotIndices.gen.cs b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHRReferenceNameSlotIndices.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKhrReferenceNameSlotIndices.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHRReferenceNameSlotIndices.gen.cs index 440db46db7..78b884b45f 100644 --- a/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKhrReferenceNameSlotIndices.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/VideoDecodeVp9PictureInfoKHRReferenceNameSlotIndices.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_referenceNameSlotIndices_e__FixedBuffer")] [InlineArray(3)] [SupportedApiProfile("vulkan")] -public partial struct VideoDecodeVp9PictureInfoKhrReferenceNameSlotIndices +public partial struct VideoDecodeVp9PictureInfoKHRReferenceNameSlotIndices { [NativeName("e0")] [SupportedApiProfile("vulkan")] diff --git a/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHR.gen.cs b/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHR.gen.cs index dbf5460fb2..ef8754bab0 100644 --- a/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHR.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHR.gen.cs @@ -65,7 +65,7 @@ public unsafe partial struct VideoEncodeAv1PictureInfoKHR ["VK_KHR_video_encode_av1"], ImpliesSets = ["VK_KHR_video_encode_queue"] )] - public VideoEncodeAv1PictureInfoKhrReferenceNameSlotIndices ReferenceNameSlotIndices; + public VideoEncodeAv1PictureInfoKHRReferenceNameSlotIndices ReferenceNameSlotIndices; [NativeName("primaryReferenceCdfOnly")] [SupportedApiProfile( diff --git a/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs b/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs similarity index 90% rename from sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs rename to sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs index d166afde1d..10a02cf16c 100644 --- a/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKhrReferenceNameSlotIndices.gen.cs +++ b/sources/Vulkan/Vulkan/Vulkan/VideoEncodeAv1PictureInfoKHRReferenceNameSlotIndices.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.Vulkan; [NativeName("_referenceNameSlotIndices_e__FixedBuffer")] [InlineArray(7)] [SupportedApiProfile("vulkan")] -public partial struct VideoEncodeAv1PictureInfoKhrReferenceNameSlotIndices +public partial struct VideoEncodeAv1PictureInfoKHRReferenceNameSlotIndices { [NativeName("e0")] [SupportedApiProfile("vulkan")] From 5a4b6cd8096814ccf494b980256bbd3fa6654440 Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 17:47:34 -0400 Subject: [PATCH 27/36] Update OpenAL name overrides in generator.json This is because we no longer output the separating underscore in ExtractNestedTyping --- generator.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generator.json b/generator.json index 54df300afb..d36945f211 100644 --- a/generator.json +++ b/generator.json @@ -300,8 +300,8 @@ "NameOverrides": { "ALContext": "ALContext", "EFXEAXREVERBPROPERTIES": "EfxEaxReverbProperties", - "EFXEAXREVERBPROPERTIES_flReflectionsPan": "EfxEaxReverbPropertiesFlReflectionsPan", - "EFXEAXREVERBPROPERTIES_flLateReverbPan": "EfxEaxReverbPropertiesFlLateReverbPan", + "EFXEAXREVERBPROPERTIESflReflectionsPan": "EfxEaxReverbPropertiesFlReflectionsPan", + "EFXEAXREVERBPROPERTIESflLateReverbPan": "EfxEaxReverbPropertiesFlLateReverbPan", "ALCcontextHandle": "ContextHandle", "ALCdeviceHandle": "DeviceHandle", "ALBUFFERCALLBACKTYPESOFT": "BufferCallbackSOFT", From 16ba7eabcf4131381250579304913f29dfcf487b Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 17:57:59 -0400 Subject: [PATCH 28/36] Update doc comment in ServiceCollectionExtensions to indicate removal of INameTrimmer registrations --- sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs b/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs index 17265500d1..66bf03df6a 100644 --- a/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs +++ b/sources/SilkTouch/SilkTouch/ServiceCollectionExtensions.cs @@ -54,8 +54,6 @@ static ServiceCollectionExtensions() /// /// /// - /// - /// One or more s /// An appropriate implementation of /// Mod implementations referenced in the configurations /// From 86e12c48e8295aacbf7c788215831886ce1d81c4 Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 18:23:00 -0400 Subject: [PATCH 29/36] Update name overrides for OpenAL to match new Delegate type naming convention Note that the goal is to eventually remove the name overrides for the `EFXEAXREVERBPROPERTIESflLateReverbPan` and `-Delegate` cases entirely. This is because these are theoretically possible to handle automatically and the reason it doesn't work is due to an edge case interaction with the name override system. See the "Tasks" section here for more info: https://github.com/dotnet/Silk.NET/pull/2555 --- .silktouch/openal-clangsharp.stout | Bin 40930 -> 40930 bytes generator.json | 8 ++++---- .../OpenAL/al/BufferCallbackSOFT.gen.cs | 2 +- ...n.cs => BufferCallbackSOFTDelegate.gen.cs} | 2 +- .../OpenAL/al/ContextEventProcSOFT.gen.cs | 2 +- ...cs => ContextEventProcSOFTDelegate.gen.cs} | 2 +- sources/OpenAL/OpenAL/al/DebugProcEXT.gen.cs | 2 +- ...EXT.gen.cs => DebugProcEXTDelegate.gen.cs} | 2 +- sources/OpenAL/OpenAL/al/EventProcSOFT.gen.cs | 2 +- ...FT.gen.cs => EventProcSOFTDelegate.gen.cs} | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) rename sources/OpenAL/OpenAL/al/{BufferCallbackDelegateSOFT.gen.cs => BufferCallbackSOFTDelegate.gen.cs} (90%) rename sources/OpenAL/OpenAL/al/{ContextEventProcDelegateSOFT.gen.cs => ContextEventProcSOFTDelegate.gen.cs} (92%) rename sources/OpenAL/OpenAL/al/{DebugProcDelegateEXT.gen.cs => DebugProcEXTDelegate.gen.cs} (93%) rename sources/OpenAL/OpenAL/al/{EventProcDelegateSOFT.gen.cs => EventProcSOFTDelegate.gen.cs} (93%) diff --git a/.silktouch/openal-clangsharp.stout b/.silktouch/openal-clangsharp.stout index c00c2aa9e0f1c3c73c6201b020f40b5d4199cb19..fe7129046ae063b28f06579eaaab3f60fe925b22 100644 GIT binary patch delta 83 zcmaE~pXt$lCf)#VW)=|!CJqjU>`8SSd3|G;f%N9smRxGhLz^3r+s TVEXyIU@&bvKMYJyo9_bv;-(-~ delta 83 zcmaE~pXt$lCf)#VW)=|!CJqh;4*iOayuLBaKzeg*%mgMd<3rpG2%|eu+!iD ptr) => Pointer = ptr; - public BufferCallbackSOFT(BufferCallbackDelegateSOFT proc) => + public BufferCallbackSOFT(BufferCallbackSOFTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); public void Dispose() => SilkMarshal.Free(Pointer); diff --git a/sources/OpenAL/OpenAL/al/BufferCallbackDelegateSOFT.gen.cs b/sources/OpenAL/OpenAL/al/BufferCallbackSOFTDelegate.gen.cs similarity index 90% rename from sources/OpenAL/OpenAL/al/BufferCallbackDelegateSOFT.gen.cs rename to sources/OpenAL/OpenAL/al/BufferCallbackSOFTDelegate.gen.cs index 9304622154..00ceea77e9 100644 --- a/sources/OpenAL/OpenAL/al/BufferCallbackDelegateSOFT.gen.cs +++ b/sources/OpenAL/OpenAL/al/BufferCallbackSOFTDelegate.gen.cs @@ -11,4 +11,4 @@ namespace Silk.NET.OpenAL; [NativeName("ALBUFFERCALLBACKTYPESOFT")] -public unsafe delegate int BufferCallbackDelegateSOFT(void* arg0, void* arg1, int arg2); +public unsafe delegate int BufferCallbackSOFTDelegate(void* arg0, void* arg1, int arg2); diff --git a/sources/OpenAL/OpenAL/al/ContextEventProcSOFT.gen.cs b/sources/OpenAL/OpenAL/al/ContextEventProcSOFT.gen.cs index 36ccd70272..cc8b15a5c4 100644 --- a/sources/OpenAL/OpenAL/al/ContextEventProcSOFT.gen.cs +++ b/sources/OpenAL/OpenAL/al/ContextEventProcSOFT.gen.cs @@ -21,7 +21,7 @@ public ContextEventProcSOFT( delegate* unmanaged ptr ) => Pointer = ptr; - public ContextEventProcSOFT(ContextEventProcDelegateSOFT proc) => + public ContextEventProcSOFT(ContextEventProcSOFTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); public void Dispose() => SilkMarshal.Free(Pointer); diff --git a/sources/OpenAL/OpenAL/al/ContextEventProcDelegateSOFT.gen.cs b/sources/OpenAL/OpenAL/al/ContextEventProcSOFTDelegate.gen.cs similarity index 92% rename from sources/OpenAL/OpenAL/al/ContextEventProcDelegateSOFT.gen.cs rename to sources/OpenAL/OpenAL/al/ContextEventProcSOFTDelegate.gen.cs index 8bf39a4158..298338bc3a 100644 --- a/sources/OpenAL/OpenAL/al/ContextEventProcDelegateSOFT.gen.cs +++ b/sources/OpenAL/OpenAL/al/ContextEventProcSOFTDelegate.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.OpenAL; [NativeName("ALCEVENTPROCTYPESOFT")] -public unsafe delegate void ContextEventProcDelegateSOFT( +public unsafe delegate void ContextEventProcSOFTDelegate( int arg0, int arg1, DeviceHandle arg2, diff --git a/sources/OpenAL/OpenAL/al/DebugProcEXT.gen.cs b/sources/OpenAL/OpenAL/al/DebugProcEXT.gen.cs index 1c7f5c2f40..2e70e56727 100644 --- a/sources/OpenAL/OpenAL/al/DebugProcEXT.gen.cs +++ b/sources/OpenAL/OpenAL/al/DebugProcEXT.gen.cs @@ -20,7 +20,7 @@ namespace Silk.NET.OpenAL; public DebugProcEXT(delegate* unmanaged ptr) => Pointer = ptr; - public DebugProcEXT(DebugProcDelegateEXT proc) => Pointer = SilkMarshal.DelegateToPtr(proc); + public DebugProcEXT(DebugProcEXTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); public void Dispose() => SilkMarshal.Free(Pointer); diff --git a/sources/OpenAL/OpenAL/al/DebugProcDelegateEXT.gen.cs b/sources/OpenAL/OpenAL/al/DebugProcEXTDelegate.gen.cs similarity index 93% rename from sources/OpenAL/OpenAL/al/DebugProcDelegateEXT.gen.cs rename to sources/OpenAL/OpenAL/al/DebugProcEXTDelegate.gen.cs index 55d0dbf77f..2731ebb85e 100644 --- a/sources/OpenAL/OpenAL/al/DebugProcDelegateEXT.gen.cs +++ b/sources/OpenAL/OpenAL/al/DebugProcEXTDelegate.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.OpenAL; [NativeName("ALDEBUGPROCEXT")] -public unsafe delegate void DebugProcDelegateEXT( +public unsafe delegate void DebugProcEXTDelegate( int arg0, int arg1, uint arg2, diff --git a/sources/OpenAL/OpenAL/al/EventProcSOFT.gen.cs b/sources/OpenAL/OpenAL/al/EventProcSOFT.gen.cs index a9c1b55168..9bfa68cf4e 100644 --- a/sources/OpenAL/OpenAL/al/EventProcSOFT.gen.cs +++ b/sources/OpenAL/OpenAL/al/EventProcSOFT.gen.cs @@ -20,7 +20,7 @@ namespace Silk.NET.OpenAL; public EventProcSOFT(delegate* unmanaged ptr) => Pointer = ptr; - public EventProcSOFT(EventProcDelegateSOFT proc) => Pointer = SilkMarshal.DelegateToPtr(proc); + public EventProcSOFT(EventProcSOFTDelegate proc) => Pointer = SilkMarshal.DelegateToPtr(proc); public void Dispose() => SilkMarshal.Free(Pointer); diff --git a/sources/OpenAL/OpenAL/al/EventProcDelegateSOFT.gen.cs b/sources/OpenAL/OpenAL/al/EventProcSOFTDelegate.gen.cs similarity index 93% rename from sources/OpenAL/OpenAL/al/EventProcDelegateSOFT.gen.cs rename to sources/OpenAL/OpenAL/al/EventProcSOFTDelegate.gen.cs index 78284252ae..aeb235dd90 100644 --- a/sources/OpenAL/OpenAL/al/EventProcDelegateSOFT.gen.cs +++ b/sources/OpenAL/OpenAL/al/EventProcSOFTDelegate.gen.cs @@ -11,7 +11,7 @@ namespace Silk.NET.OpenAL; [NativeName("ALEVENTPROCSOFT")] -public unsafe delegate void EventProcDelegateSOFT( +public unsafe delegate void EventProcSOFTDelegate( int arg0, uint arg1, uint arg2, From 2ecb6b1f0a56356f673d03c25bddcb878d4e0977 Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 20:23:26 -0400 Subject: [PATCH 30/36] Optimize comparison by hoisting the calculation --- sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 0568abcb99..ac3636a476 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1439,11 +1439,11 @@ private class PrettifyProcessor(NamePrettifier namePrettifier) : INameProcessor { public void ProcessNames(NameProcessorContext context) { + // Be lenient about caps for type names (e.g. GL) + var allowAllCaps = context.Container == null; + foreach (var (original, (primary, secondary)) in context.Names) { - // Be lenient about caps for type names (e.g. GL) - var allowAllCaps = context.Container == null; - for (var i = 0; i < secondary.Count; i++) { secondary[i] = namePrettifier.Prettify(secondary[i], allowAllCaps); From 5788cb71c60daed2a75d9851a6ae2d484b2fa3de Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 20:44:32 -0400 Subject: [PATCH 31/36] Add topological sort to ReapplyAffixesProcessor This covers cases where there are multiple levels of nested structs, such as in SDL: GamepadBinding contains GamepadBindingInput which contains GamepadBindingInputAxis --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 82 +++++++++++++++++-- .../SilkTouch/SilkTouch/Naming/NameAffixer.cs | 3 - 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index ac3636a476..f38fd10ecd 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1464,13 +1464,83 @@ private class ReapplyAffixesProcessor(PrettifyNamesAffixer affixer) : INameProce { public void ProcessNames(NameProcessorContext context) { - var processingOrder = context - .Names.Keys.OrderBy(original => - affixer.GetAffixes(context.Container, original).Any(x => x.IsReference) - ) - .ToArray(); + // Calculate processing order using topological sort + var processingOrderByKey = new List(); + { + var ready = new Queue(); + var dependencyCountByKey = new Dictionary(); + var notifyDependantByKey = new Dictionary>(); + + // Build dependency graph + foreach (var key in context.Names.Keys) + { + var dependencyCount = 0; + + var affixes = affixer.GetAffixes(context.Container, key); + foreach (var affix in affixes) + { + if (!affix.IsReference) + { + continue; + } + + // Add as dependency + if (!notifyDependantByKey.TryGetValue(affix.Affix, out var dependants)) + { + notifyDependantByKey[affix.Affix] = dependants = []; + } + + dependants.Add(key); + dependencyCount++; + } + + if (dependencyCount == 0) + { + // No dependencies + ready.Enqueue(key); + continue; + } + + // Store dependency count + dependencyCountByKey.Add(key, dependencyCount); + } + + // Output final order + while (ready.TryDequeue(out var key)) + { + processingOrderByKey.Add(key); + if (notifyDependantByKey.TryGetValue(key, out var dependants)) + { + foreach (var dependant in dependants) + { + if ( + dependencyCountByKey.TryGetValue(dependant, out var dependencyCount) + ) + { + dependencyCount--; + if (dependencyCount == 0) + { + ready.Enqueue(dependant); + dependencyCountByKey.Remove(dependant); + continue; + } + + dependencyCountByKey[dependant] = dependencyCount; + } + } + } + } + + // Check for cycles + if (dependencyCountByKey.Count != 0) + { + throw new InvalidOperationException( + $"Detected cycle in referenced affixes. Names that are part of the cycle: {string.Join(", ", dependencyCountByKey)}" + ); + } + } - foreach (var original in processingOrder) + foreach (var original in processingOrderByKey) { var (primary, secondary) = context.Names[original]; diff --git a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs index 67b7657594..22fcfdd1f7 100644 --- a/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs +++ b/sources/SilkTouch/SilkTouch/Naming/NameAffixer.cs @@ -162,9 +162,6 @@ public static SyntaxList AddNameAffix( /// This lets us skip sorting across different containers. /// This should cover most real world use cases since if something is nested and /// has the parent name as a prefix, then the prefix is likely unnecessary. - /// - /// Similarly, only direct references are supported. Transitive references are not. - /// This lets us naively sort all references to the end of the container without a topological sort. /// /// /// For example, PerformanceCounterDescriptionARM can be used as a referenced prefix for PerformanceCounterDescriptionARMName. From e56b4cfc8bfbbc5d661cacfb2fe3cea46ef4d7eb Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 20:53:13 -0400 Subject: [PATCH 32/36] Improve error handling by checking for case where dependencies are not fully fulfilled --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index f38fd10ecd..53ecc1b924 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1531,9 +1531,25 @@ public void ProcessNames(NameProcessorContext context) } } - // Check for cycles + // Check for unfulfilled dependencies if (dependencyCountByKey.Count != 0) { + // Check for missing dependencies + foreach (var key in dependencyCountByKey.Keys) + { + if (!context.Names.ContainsKey(key)) + { + // This is because we currently can only resolve names that are given by the NameProcessorContext + // Please update this message if this limitation changes + throw new NotSupportedException( + $"{key} references a name that does not exist. " + + $"This is usually because the referenced name is in a different name container. " + + $"Referencing names from other containers is currently not supported" + ); + } + } + + // Remaining must be a cycle throw new InvalidOperationException( $"Detected cycle in referenced affixes. Names that are part of the cycle: {string.Join(", ", dependencyCountByKey)}" ); From 85e246168b213fbbba886a81bb9792866c0fc77e Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 20:54:06 -0400 Subject: [PATCH 33/36] Edit error message --- sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 53ecc1b924..097edae421 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1542,8 +1542,7 @@ public void ProcessNames(NameProcessorContext context) // This is because we currently can only resolve names that are given by the NameProcessorContext // Please update this message if this limitation changes throw new NotSupportedException( - $"{key} references a name that does not exist. " - + $"This is usually because the referenced name is in a different name container. " + $"A name affix for '{key}' references a name that does not exist or is part of a different name container. " + $"Referencing names from other containers is currently not supported" ); } From 0edec2b0042c71ee6424e91c1bf6228bebd6f0c5 Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 21:15:15 -0400 Subject: [PATCH 34/36] Add test: PrettifyNamesTests.SuccessfullyUsesReferencedAffixes --- ...essfullyUsesReferencedAffixes.verified.txt | 14 ++++++++ .../SilkTouch/Naming/PrettifyNamesTests.cs | 34 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.SuccessfullyUsesReferencedAffixes.verified.txt diff --git a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.SuccessfullyUsesReferencedAffixes.verified.txt b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.SuccessfullyUsesReferencedAffixes.verified.txt new file mode 100644 index 0000000000..df3e0cb7be --- /dev/null +++ b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.SuccessfullyUsesReferencedAffixes.verified.txt @@ -0,0 +1,14 @@ +[NameAffix("Suffix", "Test", "ShouldBeInOutputName")] +public struct GamepadBindingShouldBeInOutputName +{ +} + +[NameAffix("Prefix", "NestedStructParent", nameof(GamepadBindingShouldBeInOutputName))] +public struct GamepadBindingShouldBeInOutputNameInput +{ +} + +[NameAffix("Prefix", "NestedStructParent", nameof(GamepadBindingShouldBeInOutputNameInput))] +public struct GamepadBindingShouldBeInOutputNameInputAxis +{ +} \ No newline at end of file diff --git a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs index 910d3dba8b..cb3313d0d0 100644 --- a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs @@ -557,4 +557,38 @@ public enum GLEnum { } var result = await context.SourceProject.Documents.First().GetSyntaxRootAsync(); await Verify(result!.NormalizeWhitespace().ToString()); } + + [Test] + public async Task SuccessfullyUsesReferencedAffixes() + { + var project = TestUtils + .CreateTestProject() + .AddDocument( + "Test.gen.cs", + """ + [NameAffix("Suffix", "Test", "ShouldBeInOutputName")] + public struct GamepadBinding { } + + [NameAffix("Prefix", "NestedStructParent", nameof(GamepadBinding))] + public struct GamepadBindingInput { } + + [NameAffix("Prefix", "NestedStructParent", nameof(GamepadBindingInput))] + public struct GamepadBindingInputAxis { } + """ + ) + .Project; + + var context = new DummyModContext() { SourceProject = project }; + + var prettifyNames = new PrettifyNames( + NullLogger.Instance, + new DummyOptions(new PrettifyNames.Configuration()) + ); + + await prettifyNames.ExecuteAsync(context); + + // All names should start with GamepadBindingShouldBeInOutputName + var result = await context.SourceProject.Documents.First().GetSyntaxRootAsync(); + await Verify(result!.NormalizeWhitespace().ToString()); + } } From aad7a0bb4494ecbfc9bc52bfacda8505f7e95fac Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 30 Mar 2026 21:17:53 -0400 Subject: [PATCH 35/36] Use "SDL.gen.cs" for test document name This is just to hint that these structs come from SDL --- tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs index cb3313d0d0..a607e29dc1 100644 --- a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs @@ -564,7 +564,7 @@ public async Task SuccessfullyUsesReferencedAffixes() var project = TestUtils .CreateTestProject() .AddDocument( - "Test.gen.cs", + "SDL.gen.cs", """ [NameAffix("Suffix", "Test", "ShouldBeInOutputName")] public struct GamepadBinding { } From f200deb8b466b68910a926354dca8a132c5ce9dd Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 31 Mar 2026 15:13:39 -0400 Subject: [PATCH 36/36] Add tests for referenced affix behavior MissingReferencedAffix_Throws currently fails, but seems to be an unrelated issue. --- .../SilkTouch/SilkTouch/Mods/PrettifyNames.cs | 2 +- .../SilkTouch/Naming/PrettifyNamesTests.cs | 89 ++++++++++++++++++- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs index 097edae421..ce85dea49f 100644 --- a/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs +++ b/sources/SilkTouch/SilkTouch/Mods/PrettifyNames.cs @@ -1541,7 +1541,7 @@ public void ProcessNames(NameProcessorContext context) { // This is because we currently can only resolve names that are given by the NameProcessorContext // Please update this message if this limitation changes - throw new NotSupportedException( + throw new InvalidOperationException( $"A name affix for '{key}' references a name that does not exist or is part of a different name container. " + $"Referencing names from other containers is currently not supported" ); diff --git a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs index a607e29dc1..7013d0e78a 100644 --- a/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs +++ b/tests/SilkTouch/SilkTouch/Naming/PrettifyNamesTests.cs @@ -4,7 +4,6 @@ using Microsoft.CodeAnalysis; using Microsoft.Extensions.Logging.Abstractions; using Silk.NET.SilkTouch.Mods; -using Silk.NET.SilkTouch.Naming; namespace Silk.NET.SilkTouch.UnitTests.Naming; @@ -591,4 +590,92 @@ public struct GamepadBindingInputAxis { } var result = await context.SourceProject.Documents.First().GetSyntaxRootAsync(); await Verify(result!.NormalizeWhitespace().ToString()); } + + [Test] + public void CycleInReferencedAffixes_Throws() + { + var project = TestUtils + .CreateTestProject() + .AddDocument( + "Test.gen.cs", + """ + [NameAffix("Suffix", "Test", nameof(B))] + public struct A { } + + [NameAffix("Suffix", "Test", nameof(A))] + public struct B { } + """ + ) + .Project; + + var context = new DummyModContext() { SourceProject = project }; + + var prettifyNames = new PrettifyNames( + NullLogger.Instance, + new DummyOptions(new PrettifyNames.Configuration()) + ); + + Assert.ThrowsAsync(async () => + { + await prettifyNames.ExecuteAsync(context); + }); + } + + [Test] + public void MissingReferencedAffix_Throws() + { + var project = TestUtils + .CreateTestProject() + .AddDocument( + "Test.gen.cs", + """ + [NameAffix("Suffix", "Test", nameof(B))] + public struct A { } + """ + ) + .Project; + + var context = new DummyModContext() { SourceProject = project }; + + var prettifyNames = new PrettifyNames( + NullLogger.Instance, + new DummyOptions(new PrettifyNames.Configuration()) + ); + + Assert.ThrowsAsync(async () => + { + await prettifyNames.ExecuteAsync(context); + }); + } + + [Test] + public void ReferencedAffixExists_ButInDifferentContainer_Throws() + { + // This test is here because referencing names in different containers is currently not supported + var project = TestUtils + .CreateTestProject() + .AddDocument( + "Test.gen.cs", + """ + public struct A + { + [NameAffix("Suffix", "Test", nameof(A))] + public static int B; + } + """ + ) + .Project; + + var context = new DummyModContext() { SourceProject = project }; + + var prettifyNames = new PrettifyNames( + NullLogger.Instance, + new DummyOptions(new PrettifyNames.Configuration()) + ); + + Assert.ThrowsAsync(async () => + { + await prettifyNames.ExecuteAsync(context); + }); + } }