diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 1ebc9e406c..13c606899e 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -23,10 +23,11 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v5
with:
- dotnet-version: '9.0.x'
- dotnet-quality: 'preview'
+ dotnet-version: |
+ 9.0.x
+ 10.0.x
- name: Install Workloads
run: dotnet workload restore
- name: Pack
@@ -78,8 +79,9 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
- dotnet-version: '8.0.x'
- dotnet-quality: 'preview'
+ dotnet-version: |
+ 9.0.x
+ 10.0.x
- name: Install Workloads
run: dotnet workload restore
- name: Restore
diff --git a/.github/workflows/native.yml b/.github/workflows/native.yml
index 55e14135d5..04a1cef8c5 100644
--- a/.github/workflows/native.yml
+++ b/.github/workflows/native.yml
@@ -7,14 +7,14 @@ permissions:
contents: write
env:
# A space-separated list of paths to native libraries to build.
- NATIVE_LIBRARY_PATHS: "sources/SDL/Native"
+ NATIVE_LIBRARY_PATHS: "sources/SDL/Native sources/OpenAL/Soft.Native"
# A space-separated list of submodule paths for each native library path. Use _ if a submodule is not used - this must
# match the number of spaces in NATIVE_LIBRARY_PATHS.
- NATIVE_LIBRARY_SUBMODULE_PATHS: "eng/submodules/sdl"
+ NATIVE_LIBRARY_SUBMODULE_PATHS: "eng/submodules/sdl eng/submodules/openal-soft"
# A space-separated list of shorthands to the native library paths that will build the native library for each native
# library path. This must match the number of spaces in NATIVE_LIBRARY_PATHS. If a shorthand builds multiple native
# binary paths, these will be deduplicated.
- NATIVE_LIBRARY_SHORTHANDS: "SDL"
+ NATIVE_LIBRARY_SHORTHANDS: "SDL OpenAL-Soft"
jobs:
prerequisites:
name: PR Check
@@ -61,13 +61,15 @@ jobs:
build:
needs: [prerequisites]
strategy:
+ fail-fast: false
matrix:
flat: ${{ fromJSON(needs.prerequisites.outputs.matrix_strategy) }}
runs-on: ${{ (startsWith(matrix.flat.runtime, 'osx') || startsWith(matrix.flat.runtime, 'ios') || startsWith(matrix.flat.runtime, 'tvos')) && 'macos-latest' || startsWith(matrix.flat.runtime, 'win') && 'windows-latest' || 'ubuntu-latest' }}
name: ${{ matrix.flat.target }} / ${{ matrix.flat.runtime }}
steps:
- uses: actions/checkout@v3
- - run: |
+ - name: Build
+ run: |
echo "https://github.com/actions/upload-artifact/issues/174" > .workaround-${{ matrix.flat.target }}-${{ matrix.flat.runtime }}.txt
${{ format('.{0}{1}', startsWith(matrix.flat.runtime, 'win') && '\' || '/', matrix.flat.exec) }}
working-directory: ${{ matrix.flat.dir }}
diff --git a/.gitmodules b/.gitmodules
index 9482c62aa0..3b16b5edff 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -13,3 +13,12 @@
[submodule "eng/submodules/silk.net-2.x"]
path = eng/submodules/silk.net-2.x
url = https://github.com/dotnet/Silk.NET
+[submodule "eng/submodules/openal-soft"]
+ path = eng/submodules/openal-soft
+ url = https://github.com/kcat/openal-soft
+[submodule "eng/submodules/vulkan"]
+ path = eng/submodules/vulkan
+ url = https://github.com/KhronosGroup/Vulkan-Docs.git
+[submodule "eng/submodules/vulkan-headers"]
+ path = eng/submodules/vulkan-headers
+ url = https://github.com/KhronosGroup/Vulkan-Headers.git
diff --git a/.silktouch/82fde6eb3b68e085.stout b/.silktouch/82fde6eb3b68e085.stout
new file mode 100644
index 0000000000..3a6d84ec73
Binary files /dev/null and b/.silktouch/82fde6eb3b68e085.stout differ
diff --git a/.silktouch/c8c046b328b09d23.stout b/.silktouch/c8c046b328b09d23.stout
index 8910217dea..b8a027b827 100644
Binary files a/.silktouch/c8c046b328b09d23.stout and b/.silktouch/c8c046b328b09d23.stout differ
diff --git a/Directory.Build.targets b/Directory.Build.targets
index b2e5050aa6..ab0c6301de 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -270,4 +270,7 @@
+
+
+
diff --git a/Directory.Packages.props b/Directory.Packages.props
index dd91fcdbc2..a1a306a93a 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,45 +1,47 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
+
-
\ No newline at end of file
+
diff --git a/Silk.NET.sln b/Silk.NET.sln
index d5dfbdcf16..ce4449c1aa 100644
--- a/Silk.NET.sln
+++ b/Silk.NET.sln
@@ -1,4 +1,4 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
@@ -107,6 +107,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Win32", "Win32", "{BA20152E
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Win32.UnitTests", "tests\Win32\Win32\Silk.NET.Win32.UnitTests.csproj", "{C8F32825-1F93-44F0-AB88-26167C21CADF}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Vulkan", "Vulkan", "{5E20252F-E2A0-46C9-BBEF-4CE5C96D0E07}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan", "sources\Vulkan\Vulkan\Silk.NET.Vulkan.csproj", "{E5E8FFBF-1319-4D33-B084-E732656E8A04}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenAL", "OpenAL", "{AF13F7C9-4EE2-403E-B3D2-C4C2E45D9EF3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenAL", "sources\OpenAL\OpenAL\Silk.NET.OpenAL.csproj", "{1FFFDD72-D023-441C-AF49-F1EA78FF7DE9}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{6077EDD4-F16F-4CA4-B72E-E4627D64B104}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CSharp", "CSharp", "{12B4D1CB-8938-4EC4-8895-79C4E6ABD1E8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenAL", "OpenAL", "{662A1AEC-91F2-48FA-AA29-6F27038D30F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tutorial001.HelloSound", "examples\CSharp\OpenAL\Tutorial001.HelloSound\Tutorial001.HelloSound.csproj", "{946C912C-5BBB-446A-A566-0D1696D19F59}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -128,7 +144,9 @@ Global
{48F43535-3AFC-45E7-A98D-C2609B3B9757}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48F43535-3AFC-45E7-A98D-C2609B3B9757}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48F43535-3AFC-45E7-A98D-C2609B3B9757}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {48F43535-3AFC-45E7-A98D-C2609B3B9757}.Release|Any CPU.Build.0 = Release|Any CPU
{A87E1861-07E4-4B7A-9173-0853370A7D4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A87E1861-07E4-4B7A-9173-0853370A7D4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A87E1861-07E4-4B7A-9173-0853370A7D4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A87E1861-07E4-4B7A-9173-0853370A7D4E}.Release|Any CPU.Build.0 = Release|Any CPU
{1B21D783-71C3-48D3-91F5-0EEA90FB0DB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -146,12 +164,15 @@ Global
{9625C977-25BE-48F3-9B6F-BC94B8B799A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9625C977-25BE-48F3-9B6F-BC94B8B799A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9625C977-25BE-48F3-9B6F-BC94B8B799A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9625C977-25BE-48F3-9B6F-BC94B8B799A6}.Release|Any CPU.Build.0 = Release|Any CPU
{19B05730-F97E-43D4-B922-DF4697E5CE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19B05730-F97E-43D4-B922-DF4697E5CE5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{19B05730-F97E-43D4-B922-DF4697E5CE5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {19B05730-F97E-43D4-B922-DF4697E5CE5F}.Release|Any CPU.Build.0 = Release|Any CPU
{D2B9C43F-A80D-4C9A-9643-BC1AC1B4E807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D2B9C43F-A80D-4C9A-9643-BC1AC1B4E807}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D2B9C43F-A80D-4C9A-9643-BC1AC1B4E807}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D2B9C43F-A80D-4C9A-9643-BC1AC1B4E807}.Release|Any CPU.Build.0 = Release|Any CPU
{3CADD95A-179F-4ECF-A49D-4B753832C63C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CADD95A-179F-4ECF-A49D-4B753832C63C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3CADD95A-179F-4ECF-A49D-4B753832C63C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -159,11 +180,27 @@ Global
{6FA628B8-9696-4847-89F9-E58F470AF4FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FA628B8-9696-4847-89F9-E58F470AF4FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FA628B8-9696-4847-89F9-E58F470AF4FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6FA628B8-9696-4847-89F9-E58F470AF4FB}.Release|Any CPU.Build.0 = Release|Any CPU
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Release|Any CPU.Build.0 = Release|Any CPU
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5E8FFBF-1319-4D33-B084-E732656E8A04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E5E8FFBF-1319-4D33-B084-E732656E8A04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5E8FFBF-1319-4D33-B084-E732656E8A04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E5E8FFBF-1319-4D33-B084-E732656E8A04}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1FFFDD72-D023-441C-AF49-F1EA78FF7DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1FFFDD72-D023-441C-AF49-F1EA78FF7DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1FFFDD72-D023-441C-AF49-F1EA78FF7DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1FFFDD72-D023-441C-AF49-F1EA78FF7DE9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {946C912C-5BBB-446A-A566-0D1696D19F59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {946C912C-5BBB-446A-A566-0D1696D19F59}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {946C912C-5BBB-446A-A566-0D1696D19F59}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {946C912C-5BBB-446A-A566-0D1696D19F59}.Release|Any CPU.Build.0 = Release|Any CPU
{BB33CC4A-EA3A-4D4F-879A-F93C617C5E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB33CC4A-EA3A-4D4F-879A-F93C617C5E63}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8F32825-1F93-44F0-AB88-26167C21CADF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -186,20 +223,36 @@ Global
{19B05730-F97E-43D4-B922-DF4697E5CE5F} = {EC4D7B06-D277-4411-BD7B-71A6D37683F0}
{D2B9C43F-A80D-4C9A-9643-BC1AC1B4E807} = {49D426BF-A009-43D5-A9E2-EFAAAA7196FC}
{5CD096DB-6C44-48F1-9093-AD4C84B6B7EC} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
+ {131C09C1-BF4D-47C1-AF13-4A7E30866B1E} = {5CD096DB-6C44-48F1-9093-AD4C84B6B7EC}
{2452CED9-5211-4A19-BA44-230EC28F409E} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{FA31E483-AD35-4E44-B10A-B33C4539DBCB} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{24BD769C-7379-400C-A67F-00C34756DA32} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{EC4D7B06-D277-4411-BD7B-71A6D37683F0} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
+ {19B05730-F97E-43D4-B922-DF4697E5CE5F} = {EC4D7B06-D277-4411-BD7B-71A6D37683F0}
+ {76F747A6-D971-4162-BF35-A226177FCA08} = {24BD769C-7379-400C-A67F-00C34756DA32}
+ {1B21D783-71C3-48D3-91F5-0EEA90FB0DB2} = {2452CED9-5211-4A19-BA44-230EC28F409E}
+ {9625C977-25BE-48F3-9B6F-BC94B8B799A6} = {FA31E483-AD35-4E44-B10A-B33C4539DBCB}
{D9ACA4E5-712F-4F15-B8B8-50C85D23D1D5} = {A5578D12-9E77-4647-8C22-0DBD17760BFF}
{FCD75AA5-1536-433E-BA9B-3D698C2255EB} = {A5578D12-9E77-4647-8C22-0DBD17760BFF}
{49D426BF-A009-43D5-A9E2-EFAAAA7196FC} = {A5578D12-9E77-4647-8C22-0DBD17760BFF}
{AB25C482-DA9D-4335-8E26-2F29C3700152} = {A5578D12-9E77-4647-8C22-0DBD17760BFF}
+ {A87E1861-07E4-4B7A-9173-0853370A7D4E} = {D9ACA4E5-712F-4F15-B8B8-50C85D23D1D5}
+ {01683C11-4721-43AB-B53C-15EBE935B48F} = {FCD75AA5-1536-433E-BA9B-3D698C2255EB}
+ {D2B9C43F-A80D-4C9A-9643-BC1AC1B4E807} = {49D426BF-A009-43D5-A9E2-EFAAAA7196FC}
+ {600D712C-4ABF-44C4-96C3-B1DEE1F38298} = {AB25C482-DA9D-4335-8E26-2F29C3700152}
{3CADD95A-179F-4ECF-A49D-4B753832C63C} = {475AEF7B-0154-4989-AF82-97E3A95A96AF}
{6FA628B8-9696-4847-89F9-E58F470AF4FB} = {5CD096DB-6C44-48F1-9093-AD4C84B6B7EC}
{6E739132-EEAB-43A5-83C7-EB58C50D03A1} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6} = {EC4D7B06-D277-4411-BD7B-71A6D37683F0}
{FE4414F8-5370-445D-9F24-C3AD3223F299} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E} = {FE4414F8-5370-445D-9F24-C3AD3223F299}
+ {AF13F7C9-4EE2-403E-B3D2-C4C2E45D9EF3} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
+ {1FFFDD72-D023-441C-AF49-F1EA78FF7DE9} = {AF13F7C9-4EE2-403E-B3D2-C4C2E45D9EF3}
+ {12B4D1CB-8938-4EC4-8895-79C4E6ABD1E8} = {6077EDD4-F16F-4CA4-B72E-E4627D64B104}
+ {662A1AEC-91F2-48FA-AA29-6F27038D30F2} = {12B4D1CB-8938-4EC4-8895-79C4E6ABD1E8}
+ {946C912C-5BBB-446A-A566-0D1696D19F59} = {662A1AEC-91F2-48FA-AA29-6F27038D30F2}
+ {5E20252F-E2A0-46C9-BBEF-4CE5C96D0E07} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
+ {E5E8FFBF-1319-4D33-B084-E732656E8A04} = {5E20252F-E2A0-46C9-BBEF-4CE5C96D0E07}
{BB33CC4A-EA3A-4D4F-879A-F93C617C5E63} = {6E739132-EEAB-43A5-83C7-EB58C50D03A1}
{BA20152E-2FF8-48F0-A90E-682A7A8CF657} = {A5578D12-9E77-4647-8C22-0DBD17760BFF}
{C8F32825-1F93-44F0-AB88-26167C21CADF} = {BA20152E-2FF8-48F0-A90E-682A7A8CF657}
diff --git a/docs/for-contributors/README.mdx b/docs/for-contributors/README.mdx
index c2567035cc..06da434d9d 100644
--- a/docs/for-contributors/README.mdx
+++ b/docs/for-contributors/README.mdx
@@ -59,7 +59,7 @@ command like
where the values for the `-s` arguments are replaced with the job names (the keys of the `Jobs` dictionary in
`generator.json` e.g. `SDL`, `OpenGL`, etc).
-For more information on SilkTocuh arguments, consult the [SilkTouch User Guide](../silktouch) or use
+For more information on SilkTouch arguments, consult the [SilkTouch User Guide](../silktouch) or use
`dotnet run --project sources/SilkTouch/SilkTouch/Silk.NET.SilkTouch.csproj -- --help`.
e.label != "Overview")} />
diff --git a/docs/silk.net/static-vs-instance-bindings.md b/docs/silk.net/static-vs-instance-bindings.md
new file mode 100644
index 0000000000..38c43b0e48
--- /dev/null
+++ b/docs/silk.net/static-vs-instance-bindings.md
@@ -0,0 +1,131 @@
+# Static vs Input Bindings
+
+## Overview
+
+Silk.NET has multiple ways to access the underlying APIs, either through a static method (e.g. `GL.GenBuffers`) or
+through an "API object" (e.g. created with `GL.Create` and then accessed as `gl.GenBuffers`). Not all APIs are the
+same, and some are better accessed through one method or the other. Note that Silk.NET does make both available however,
+so if you're prefer consistency feel free to pick one method and stick to it, though you may result in some minor
+inefficiencies.
+
+All native APIs are accessed using a "function pointer" - a location in memory at which the native code resides.
+This is typically fetched using `DllImport`, but some APIs require custom mechanisms. An example in OpenGL, where you
+must use a "context API" (e.g. WGL, GLX, EGL, etc) to create a context and, after setting up that context state, use a
+function provided by that context API to get the function pointers for OpenGL (e.g. `wglGetProcAddress`). We refer to
+these as "stateful APIs" in this document. Note that OpenGL is not the only stateful API, this will be elaborated later.
+
+Stateless APIs are those where the function pointers aren't contingent on any other state, and they're effectively
+accessed as if they were static functions. For these, the function pointers are typically retrieved through `DllImport`,
+but this needn't preclude other APIs from having bespoke mechanisms to statelessly retrieve function pointers (though,
+there are no examples of this today).
+
+When using a stateful API, you should use API objects if possible i.e. `API.Create`, and dispose of that object when you
+are done using that API. When using a stateless API, you should use the static functions exposed directly on the API
+class.
+
+> [!NOTE]
+> Future releases of Silk.NET are intended to contain analysers to indicate the correct access method.
+
+Below is a description of the stateful APIs. All other APIs not listed here are, or can be treated as, stateless.
+
+## OpenGL
+
+OpenGL is a stateful API because it requires a context to be created and "made current" on that thread before function
+pointers can be retrieved. Typically, this context is created using Silk.NET.Windowing, and the functions would be
+retrieved using `surface.OpenGL.GetProcAddress` in that example.
+
+To create an API object, our OpenGL bindings provide a utility function `CreateOpenGL`:
+```csharp
+IGL gl = null!;
+surface.Created += _ =>
+{
+ gl = surface.CreateOpenGL();
+ // Use gl functions here...
+ gl.Flush();
+}
+surface.Render += _ =>
+{
+ // Use gl functions here...
+ gl.Clear(ClearBufferMask.ColorBufferBit);
+}
+```
+
+If you'd prefer to use static methods despite OpenGL being stateful, the static functions on `GL` will forward to
+`GL.ThisThread`, which essentially forwards to a thread-specific `IGL` instance. You can change the `IGL` instance used
+by a thread using `GL.ThisThread.MakeCurrent`, which will also implicitly make the `IGLContext` you pass it current
+(if applicable). Note that Silk.NET.Windowing will implicitly call this, so you can use the static OpenGL functions in
+the obvious way, albeit with the implied indirection through `GL.ThisThread`:
+```csharp
+surface.Created += _ =>
+{
+ GL.Flush();
+}
+surface.Render += _ =>
+{
+ GL.Clear(ClearBufferMask.ColorBufferBit);
+}
+```
+
+> [!CAUTION]
+> TODO: Silk.NET.Windowing does not currently do this! `surface.MakeCurrent()` must be used in `surface.Created` to make
+> this happen.
+
+## Vulkan
+
+Vulkan is a stateful API because its function pointers are dependent on the `InstanceHandle` and `DeviceHandle` being
+used. Our Vulkan bindings intercept calls to `Vk.CreateInstance` and `Vk.CreateDevice`, and set `CurrentInstance` and
+`CurrentDevice` respectively on the Vulkan API object for later use with `Vk.GetDeviceProcAddr` and
+`Vk.GetInstanceProcAddr`.
+
+The Vulkan API object will first try `vkGetDeviceProcAddr` to load a function pointer (where the value for `device` is
+as in `CurrentDevice`), followed by `vkGetInstanceProcAddr` (where the value for `instance` is as in `CurrentInstance`).
+For `vkGetInstanceProcAddr` itself, `DllImport` is used.
+
+`CurrentInstance` is set upon a successful call to `vkCreateInstance`, and `CurrentDevice` is set upon a successful call
+to `vkCreateDevice`. Note that it is illegal to change these values on an API object if they're already set, if you have
+scenarios requiring multiple instance-device combinations you must create multiple API objects.
+
+> [!TIP]
+> In cases where you have one instance from which multiple devices are created, simply clone the `IVk` object using
+> `IVk.Clone()` prior to **any device** being created. This will reuse the function pointers already loaded for that
+> instance.
+
+If you'd prefer to use static methods despite Vulkan being stateful, the static functions on `Vk` will forward to
+`Vk.ThisThread`, which essentially forwards to a thread-specific `IVk` instance. You can change the `IVk` instance used
+by a thread using `Vk.ThisThread.MakeCurrent`. The static functions, much like using a single `IVk` instance, will throw
+if multiple instance-device combinations are used on the same thread without changing the `IVk` object being used.
+
+## OpenXR
+
+OpenXR has the same caveats as Vulkan but with `CurrentInstance` only.
+
+## OpenAL
+
+OpenAL has the same caveats as OpenGL, with the exception that `alGetProcAddress` is made available to retrieve the
+function pointers. This still has the requirement of a thread-specific context, however, which can be made current using
+`AL.ThisThread.MakeCurrent`.
+
+Unlike OpenGL, OpenAL has an official context API: OpenAL Context (ALC). `alcMakeContextCurrent` will implicitly call
+`AL.ThisThread.MakeCurrent` meaning that the static OpenAL functions are made available in the obvious way:
+
+```csharp
+// NOTE: We are making use of ALContext's static functions here as well.
+// The same applies as if `ALContext.Create` were used.
+DeviceHandle device = ALContext.OpenDevice("");
+if (device == nullptr) throw new("failed to create device");
+
+ContextHandle context = ALContext.CreateContext(device, nullptr);
+if (context == nullptr) throw new("failed to create context");
+
+// Now make the context current. This implicitly calls AL.ThisThread.MakeCurrent
+ALContext.MakeContextCurrent(context);
+
+// Static functions now just work.
+var source = AL.GenSource();
+```
+
+## OpenAL Context (ALContext/ALC)
+
+ALC has the same caveats as Vulkan, given that the ALC function pointers are tied to a specific device. As a result,
+`alcOpenDevice` is intercepted to set the value of `CurrentDevice` to then be fed into `alcGetProcAddress` (or
+`alcGetProcAddress2` if available).
diff --git a/eng/benchmarks/Silk.NET.Maths.Benchmarks/Silk.NET.Maths.Benchmarks.csproj b/eng/benchmarks/Silk.NET.Maths.Benchmarks/Silk.NET.Maths.Benchmarks.csproj
index 8d8619413a..e3d9584e48 100644
--- a/eng/benchmarks/Silk.NET.Maths.Benchmarks/Silk.NET.Maths.Benchmarks.csproj
+++ b/eng/benchmarks/Silk.NET.Maths.Benchmarks/Silk.NET.Maths.Benchmarks.csproj
@@ -3,6 +3,7 @@
Exe
net10.0
$(DefineConstants);MATHF
+ true
@@ -10,4 +11,4 @@
-
\ No newline at end of file
+
diff --git a/eng/build/Build.cs b/eng/build/Build.cs
index 26c5606cd8..5bb002e330 100644
--- a/eng/build/Build.cs
+++ b/eng/build/Build.cs
@@ -1,6 +1,7 @@
using System.IO;
using Nuke.Common;
using Nuke.Common.IO;
+using Nuke.Common.ProjectModel;
using Nuke.Common.Tools.DotNet;
using Nuke.Common.Utilities;
using static Nuke.Common.Tools.DotNet.DotNetTasks;
diff --git a/eng/build/Silk.NET.NUKE.csproj b/eng/build/Silk.NET.NUKE.csproj
index 0707d6c94a..3d42b15783 100644
--- a/eng/build/Silk.NET.NUKE.csproj
+++ b/eng/build/Silk.NET.NUKE.csproj
@@ -2,8 +2,7 @@
Exe
net10.0
-
-
+
CS0649;CS0169;CA1050;CA1822;CA2211;IDE1006
..\..
..\..
@@ -12,9 +11,10 @@
-
-
-
+
+
+
+
-
\ No newline at end of file
+
diff --git a/eng/native/cmake/aarch64-linux-gnu.cmake b/eng/native/cmake/aarch64-linux-gnu.cmake
new file mode 100644
index 0000000000..ced259920b
--- /dev/null
+++ b/eng/native/cmake/aarch64-linux-gnu.cmake
@@ -0,0 +1,26 @@
+set(CMAKE_SYSTEM_NAME "Linux")
+set(CMAKE_SYSTEM_PROCESSOR "aarch64")
+
+set(CMAKE_ASM_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
+set(CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
+set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
+
+set(CMAKE_ADDR2LINE "/usr/bin/aarch64-linux-gnu-addr2line")
+set(CMAKE_AR "/usr/bin/aarch64-linux-gnu-ar")
+set(CMAKE_LINKER "/usr/bin/aarch64-linux-gnu-ld")
+set(CMAKE_NM "/usr/bin/aarch64-linux-gnu-nm")
+set(CMAKE_OBJCOPY "/usr/bin/aarch64-linux-gnu-objcopy")
+set(CMAKE_OBJDUMP "/usr/bin/aarch64-linux-gnu-objdump")
+set(CMAKE_RANLIB "/usr/bin/aarch64-linux-gnu-ranlib")
+set(CMAKE_READELF "/usr/bin/aarch64-linux-gnu-readelf")
+set(CMAKE_STRIP "/usr/bin/aarch64-linux-gnu-strip")
+
+set(PKG_CONFIG_EXECUTABLE "/usr/bin/pkg-config")
+set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/aarch64-linux-gnu/pkgconfig")
+set(ENV{PKG_CONFIG_PATH} "/usr/lib/pkgconfig:/usr/share/pkgconfig")
+
+set(CMAKE_FIND_ROOT_PATH "/usr/aarch64-linux-gnu")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
diff --git a/eng/native/cmake/aarch64-w64-mingw32.cmake b/eng/native/cmake/aarch64-w64-mingw32.cmake
new file mode 100644
index 0000000000..d8bbcbffba
--- /dev/null
+++ b/eng/native/cmake/aarch64-w64-mingw32.cmake
@@ -0,0 +1,24 @@
+set(CMAKE_SYSTEM_NAME "Windows")
+set(CMAKE_SYSTEM_PROCESSOR "aarch64")
+
+set(CMAKE_ASM_COMPILER "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-gcc")
+set(CMAKE_C_COMPILER "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-gcc")
+set(CMAKE_CXX_COMPILER "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-g++")
+set(CMAKE_RC_COMPILER "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-windres")
+
+set(CMAKE_ADDR2LINE "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-addr2line")
+set(CMAKE_AR "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-ar")
+set(CMAKE_DLLTOOL "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-dlltool")
+set(CMAKE_LINKER "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-ld")
+set(CMAKE_NM "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-nm")
+set(CMAKE_OBJCOPY "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-objcopy")
+set(CMAKE_OBJDUMP "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-objdump")
+set(CMAKE_RANLIB "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-ranlib")
+set(CMAKE_READELF "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-readelf")
+set(CMAKE_STRIP "/opt/llvm-mingw-msvcrt/bin/aarch64-w64-mingw32-strip")
+
+set(CMAKE_FIND_ROOT_PATH "/opt/llvm-mingw-msvcrt/aarch64-w64-mingw32")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
diff --git a/eng/native/cmake/arm-linux-gnueabihf.cmake b/eng/native/cmake/arm-linux-gnueabihf.cmake
new file mode 100644
index 0000000000..4afcceab42
--- /dev/null
+++ b/eng/native/cmake/arm-linux-gnueabihf.cmake
@@ -0,0 +1,26 @@
+set(CMAKE_SYSTEM_NAME "Linux")
+set(CMAKE_SYSTEM_PROCESSOR "armv7l")
+
+set(CMAKE_ASM_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
+set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
+set(CMAKE_CXX_COMPILER "/usr/bin/arm-linux-gnueabihf-g++")
+
+set(CMAKE_ADDR2LINE "/usr/bin/arm-linux-gnueabihf-addr2line")
+set(CMAKE_AR "/usr/bin/arm-linux-gnueabihf-ar")
+set(CMAKE_LINKER "/usr/bin/arm-linux-gnueabihf-ld")
+set(CMAKE_NM "/usr/bin/arm-linux-gnueabihf-nm")
+set(CMAKE_OBJCOPY "/usr/bin/arm-linux-gnueabihf-objcopy")
+set(CMAKE_OBJDUMP "/usr/bin/arm-linux-gnueabihf-objdump")
+set(CMAKE_RANLIB "/usr/bin/arm-linux-gnueabihf-ranlib")
+set(CMAKE_READELF "/usr/bin/arm-linux-gnueabihf-readelf")
+set(CMAKE_STRIP "/usr/bin/arm-linux-gnueabihf-strip")
+
+set(PKG_CONFIG_EXECUTABLE "/usr/bin/pkg-config")
+set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/arm-linux-gnueabihf/pkgconfig")
+set(ENV{PKG_CONFIG_PATH} "/usr/lib/pkgconfig:/usr/share/pkgconfig")
+
+set(CMAKE_FIND_ROOT_PATH "/usr/arm-linux-gnueabihf")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
diff --git a/eng/native/cmake/x86_64-linux-gnu.cmake b/eng/native/cmake/x86_64-linux-gnu.cmake
new file mode 100644
index 0000000000..0f5da714cb
--- /dev/null
+++ b/eng/native/cmake/x86_64-linux-gnu.cmake
@@ -0,0 +1,26 @@
+set(CMAKE_SYSTEM_NAME "Linux")
+set(CMAKE_SYSTEM_PROCESSOR "x86_64")
+
+set(CMAKE_ASM_COMPILER "/usr/bin/x86_64-linux-gnu-gcc")
+set(CMAKE_C_COMPILER "/usr/bin/x86_64-linux-gnu-gcc")
+set(CMAKE_CXX_COMPILER "/usr/bin/x86_64-linux-gnu-g++")
+
+set(CMAKE_ADDR2LINE "/usr/bin/x86_64-linux-gnu-addr2line")
+set(CMAKE_AR "/usr/bin/x86_64-linux-gnu-ar")
+set(CMAKE_LINKER "/usr/bin/x86_64-linux-gnu-ld")
+set(CMAKE_NM "/usr/bin/x86_64-linux-gnu-nm")
+set(CMAKE_OBJCOPY "/usr/bin/x86_64-linux-gnu-objcopy")
+set(CMAKE_OBJDUMP "/usr/bin/x86_64-linux-gnu-objdump")
+set(CMAKE_RANLIB "/usr/bin/x86_64-linux-gnu-ranlib")
+set(CMAKE_READELF "/usr/bin/x86_64-linux-gnu-readelf")
+set(CMAKE_STRIP "/usr/bin/x86_64-linux-gnu-strip")
+
+set(PKG_CONFIG_EXECUTABLE "/usr/bin/pkg-config")
+set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/x86_64-linux-gnu/pkgconfig")
+set(ENV{PKG_CONFIG_PATH} "/usr/lib/pkgconfig:/usr/share/pkgconfig")
+
+set(CMAKE_FIND_ROOT_PATH "/usr/x86_64-linux-gnu")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
diff --git a/eng/native/cmake/zig-objcopy.cmd b/eng/native/cmake/zig-objcopy.cmd
new file mode 100644
index 0000000000..22fce29f5f
--- /dev/null
+++ b/eng/native/cmake/zig-objcopy.cmd
@@ -0,0 +1,2 @@
+@echo off
+zig objcopy %*
diff --git a/eng/native/cmake/zig-objcopy.sh b/eng/native/cmake/zig-objcopy.sh
new file mode 100644
index 0000000000..8e79db575b
--- /dev/null
+++ b/eng/native/cmake/zig-objcopy.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+zig objcopy "$@"
diff --git a/eng/native/cmake/zig-toolchain-aarch64-linux-gnu.2.28.cmake b/eng/native/cmake/zig-toolchain-aarch64-linux-gnu.2.28.cmake
new file mode 100644
index 0000000000..36e1694c3a
--- /dev/null
+++ b/eng/native/cmake/zig-toolchain-aarch64-linux-gnu.2.28.cmake
@@ -0,0 +1,2 @@
+set(ZIG_TARGET "aarch64-linux-gnu.2.28")
+include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake)
diff --git a/eng/native/cmake/zig-toolchain-arm-linux-gnueabihf.2.28.cmake b/eng/native/cmake/zig-toolchain-arm-linux-gnueabihf.2.28.cmake
new file mode 100644
index 0000000000..4fd91d256c
--- /dev/null
+++ b/eng/native/cmake/zig-toolchain-arm-linux-gnueabihf.2.28.cmake
@@ -0,0 +1,2 @@
+set(ZIG_TARGET "arm-linux-gnueabihf.2.28")
+include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake)
diff --git a/eng/native/cmake/zig-toolchain-x86_64-linux-gnu.2.28.cmake b/eng/native/cmake/zig-toolchain-x86_64-linux-gnu.2.28.cmake
new file mode 100644
index 0000000000..e81d45e1ea
--- /dev/null
+++ b/eng/native/cmake/zig-toolchain-x86_64-linux-gnu.2.28.cmake
@@ -0,0 +1,2 @@
+set(ZIG_TARGET "x86_64-linux-gnu.2.28")
+include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake)
diff --git a/eng/native/cmake/zig-toolchain.cmake b/eng/native/cmake/zig-toolchain.cmake
index 94ed03c2e6..f0202e8f8e 100755
--- a/eng/native/cmake/zig-toolchain.cmake
+++ b/eng/native/cmake/zig-toolchain.cmake
@@ -4,13 +4,14 @@ if(CMAKE_GENERATOR MATCHES "Visual Studio")
message(FATAL_ERROR "Visual Studio generator not supported, use: cmake -G Ninja")
endif()
-if(NOT ZIG_TARGET MATCHES "^([a-zZ-Z0-9_]+)-([a-zZ-Z0-9_]+)-([a-zZ-Z0-9_.]+)$")
+if(NOT ZIG_TARGET MATCHES "^([a-zZ-Z0-9_]+)-([a-zZ-Z0-9_]+)-(([a-zZ-Z0-9_]+)\.?([a-zZ-Z0-9_.]*))$")
message(FATAL_ERROR "Expected -DZIG_TARGET=--")
endif()
set(ZIG_ARCH ${CMAKE_MATCH_1})
set(ZIG_OS ${CMAKE_MATCH_2})
set(ZIG_ABI ${CMAKE_MATCH_3})
+set(LINUX_ABI ${CMAKE_MATCH_4})
if(ZIG_OS STREQUAL "linux")
set(CMAKE_SYSTEM_NAME "Linux")
@@ -38,3 +39,15 @@ set(CMAKE_RC_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-rc${SCRIPT_SUFFIX}")
set(CMAKE_ASM_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-cc${SCRIPT_SUFFIX}" -target ${ZIG_TARGET})
set(CMAKE_C_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-cc${SCRIPT_SUFFIX}" -target ${ZIG_TARGET})
set(CMAKE_CXX_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-c++${SCRIPT_SUFFIX}" -target ${ZIG_TARGET})
+set(CMAKE_OBJCOPY "${CMAKE_CURRENT_LIST_DIR}/zig-objcopy${SCRIPT_SUFFIX}" -target ${ZIG_TARGET})
+
+if(ZIG_OS STREQUAL "linux")
+ set(PKG_CONFIG_EXECUTABLE "/usr/bin/${ZIG_ARCH}-${ZIG_OS}-${LINUX_ABI}-pkg-config")
+ set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/${ZIG_ARCH}-${ZIG_OS}-${LINUX_ABI}/pkgconfig")
+ set(ENV{PKG_CONFIG_PATH} "/usr/lib/pkgconfig:/usr/share/pkgconfig")
+ set(CMAKE_FIND_ROOT_PATH "/usr/${ZIG_ARCH}-${ZIG_OS}-${LINUX_ABI}")
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
+endif()
diff --git a/eng/silktouch/openal/alsoft/generate.rsp b/eng/silktouch/openal/alsoft/generate.rsp
new file mode 100644
index 0000000000..9081666b1b
--- /dev/null
+++ b/eng/silktouch/openal/alsoft/generate.rsp
@@ -0,0 +1,21 @@
+@../settings.rsp
+@../remap.rsp
+--exclude
+_GUID
+--file
+openal-soft-al.h
+--methodClassName
+AL
+--namespace
+Silk.NET.OpenAL
+--output
+../../../../sources/OpenAL/al
+--test-output
+../../../../tests/OpenAL/al
+--traverse
+../../../submodules/openal-soft/include/AL/al.h
+../../../submodules/openal-soft/include/AL/alc.h
+../../../submodules/openal-soft/include/AL/alext.h
+../../../submodules/openal-soft/include/AL/efx.h
+../../../submodules/openal-soft/include/AL/efx-presets.h
+openal-soft-al.h
diff --git a/eng/silktouch/openal/alsoft/openal-soft-al.h b/eng/silktouch/openal/alsoft/openal-soft-al.h
new file mode 100644
index 0000000000..7d521d64df
--- /dev/null
+++ b/eng/silktouch/openal/alsoft/openal-soft-al.h
@@ -0,0 +1,123 @@
+#define AL_ALEXT_PROTOTYPES
+#include
+#include
+#include
+#include
+#include
+
+// ClangSharp won't grab the presets out of the macros as it doesn't know the types, but it will grab them out of a
+// constant.
+
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_GENERIC_ = EFX_REVERB_PRESET_GENERIC;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PADDED_CELL_ = EFX_REVERB_PRESET_PADDEDCELL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ROOM_ = EFX_REVERB_PRESET_ROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_BATHROOM_ = EFX_REVERB_PRESET_BATHROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_LIVING_ROOM_ = EFX_REVERB_PRESET_LIVINGROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_STONE_ROOM_ = EFX_REVERB_PRESET_STONEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_AUDITORIUM_ = EFX_REVERB_PRESET_AUDITORIUM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CONCERT_HALL_ = EFX_REVERB_PRESET_CONCERTHALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CAVE_ = EFX_REVERB_PRESET_CAVE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ARENA_ = EFX_REVERB_PRESET_ARENA;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_HANGAR_ = EFX_REVERB_PRESET_HANGAR;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CARPETED_HALLWAY_ = EFX_REVERB_PRESET_CARPETEDHALLWAY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_HALLWAY_ = EFX_REVERB_PRESET_HALLWAY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_STONE_CORRIDOR_ = EFX_REVERB_PRESET_STONECORRIDOR;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ALLEY_ = EFX_REVERB_PRESET_ALLEY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FOREST_ = EFX_REVERB_PRESET_FOREST;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_ = EFX_REVERB_PRESET_CITY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_MOUNTAINS_ = EFX_REVERB_PRESET_MOUNTAINS;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_QUARRY_ = EFX_REVERB_PRESET_QUARRY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PLAIN_ = EFX_REVERB_PRESET_PLAIN;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PARKINGLOT_ = EFX_REVERB_PRESET_PARKINGLOT;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SEWERPIPE_ = EFX_REVERB_PRESET_SEWERPIPE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_UNDERWATER_ = EFX_REVERB_PRESET_UNDERWATER;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRUGGED_ = EFX_REVERB_PRESET_DRUGGED;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DIZZY_ = EFX_REVERB_PRESET_DIZZY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PSYCHOTIC_ = EFX_REVERB_PRESET_PSYCHOTIC;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_SMALLROOM_ = EFX_REVERB_PRESET_CASTLE_SMALLROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_SHORTPASSAGE_ = EFX_REVERB_PRESET_CASTLE_SHORTPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_MEDIUMROOM_ = EFX_REVERB_PRESET_CASTLE_MEDIUMROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_LARGEROOM_ = EFX_REVERB_PRESET_CASTLE_LARGEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_LONGPASSAGE_ = EFX_REVERB_PRESET_CASTLE_LONGPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_HALL_ = EFX_REVERB_PRESET_CASTLE_HALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_CUPBOARD_ = EFX_REVERB_PRESET_CASTLE_CUPBOARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_COURTYARD_ = EFX_REVERB_PRESET_CASTLE_COURTYARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CASTLE_ALCOVE_ = EFX_REVERB_PRESET_CASTLE_ALCOVE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_SMALL_ROOM_ = EFX_REVERB_PRESET_FACTORY_SMALLROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_SHORT_PASSAGE_ = EFX_REVERB_PRESET_FACTORY_SHORTPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_MEDIUM_ROOM_ = EFX_REVERB_PRESET_FACTORY_MEDIUMROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_LARGE_ROOM_ = EFX_REVERB_PRESET_FACTORY_LARGEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_LONG_PASSAGE_ = EFX_REVERB_PRESET_FACTORY_LONGPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_HALL_ = EFX_REVERB_PRESET_FACTORY_HALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_CUPBOARD_ = EFX_REVERB_PRESET_FACTORY_CUPBOARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_COURTYARD_ = EFX_REVERB_PRESET_FACTORY_COURTYARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_FACTORY_ALCOVE_ = EFX_REVERB_PRESET_FACTORY_ALCOVE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_SMALL_ROOM_ = EFX_REVERB_PRESET_ICEPALACE_SMALLROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_SHORT_PASSAGE_ = EFX_REVERB_PRESET_ICEPALACE_SHORTPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_MEDIUM_ROOM_ = EFX_REVERB_PRESET_ICEPALACE_MEDIUMROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_LARGE_ROOM_ = EFX_REVERB_PRESET_ICEPALACE_LARGEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_LONG_PASSAGE_ = EFX_REVERB_PRESET_ICEPALACE_LONGPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_HALL_ = EFX_REVERB_PRESET_ICEPALACE_HALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_CUPBOARD_ = EFX_REVERB_PRESET_ICEPALACE_CUPBOARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_COURTYARD_ = EFX_REVERB_PRESET_ICEPALACE_COURTYARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_ICE_PALACE_ALCOVE_ = EFX_REVERB_PRESET_ICEPALACE_ALCOVE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_SMALL_ROOM_ = EFX_REVERB_PRESET_SPACESTATION_SMALLROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_SHORT_PASSAGE_ = EFX_REVERB_PRESET_SPACESTATION_SHORTPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_MEDIUM_ROOM_ = EFX_REVERB_PRESET_SPACESTATION_MEDIUMROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_LARGE_ROOM_ = EFX_REVERB_PRESET_SPACESTATION_LARGEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_LONG_PASSAGE_ = EFX_REVERB_PRESET_SPACESTATION_LONGPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_HALL_ = EFX_REVERB_PRESET_SPACESTATION_HALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_CUPBOARD_ = EFX_REVERB_PRESET_SPACESTATION_CUPBOARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPACE_STATION_ALCOVE_ = EFX_REVERB_PRESET_SPACESTATION_ALCOVE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_SMALL_ROOM_ = EFX_REVERB_PRESET_WOODEN_SMALLROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_SHORT_PASSAGE_ = EFX_REVERB_PRESET_WOODEN_SHORTPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_MEDIUM_ROOM_ = EFX_REVERB_PRESET_WOODEN_MEDIUMROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_LARGE_ROOM_ = EFX_REVERB_PRESET_WOODEN_LARGEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_LONG_PASSAGE_ = EFX_REVERB_PRESET_WOODEN_LONGPASSAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_HALL_ = EFX_REVERB_PRESET_WOODEN_HALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_CUPBOARD_ = EFX_REVERB_PRESET_WOODEN_CUPBOARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_COURTYARD_ = EFX_REVERB_PRESET_WOODEN_COURTYARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_WOODEN_ALCOVE_ = EFX_REVERB_PRESET_WOODEN_ALCOVE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_EMPTY_STADIUM_ = EFX_REVERB_PRESET_SPORT_EMPTYSTADIUM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_SQUASH_COURT_ = EFX_REVERB_PRESET_SPORT_SQUASHCOURT;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_SMALL_SWIMMING_POOL_ = EFX_REVERB_PRESET_SPORT_SMALLSWIMMINGPOOL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_LARGE_SWIMMING_POOL_ = EFX_REVERB_PRESET_SPORT_LARGESWIMMINGPOOL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_GYMNASIUM_ = EFX_REVERB_PRESET_SPORT_GYMNASIUM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_FULL_STADIUM_ = EFX_REVERB_PRESET_SPORT_FULLSTADIUM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SPORT_STADIUM_TANNOY_ = EFX_REVERB_PRESET_SPORT_STADIUMTANNOY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PREFAB_WORKSHOP_ = EFX_REVERB_PRESET_PREFAB_WORKSHOP;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PREFAB_SCHOOL_ROOM_ = EFX_REVERB_PRESET_PREFAB_SCHOOLROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PREFAB_PRACTISE_ROOM_ = EFX_REVERB_PRESET_PREFAB_PRACTISEROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PREFAB_OUTHOUSE_ = EFX_REVERB_PRESET_PREFAB_OUTHOUSE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PREFAB_CARAVAN_ = EFX_REVERB_PRESET_PREFAB_CARAVAN;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DOME_TOMB_ = EFX_REVERB_PRESET_DOME_TOMB;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PIPE_SMALL_ = EFX_REVERB_PRESET_PIPE_SMALL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DOME_SAINT_PAULS_ = EFX_REVERB_PRESET_DOME_SAINTPAULS;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PIPE_LONG_THIN_ = EFX_REVERB_PRESET_PIPE_LONGTHIN;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PIPE_LARGE_ = EFX_REVERB_PRESET_PIPE_LARGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_PIPE_RESONANT_ = EFX_REVERB_PRESET_PIPE_RESONANT;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_OUTDOORS_BACKYARD_ = EFX_REVERB_PRESET_OUTDOORS_BACKYARD;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_OUTDOORS_ROLLING_PLAINS_ = EFX_REVERB_PRESET_OUTDOORS_ROLLINGPLAINS;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_OUTDOORS_DEEP_CANYON_ = EFX_REVERB_PRESET_OUTDOORS_DEEPCANYON;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_OUTDOORS_CREEK_ = EFX_REVERB_PRESET_OUTDOORS_CREEK;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_OUTDOORS_VALLEY_ = EFX_REVERB_PRESET_OUTDOORS_VALLEY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_MOOD_HEAVEN_ = EFX_REVERB_PRESET_MOOD_HEAVEN;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_MOOD_HELL_ = EFX_REVERB_PRESET_MOOD_HELL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_MOOD_MEMORY_ = EFX_REVERB_PRESET_MOOD_MEMORY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_COMMENTATOR_ = EFX_REVERB_PRESET_DRIVING_COMMENTATOR;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_PIT_GARAGE_ = EFX_REVERB_PRESET_DRIVING_PITGARAGE;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_IN_CAR_RACER_ = EFX_REVERB_PRESET_DRIVING_INCAR_RACER;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_IN_CAR_SPORTS_ = EFX_REVERB_PRESET_DRIVING_INCAR_SPORTS;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_IN_CAR_LUXURY_ = EFX_REVERB_PRESET_DRIVING_INCAR_LUXURY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_FULL_GRAND_STAND_ = EFX_REVERB_PRESET_DRIVING_FULLGRANDSTAND;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_EMPTY_GRAND_STAND_ = EFX_REVERB_PRESET_DRIVING_EMPTYGRANDSTAND;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DRIVING_TUNNEL_ = EFX_REVERB_PRESET_DRIVING_TUNNEL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_STREETS_ = EFX_REVERB_PRESET_CITY_STREETS;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_SUBWAY_ = EFX_REVERB_PRESET_CITY_SUBWAY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_MUSEUM_ = EFX_REVERB_PRESET_CITY_MUSEUM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_LIBRARY_ = EFX_REVERB_PRESET_CITY_LIBRARY;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_UNDERPASS_ = EFX_REVERB_PRESET_CITY_UNDERPASS;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CITY_ABANDONED_ = EFX_REVERB_PRESET_CITY_ABANDONED;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_DUSTY_ROOM_ = EFX_REVERB_PRESET_DUSTYROOM;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_CHAPEL_ = EFX_REVERB_PRESET_CHAPEL;
+const EFXEAXREVERBPROPERTIES EFX_REVERB_PRESET_SMALL_WATERROOM_ = EFX_REVERB_PRESET_SMALLWATERROOM;
diff --git a/eng/silktouch/openal/header.txt b/eng/silktouch/openal/header.txt
new file mode 100644
index 0000000000..6b9a933505
--- /dev/null
+++ b/eng/silktouch/openal/header.txt
@@ -0,0 +1,6 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+// Generated using the OpenAL Soft headers and corresponding dependencies.
+// Original source is licensed under the LGPL 2.0 license. Please note that while bindings are able to be MIT due to
+// being header-derived only, implementations of the headers may have a less permissive license.
diff --git a/eng/silktouch/openal/remap.rsp b/eng/silktouch/openal/remap.rsp
new file mode 100644
index 0000000000..18913e81e0
--- /dev/null
+++ b/eng/silktouch/openal/remap.rsp
@@ -0,0 +1,2 @@
+--remap
+_GUID=System.Guid
diff --git a/eng/silktouch/openal/settings.rsp b/eng/silktouch/openal/settings.rsp
new file mode 100644
index 0000000000..7999f80104
--- /dev/null
+++ b/eng/silktouch/openal/settings.rsp
@@ -0,0 +1,12 @@
+@../../common.rsp
+--define-macro
+TODO_DEFINE_MACROS=HERE
+--headerFile
+../header.txt
+--include-directory
+../../../submodules/openal-soft/include
+../../../include
+--with-callconv
+*=Winapi
+--with-librarypath
+*=openal
diff --git a/eng/silktouch/vulkan/header.txt b/eng/silktouch/vulkan/header.txt
new file mode 100644
index 0000000000..450ff9e71a
--- /dev/null
+++ b/eng/silktouch/vulkan/header.txt
@@ -0,0 +1,5 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+// Ported from the Vulkan headers and corresponding dependencies.
+// Original source is Copyright 2015-2025 The Khronos Group Inc. Licensed under the MIT license.
diff --git a/eng/silktouch/vulkan/remap-stdint.rsp b/eng/silktouch/vulkan/remap-stdint.rsp
new file mode 100644
index 0000000000..6c84afe8a1
--- /dev/null
+++ b/eng/silktouch/vulkan/remap-stdint.rsp
@@ -0,0 +1,5 @@
+--remap
+int32_t=int
+uint32_t=uint
+int64_t=long
+uint64_t=ulong
diff --git a/eng/silktouch/vulkan/remap.rsp b/eng/silktouch/vulkan/remap.rsp
new file mode 100644
index 0000000000..48f05c3a4a
--- /dev/null
+++ b/eng/silktouch/vulkan/remap.rsp
@@ -0,0 +1 @@
+@../remap-stdint.rsp
diff --git a/eng/silktouch/vulkan/settings.rsp b/eng/silktouch/vulkan/settings.rsp
new file mode 100644
index 0000000000..be09fc22fa
--- /dev/null
+++ b/eng/silktouch/vulkan/settings.rsp
@@ -0,0 +1,11 @@
+@../../common.rsp
+--define-macro
+TODO_DEFINE_MACROS=HERE
+--headerFile
+../header.txt
+--include-directory
+../../../submodules/vulkan-headers/include
+--with-callconv
+*=Winapi
+--with-librarypath
+*=vulkan
diff --git a/eng/silktouch/vulkan/vulkan/generate.rsp b/eng/silktouch/vulkan/vulkan/generate.rsp
new file mode 100644
index 0000000000..df74316c3c
--- /dev/null
+++ b/eng/silktouch/vulkan/vulkan/generate.rsp
@@ -0,0 +1,29 @@
+@../settings.rsp
+@../remap.rsp
+--exclude
+VK_NULL_HANDLE
+--file
+vulkan-vulkan.h
+--methodClassName
+Vk
+--namespace
+Silk.NET.Vulkan
+--output
+../../../../sources/Vulkan/Vulkan
+--test-output
+../../../../tests/Vulkan/Vulkan
+--traverse
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_av1std.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_av1std_decode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_av1std_encode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_h264std.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_h264std_decode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_h264std_encode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_h265std.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_h265std_decode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_h265std_encode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_vp9std.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codec_vp9std_decode.h
+../../../submodules/vulkan-headers/include/vk_video/vulkan_video_codecs_common.h
+../../../submodules/vulkan-headers/include/vulkan/vulkan.h
+../../../submodules/vulkan-headers/include/vulkan/vulkan_core.h
diff --git a/eng/silktouch/vulkan/vulkan/vulkan-vulkan.h b/eng/silktouch/vulkan/vulkan/vulkan-vulkan.h
new file mode 100644
index 0000000000..06d9b70a59
--- /dev/null
+++ b/eng/silktouch/vulkan/vulkan/vulkan-vulkan.h
@@ -0,0 +1,14 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
diff --git a/eng/submodules/openal-soft b/eng/submodules/openal-soft
new file mode 160000
index 0000000000..9c50193236
--- /dev/null
+++ b/eng/submodules/openal-soft
@@ -0,0 +1 @@
+Subproject commit 9c50193236ad4d8c68f390a3151f8253709baabd
diff --git a/eng/submodules/silk.net-2.x b/eng/submodules/silk.net-2.x
index c0dbe83570..3c0313b2d6 160000
--- a/eng/submodules/silk.net-2.x
+++ b/eng/submodules/silk.net-2.x
@@ -1 +1 @@
-Subproject commit c0dbe835702d01a9f6fe2b5b2ca34f5780d3450d
+Subproject commit 3c0313b2d69bbde12224c759a76bc2e7e064a893
diff --git a/eng/submodules/vulkan b/eng/submodules/vulkan
new file mode 160000
index 0000000000..09d464f853
--- /dev/null
+++ b/eng/submodules/vulkan
@@ -0,0 +1 @@
+Subproject commit 09d464f85360160747c4ad6dc5a9841e15822aa5
diff --git a/eng/submodules/vulkan-headers b/eng/submodules/vulkan-headers
new file mode 160000
index 0000000000..3dda5a1a87
--- /dev/null
+++ b/eng/submodules/vulkan-headers
@@ -0,0 +1 @@
+Subproject commit 3dda5a1a87b62fdf3baf4680edc41c00e85a7a22
diff --git a/examples/CSharp/OpenAL/Tutorial001.HelloSound/Program.cs b/examples/CSharp/OpenAL/Tutorial001.HelloSound/Program.cs
new file mode 100644
index 0000000000..d9206d03fb
--- /dev/null
+++ b/examples/CSharp/OpenAL/Tutorial001.HelloSound/Program.cs
@@ -0,0 +1,90 @@
+using NAudio.Wave;
+using Silk.NET.OpenAL;
+
+// NOTE: If you prefer, you can use the static ALContext and AL functions instead of creating an API object!
+// Learn more: https://dotnet.github.io/Silk.NET/docs/v3/silk.net/static-vs-instance-bindings
+var alc = ALContext.Create(); // TODO disposable
+
+// Open an audio device.
+var device = alc.OpenDevice("");
+if (device == nullptr)
+{
+ Console.WriteLine("Could not create device");
+ return;
+}
+
+// Create an OpenAL context using that device.
+var context = alc.CreateContext(device, nullptr);
+if (context == nullptr)
+{
+ Console.WriteLine("Could not create context");
+ return;
+}
+
+// Make the context current on this thread.
+if (!alc.MakeContextCurrent(context))
+{
+ Console.WriteLine("Could not make context current");
+ return;
+}
+
+// Fetch basic metadata about the OpenAL implementation.
+foreach (
+ var pname in (IEnumerable)
+ [StringPName.Vendor, StringPName.Extensions, StringPName.Renderer, StringPName.Version]
+)
+{
+ Console.WriteLine($"{pname}: {AL.GetString(pname).ReadToString()}");
+}
+
+// Create an audio source and a buffer to store the audio data played by that source.
+var source = AL.GenSource();
+var buffer = AL.GenBuffer();
+
+// We're using NAudio to read the WAV file into a buffer we can then pass to OpenAL.
+// We do have to do a little bit of work to map wavReader.WaveFormat into OpenAL's Format enum though.
+using var wavReader = new WaveFileReader(Path.Combine(AppContext.BaseDirectory, "beep.wav"));
+var sampleSize = wavReader.WaveFormat.Channels * (wavReader.WaveFormat.BitsPerSample / 8);
+var sampleBuffer = new byte[sampleSize * wavReader.SampleCount];
+for (var i = 0; i < sampleSize; i += wavReader.Read(sampleBuffer, i, sampleBuffer.Length - i))
+{
+ // do nothing
+}
+
+// Upload the audio data to the audio device.
+var format = ConvertFormat(wavReader.WaveFormat);
+AL.BufferData(buffer, format, sampleBuffer, sampleBuffer.Length, wavReader.WaveFormat.SampleRate);
+AL.ThrowError();
+
+// Configure the audio source to loop its audio, and play it!
+// TODO this is crap - we should have a boolean overload.
+AL.Source(source, (ALEnum)SourceBoolean.Looping, 1);
+AL.Source(source, SourceInteger.Buffer, (int)buffer);
+AL.SourcePlay(source);
+AL.ThrowError();
+
+Console.WriteLine("Press Enter to Exit...");
+Console.ReadLine();
+
+// Stop playing audio.
+AL.SourceStop(source);
+
+// Cleanup!
+AL.DeleteSource(source);
+AL.DeleteBuffer(buffer);
+ALContext.DestroyContext(context);
+ALContext.CloseDevice(device);
+return;
+
+static Format ConvertFormat(WaveFormat format) =>
+ format switch
+ {
+ { Encoding: WaveFormatEncoding.Pcm, Channels: 1, BitsPerSample: 8 } => Format.FormatMono8,
+ { Encoding: WaveFormatEncoding.Pcm, Channels: 1, BitsPerSample: 16 } => Format.FormatMono16,
+ { Encoding: WaveFormatEncoding.Pcm, Channels: 2, BitsPerSample: 8 } => Format.FormatStereo8,
+ { Encoding: WaveFormatEncoding.Pcm, Channels: 2, BitsPerSample: 16 } =>
+ Format.FormatStereo16,
+ { Encoding: WaveFormatEncoding.MuLaw, Channels: 1 } => Format.FormatMonoMulaw,
+ { Encoding: WaveFormatEncoding.MuLaw, Channels: 2 } => Format.FormatStereoMulaw,
+ _ => throw new ArgumentOutOfRangeException(nameof(format), format, null),
+ };
diff --git a/examples/CSharp/OpenAL/Tutorial001.HelloSound/Tutorial001.HelloSound.csproj b/examples/CSharp/OpenAL/Tutorial001.HelloSound/Tutorial001.HelloSound.csproj
new file mode 100644
index 0000000000..f5b988b7bf
--- /dev/null
+++ b/examples/CSharp/OpenAL/Tutorial001.HelloSound/Tutorial001.HelloSound.csproj
@@ -0,0 +1,23 @@
+
+
+
+ Exe
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/CSharp/OpenAL/Tutorial001.HelloSound/beep.txt b/examples/CSharp/OpenAL/Tutorial001.HelloSound/beep.txt
new file mode 100644
index 0000000000..58a8d30ade
--- /dev/null
+++ b/examples/CSharp/OpenAL/Tutorial001.HelloSound/beep.txt
@@ -0,0 +1 @@
+Licensed under CC0 from https://opengameart.org/content/beep-sound
diff --git a/examples/CSharp/OpenAL/Tutorial001.HelloSound/beep.wav b/examples/CSharp/OpenAL/Tutorial001.HelloSound/beep.wav
new file mode 100644
index 0000000000..3eb1895119
Binary files /dev/null and b/examples/CSharp/OpenAL/Tutorial001.HelloSound/beep.wav differ
diff --git a/generator.json b/generator.json
index edfaa14c97..f1fc8b87e9 100644
--- a/generator.json
+++ b/generator.json
@@ -384,13 +384,217 @@
},
"PrettifyNames": {
"LongAcronymThreshold": 4,
- "GlobalPrefixHint": "gl"
+ "GlobalPrefixHints": ["gl"],
+ "PrefixOverrides": {
+ "SyncObjectMask": "GL_SYNC"
+ }
},
"TransformFunctions": {
"BoolTypes": {
"GLboolean": null
}
}
+ },
+ "OpenAL": {
+ "SourceProject": "sources/OpenAL/OpenAL/Silk.NET.OpenAL.csproj",
+ "Solution": "Silk.NET.sln",
+ "DefaultLicenseHeader": "eng/silktouch/header.txt",
+ "Mods": [
+ "AddIncludes",
+ "ClangScraper",
+ "ChangeNativeClass",
+ "AddApiProfiles",
+ "MixKhronosData",
+ "ExtractNestedTyping",
+ "TransformHandles",
+ "InterceptNativeFunctions",
+ "TransformFunctions",
+ "PrettifyNames",
+ "AddVTables"
+ ],
+ "ClangScraper": {
+ "ClangSharpResponseFiles": [
+ "eng/silktouch/openal*/**/generate.rsp"
+ ],
+ "InputSourceRoot": "sources/OpenAL",
+ "InputTestRoot": "tests/OpenAL"
+ },
+ "ChangeNativeClass": {
+ "NewClasses": {
+ "(alc|ALC_).*": "ALContext",
+ "EFX_REVERB_PRESET_.*": "EfxReverbPreset"
+ }
+ },
+ "MixKhronosData": {
+ "UseDataTypeTrimmings": true,
+ "SpecPath": "eng/submodules/openal-soft/registry/xml/al.xml",
+ "EnumNativeTypeNames": {
+ "ALenum": "ALEnum",
+ "ALCenum": "ALCEnum"
+ },
+ "Namespace": "Silk.NET.OpenAL",
+ "NonStandardExtensionNomenclature": true,
+ "Vendors": [
+ "SOFT",
+ "LOKI",
+ "EXT"
+ ],
+ "IgnoreNonVendorSuffixes": [
+ "Direct"
+ ]
+ },
+ "InterceptNativeFunctions": {
+ "NativeFunctionNames": [
+ "alcOpenDevice",
+ "alcMakeContextCurrent"
+ ]
+ },
+ "AddVTables": {
+ "VTables": [
+ {
+ "Kind": "DllImport"
+ },
+ {
+ "Kind": "StaticWrapper"
+ },
+ {
+ "Kind": "ThisThread",
+ "IsDefault": true,
+ "GenerateFactoryPartial": true
+ }
+ ]
+ },
+ "PrettifyNames": {
+ "LongAcronymThreshold": 4,
+ "GlobalPrefixHints": ["alc", "al"],
+ "NameOverrides": {
+ "ALContext": "ALContext",
+ "EFXEAXREVERBPROPERTIES": "EfxEaxReverbProperties",
+ "EFXEAXREVERBPROPERTIES_flReflectionsPan": "EfxEaxReverbPropertiesFlReflectionsPan",
+ "EFXEAXREVERBPROPERTIES_flLateReverbPan": "EfxEaxReverbPropertiesFlLateReverbPan",
+ "ALCcontextHandle": "ContextHandle",
+ "ALCdeviceHandle": "DeviceHandle",
+ "ALBUFFERCALLBACKTYPESOFT": "BufferCallbackSOFT",
+ "ALBUFFERCALLBACKTYPESOFTDelegate": "BufferCallbackDelegateSOFT",
+ "ALCEVENTPROCTYPESOFT": "ContextEventProcSOFT",
+ "ALCEVENTPROCTYPESOFTDelegate": "ContextEventProcDelegateSOFT",
+ "ALEVENTPROCSOFT": "EventProcSOFT",
+ "ALEVENTPROCSOFTDelegate": "EventProcDelegateSOFT",
+ "ALDEBUGPROCEXT": "DebugProcEXT",
+ "ALDEBUGPROCEXTDelegate": "DebugProcDelegateEXT",
+ "LPALFOLDBACKCALLBACK": "FoldbackCallback",
+ "LPALFOLDBACKCALLBACKDelegate": "FoldbackCallbackDelegate",
+ "EAXSetDirect": "EAXSetDirect",
+ "EAXGetDirect": "EAXGetDirect",
+ "EAXGetBufferModeDirect": "EAXGetBufferModeDirect",
+ "EAXSetBufferModeDirect": "EAXSetBufferModeDirect"
+ }
+ },
+ "TransformFunctions": {
+ "BoolTypes": {
+ "ALboolean": null,
+ "ALCboolean": null
+ },
+ "BenefitOfTheDoubtArrayTransformation": true
+ },
+ "TransformHandles": {
+ "AssumeMissingTypesOpaque": true,
+ "UseDSL": true
+ }
+ },
+ "Vulkan": {
+ "SourceProject": "sources/Vulkan/Vulkan/Silk.NET.Vulkan.csproj",
+ "Solution": "Silk.NET.sln",
+ "DefaultLicenseHeader": "eng/silktouch/header.txt",
+ "Mods": [
+ "AddIncludes",
+ "ClangScraper",
+ "AddApiProfiles",
+ "MixKhronosData",
+ "ExtractNestedTyping",
+ "TransformHandles",
+ "InterceptNativeFunctions",
+ "TransformFunctions",
+ "TransformProperties",
+ "PrettifyNames",
+ "TransformEnums",
+ "AddVTables"
+ ],
+ "ClangScraper": {
+ "ClangSharpResponseFiles": [
+ "eng/silktouch/vulkan/**/generate.rsp"
+ ],
+ "InputSourceRoot": "sources/Vulkan",
+ "InputTestRoot": "tests/Vulkan"
+ },
+ "AddApiProfiles": {
+ "Profiles": [
+ {
+ "Profile": "vulkan",
+ "SourceSubdirectory": "vulkan"
+ }
+ ]
+ },
+ "MixKhronosData": {
+ "SpecPath": "eng/submodules/vulkan/xml/vk.xml",
+ "Namespace": "Silk.NET.Vulkan",
+ "FlagsTypes": [
+ "VkFlags",
+ "VkFlags64"
+ ]
+ },
+ "InterceptNativeFunctions": {
+ "NativeFunctionNames": [
+ "vkCreateInstance",
+ "vkCreateDevice"
+ ]
+ },
+ "TransformFunctions": {
+ "BoolTypes": {
+ "VkBool32": null
+ }
+ },
+ "TransformHandles": {
+ "AssumeMissingTypesOpaque": true,
+ "UseDSL": true
+ },
+ "PrettifyNames": {
+ "LongAcronymThreshold": 4,
+ "GlobalPrefixHints": ["vk"],
+ "PrefixOverrides": {
+ "VkPipelineCreateFlags2": "VK_PIPELINE_CREATE_2"
+ }
+ },
+ "TransformEnums": {
+ "AddNoneMemberToFlags": true,
+ "RemoveMembers": [
+ {
+ "MemberName": "MaxEnum",
+ "MemberValue": "0x7FFFFFFF"
+ },
+ {
+ "MemberName": "Invalid",
+ "MemberValue": "0x7FFFFFFF"
+ }
+ ],
+ "CoerceBackingTypes": "PreferUnsigned",
+ "RewriteMemberValues": true
+ },
+ "AddVTables": {
+ "VTables": [
+ {
+ "Kind": "DllImport"
+ },
+ {
+ "Kind": "StaticWrapper"
+ },
+ {
+ "Kind": "ThisThread",
+ "IsDefault": true,
+ "GenerateFactoryPartial": true
+ }
+ ]
+ }
}
}
}
diff --git a/global.json b/global.json
index 5434a367e4..899a4df6e1 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "10.0.100-preview.7.25380.108",
+ "version": "10.0.100",
"rollForward": "major"
}
-}
\ No newline at end of file
+}
diff --git a/sources/Core/Core/Loader/LoaderInterface.cs b/sources/Core/Core/Loader/LoaderInterface.cs
index 49dab10b7c..e49329d12f 100644
--- a/sources/Core/Core/Loader/LoaderInterface.cs
+++ b/sources/Core/Core/Loader/LoaderInterface.cs
@@ -12,11 +12,18 @@ namespace Silk.NET.Core.Loader;
///
public static class LoaderInterface
{
- private static string? _current;
- private static bool _isInDllImport = false;
private static DllImportResolver? _dllImportResolver;
private static ConcurrentDictionary _loaded = new();
- private static ConditionalWeakTable> _hooked = new();
+ private static ConditionalWeakTable _hooked = new();
+
+ private class HookState
+ {
+ public bool IsContextHooked;
+ public string? Current;
+ public bool IsInDllImport;
+ }
+
+ static LoaderInterface() => ResolvingLibrary += LoadAlternativeNames;
///
/// Registers the multiplexer using
@@ -26,35 +33,42 @@ public static class LoaderInterface
public static void RegisterHook(Assembly? asm)
{
asm ??= Assembly.GetCallingAssembly();
- if (
- AssemblyLoadContext.GetLoadContext(asm) is { } alc
- && _hooked.GetOrCreateValue(alc) is { Value: false } box
- )
+ if (AssemblyLoadContext.GetLoadContext(asm) is not { } alc)
+ {
+ throw new ArgumentException(
+ "Assembly must be provided by the runtime (and thereby have an AssemblyLoadContext).",
+ nameof(asm)
+ );
+ }
+
+ var box = _hooked.GetOrCreateValue(alc);
+ if (!box.IsContextHooked)
{
- box.Value = true;
- alc.ResolvingUnmanagedDll += static (loadingAsm, lib) =>
+ box.IsContextHooked = true;
+ alc.ResolvingUnmanagedDll += (loadingAsm, lib) =>
{
- var wasInDllImport = _isInDllImport;
- if (!wasInDllImport && _current == lib)
+ var wasInDllImport = box.IsInDllImport;
+ if (!wasInDllImport && box.Current == lib)
{
// Cycle detected.
return 0;
}
- _isInDllImport = false;
- var ret = OnDllImport(lib, loadingAsm, null);
- _isInDllImport = wasInDllImport;
+ box.IsInDllImport = false;
+ var ret = OnDllImport(box, lib, loadingAsm, null);
+ box.IsInDllImport = wasInDllImport;
return ret;
};
}
+
NativeLibrary.SetDllImportResolver(
asm,
- static (x, y, z) =>
+ (x, y, z) =>
{
- var wasInDllImport = _isInDllImport;
- _isInDllImport = true;
- var ret = OnDllImport(x, y, z);
- _isInDllImport = wasInDllImport;
+ var wasInDllImport = box.IsInDllImport;
+ box.IsInDllImport = true;
+ var ret = OnDllImport(box, x, y, z);
+ box.IsInDllImport = wasInDllImport;
return ret;
}
);
@@ -98,6 +112,7 @@ public static event DllImportResolver? ResolvingLibrary
}
private static IntPtr OnDllImport(
+ HookState box,
string libraryname,
Assembly assembly,
DllImportSearchPath? searchpath
@@ -106,8 +121,8 @@ private static IntPtr OnDllImport(
libraryname,
_ =>
{
- var before = _current;
- _current = libraryname;
+ var before = box.Current;
+ box.Current = libraryname;
foreach (
var @delegate in (
_dllImportResolver?.GetInvocationList() ?? Enumerable.Empty()
@@ -119,11 +134,11 @@ var @delegate in (
continue;
}
- _current = before;
+ box.Current = before;
return handle;
}
- _current = before;
+ box.Current = before;
return 0;
}
);
@@ -133,11 +148,53 @@ var @delegate in (
///
/// The library name.
/// The alternative name to use when we can't load the usual name.
- public static void RegisterAlternativeName(string libraryName, string altName) =>
- ResolvingLibrary += (loadingLib, loadingAsm, searchPath) =>
- loadingLib == libraryName
- ? NativeLibrary.TryLoad(altName, loadingAsm, searchPath, out var handle)
- ? handle
- : 0
- : 0;
+ public static void RegisterAlternativeName(string libraryName, string altName)
+ {
+ var names = AlternativeNames.TryGetValue(libraryName, out var alts)
+ ? alts
+ : AlternativeNames[libraryName] = [];
+ if (!names.Contains(altName))
+ {
+ names.Add(altName);
+ }
+ }
+
+ ///
+ /// Gets the backing dictionary for . This can be manually modified if desired.
+ ///
+ public static Dictionary> AlternativeNames { get; } = new();
+
+ ///
+ /// A that uses to resolve the library.
+ ///
+ ///
+ /// This is publicised such that advanced users can remove this from if desired, as
+ /// it is added by default.
+ ///
+ /// The library name as seen in .
+ /// The resolving assembly.
+ /// The search path.
+ /// The handle.
+ ///
+ public static IntPtr LoadAlternativeNames(
+ string libraryName,
+ Assembly assembly,
+ DllImportSearchPath? searchPath
+ )
+ {
+ if (!AlternativeNames.TryGetValue(libraryName, out var alts))
+ {
+ return 0;
+ }
+
+ foreach (var alt in (IEnumerable)[libraryName, .. alts])
+ {
+ if (NativeLibrary.TryLoad(alt, assembly, searchPath, out var handle))
+ {
+ return handle;
+ }
+ }
+
+ return 0;
+ }
}
diff --git a/sources/Core/Core/PublicAPI/net10.0/PublicAPI.Unshipped.txt b/sources/Core/Core/PublicAPI/net10.0/PublicAPI.Unshipped.txt
index 7dc5c58110..82712591a3 100644
--- a/sources/Core/Core/PublicAPI/net10.0/PublicAPI.Unshipped.txt
+++ b/sources/Core/Core/PublicAPI/net10.0/PublicAPI.Unshipped.txt
@@ -1 +1,1245 @@
#nullable enable
+override Silk.NET.Core.AndroidPlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.CocoaPlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.Constant.GetHashCode() -> int
+override Silk.NET.Core.Constant.GetHashCode() -> int
+override Silk.NET.Core.EGLPlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.Handle.Equals(object? obj) -> bool
+override Silk.NET.Core.Handle.GetHashCode() -> int
+override Silk.NET.Core.Handle.ToString() -> string!
+override Silk.NET.Core.HResult.Equals(object? obj) -> bool
+override Silk.NET.Core.HResult.GetHashCode() -> int
+override Silk.NET.Core.HResult.ToString() -> string!
+override Silk.NET.Core.HString.Equals(object? obj) -> bool
+override Silk.NET.Core.HString.GetHashCode() -> int
+override Silk.NET.Core.HString.ToString() -> string!
+override Silk.NET.Core.MaybeBool.GetHashCode() -> int
+override Silk.NET.Core.MaybeBool.GetHashCode() -> int
+override Silk.NET.Core.NullPtr.GetHashCode() -> int
+override Silk.NET.Core.Ptr.Equals(object? obj) -> bool
+override Silk.NET.Core.Ptr.GetHashCode() -> int
+override Silk.NET.Core.Ptr2D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ptr2D.GetHashCode() -> int
+override Silk.NET.Core.Ptr2D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ptr2D.GetHashCode() -> int
+override Silk.NET.Core.Ptr3D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ptr3D.GetHashCode() -> int
+override Silk.NET.Core.Ptr3D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ptr3D.GetHashCode() -> int
+override Silk.NET.Core.Ptr.Equals(object? obj) -> bool
+override Silk.NET.Core.Ptr.GetHashCode() -> int
+override Silk.NET.Core.Ref.Equals(object? obj) -> bool
+override Silk.NET.Core.Ref.GetHashCode() -> int
+override Silk.NET.Core.Ref2D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ref2D.GetHashCode() -> int
+override Silk.NET.Core.Ref2D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ref2D.GetHashCode() -> int
+override Silk.NET.Core.Ref3D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ref3D.GetHashCode() -> int
+override Silk.NET.Core.Ref3D.Equals(object? obj) -> bool
+override Silk.NET.Core.Ref3D.GetHashCode() -> int
+override Silk.NET.Core.Ref.Equals(object? obj) -> bool
+override Silk.NET.Core.Ref.GetHashCode() -> int
+override Silk.NET.Core.UIKitPlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.Utf8String.ToString() -> string!
+override Silk.NET.Core.VivantePlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.WaylandPlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.Win32PlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.WinRTPlatformInfo.GetHashCode() -> int
+override Silk.NET.Core.X11PlatformInfo.GetHashCode() -> int
+readonly Silk.NET.Core.Handle.Value -> void*
+readonly Silk.NET.Core.HResult.Value -> int
+readonly Silk.NET.Core.HString.Value -> void*
+readonly Silk.NET.Core.Ptr.Native -> void*
+readonly Silk.NET.Core.Ptr2D.Native -> Silk.NET.Core.Ptr*
+readonly Silk.NET.Core.Ptr2D.Native -> Silk.NET.Core.Ptr*
+readonly Silk.NET.Core.Ptr3D.Native -> Silk.NET.Core.Ptr2D*
+readonly Silk.NET.Core.Ptr3D.Native -> Silk.NET.Core.Ptr2D*
+readonly Silk.NET.Core.Ptr.Native -> T*
+readonly Silk.NET.Core.Ref.Handle -> byte
+readonly Silk.NET.Core.Ref.Handle -> T
+Silk.NET.Core.AndroidPlatformInfo
+Silk.NET.Core.AndroidPlatformInfo.AndroidPlatformInfo() -> void
+Silk.NET.Core.AndroidPlatformInfo.AndroidPlatformInfo(nint Window, nint Surface) -> void
+Silk.NET.Core.AndroidPlatformInfo.Deconstruct(out nint Window, out nint Surface) -> void
+Silk.NET.Core.AndroidPlatformInfo.Equals(Silk.NET.Core.AndroidPlatformInfo other) -> bool
+Silk.NET.Core.AndroidPlatformInfo.Surface.get -> nint
+Silk.NET.Core.AndroidPlatformInfo.Surface.init -> void
+Silk.NET.Core.AndroidPlatformInfo.Window.get -> nint
+Silk.NET.Core.AndroidPlatformInfo.Window.init -> void
+Silk.NET.Core.AsyncIUnknown
+Silk.NET.Core.AsyncIUnknown.AddRef() -> uint
+Silk.NET.Core.AsyncIUnknown.AsyncIUnknown() -> void
+Silk.NET.Core.AsyncIUnknown.AsyncIUnknown(Silk.NET.Core.Ptr3D vtbl) -> void
+Silk.NET.Core.AsyncIUnknown.AsyncIUnknown(Silk.NET.Core.Ptr vtbl) -> void
+Silk.NET.Core.AsyncIUnknown.Begin_AddRef() -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Begin_QueryInterface(Silk.NET.Core.Ref riid) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Begin_QueryInterface(System.Guid* riid) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Begin_Release() -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Finish_AddRef() -> uint
+Silk.NET.Core.AsyncIUnknown.Finish_QueryInterface(Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Finish_QueryInterface(void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Finish_Release() -> uint
+Silk.NET.Core.AsyncIUnknown.Interface
+Silk.NET.Core.AsyncIUnknown.Interface.Begin_AddRef() -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Interface.Begin_QueryInterface(Silk.NET.Core.Ref riid) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Interface.Begin_QueryInterface(System.Guid* riid) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Interface.Begin_Release() -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Interface.Finish_AddRef() -> uint
+Silk.NET.Core.AsyncIUnknown.Interface.Finish_QueryInterface(Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Interface.Finish_QueryInterface(void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Interface.Finish_Release() -> uint
+Silk.NET.Core.AsyncIUnknown.LpVtbl -> Silk.NET.Core.AsyncIUnknown.Native*
+Silk.NET.Core.AsyncIUnknown.Native
+Silk.NET.Core.AsyncIUnknown.Native.AddRef() -> uint
+Silk.NET.Core.AsyncIUnknown.Native.Begin_AddRef() -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Begin_QueryInterface(Silk.NET.Core.Ref riid) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Begin_QueryInterface(System.Guid* riid) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Begin_Release() -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Finish_AddRef() -> uint
+Silk.NET.Core.AsyncIUnknown.Native.Finish_QueryInterface(Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Finish_QueryInterface(void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Finish_Release() -> uint
+Silk.NET.Core.AsyncIUnknown.Native.lpVtbl -> void**
+Silk.NET.Core.AsyncIUnknown.Native.Native() -> void
+Silk.NET.Core.AsyncIUnknown.Native.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Native.Release() -> uint
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.AddRef -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Begin_AddRef -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Begin_QueryInterface -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Begin_Release -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Finish_AddRef -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Finish_QueryInterface -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Finish_Release -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.QueryInterface -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Release -> delegate* unmanaged
+Silk.NET.Core.AsyncIUnknown.Native.Vtbl.Vtbl() -> void
+Silk.NET.Core.AsyncIUnknown.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.AsyncIUnknown.Release() -> uint
+Silk.NET.Core.BreakneckLock
+Silk.NET.Core.BreakneckLock.BreakneckLock() -> void
+Silk.NET.Core.BreakneckLock.Enter(ref bool taken) -> void
+Silk.NET.Core.BreakneckLock.Exit() -> void
+Silk.NET.Core.BreakneckLock.Exit(bool insertMemBarrier) -> void
+Silk.NET.Core.BreakneckLock.ExitWithBarrier() -> void
+Silk.NET.Core.BreakneckLock.IsAcquired.get -> bool
+Silk.NET.Core.BreakneckLock.TryEnter(ref bool taken) -> void
+Silk.NET.Core.BreakneckLock.TryEnter(ref bool taken, System.TimeSpan timeout) -> void
+Silk.NET.Core.BreakneckLock.TryEnter(ref bool taken, uint iterations) -> void
+Silk.NET.Core.BreakneckRequest
+Silk.NET.Core.BreakneckRequest.BreakneckRequest() -> void
+Silk.NET.Core.BreakneckRequest.Provide(TResource resource) -> void
+Silk.NET.Core.BreakneckRequest.Request(TParameters parameters) -> TResource
+Silk.NET.Core.BreakneckRequest.TryGetRequest(out TParameters? parameters) -> bool
+Silk.NET.Core.BreakneckRequest
+Silk.NET.Core.BreakneckRequest.BreakneckRequest() -> void
+Silk.NET.Core.BreakneckRequest.IsRequested.get -> bool
+Silk.NET.Core.BreakneckRequest.Provide(TResource resource) -> void
+Silk.NET.Core.BreakneckRequest.Request() -> TResource
+Silk.NET.Core.CocoaPlatformInfo
+Silk.NET.Core.CocoaPlatformInfo.CocoaPlatformInfo() -> void
+Silk.NET.Core.CocoaPlatformInfo.CocoaPlatformInfo(nint Window) -> void
+Silk.NET.Core.CocoaPlatformInfo.Deconstruct(out nint Window) -> void
+Silk.NET.Core.CocoaPlatformInfo.Equals(Silk.NET.Core.CocoaPlatformInfo other) -> bool
+Silk.NET.Core.CocoaPlatformInfo.Window.get -> nint
+Silk.NET.Core.CocoaPlatformInfo.Window.init -> void
+Silk.NET.Core.Constant
+Silk.NET.Core.Constant.Constant() -> void
+Silk.NET.Core.Constant.Constant(TUnderlying Value) -> void
+Silk.NET.Core.Constant.Deconstruct(out TUnderlying Value) -> void
+Silk.NET.Core.Constant.Equals(Silk.NET.Core.Constant other) -> bool
+Silk.NET.Core.Constant.Value.get -> TUnderlying
+Silk.NET.Core.Constant.Value.init -> void
+Silk.NET.Core.Constant
+Silk.NET.Core.Constant.Constant() -> void
+Silk.NET.Core.Constant.Constant(TUnderlying Value) -> void
+Silk.NET.Core.Constant.Deconstruct(out TUnderlying Value) -> void
+Silk.NET.Core.Constant.Equals(Silk.NET.Core.Constant other) -> bool
+Silk.NET.Core.Constant.Value.get -> TUnderlying
+Silk.NET.Core.Constant.Value.init -> void
+Silk.NET.Core.CppAttributeListAttribute
+Silk.NET.Core.CppAttributeListAttribute.AttributeList.get -> string!
+Silk.NET.Core.CppAttributeListAttribute.CppAttributeListAttribute(string! attributeList) -> void
+Silk.NET.Core.Default
+Silk.NET.Core.Default.Default() -> void
+Silk.NET.Core.DSL
+Silk.NET.Core.EGLPlatformInfo
+Silk.NET.Core.EGLPlatformInfo.Deconstruct(out nint Display, out nint Surface) -> void
+Silk.NET.Core.EGLPlatformInfo.Display.get -> nint
+Silk.NET.Core.EGLPlatformInfo.Display.init -> void
+Silk.NET.Core.EGLPlatformInfo.EGLPlatformInfo() -> void
+Silk.NET.Core.EGLPlatformInfo.EGLPlatformInfo(nint Display, nint Surface) -> void
+Silk.NET.Core.EGLPlatformInfo.Equals(Silk.NET.Core.EGLPlatformInfo other) -> bool
+Silk.NET.Core.EGLPlatformInfo.Surface.get -> nint
+Silk.NET.Core.EGLPlatformInfo.Surface.init -> void
+Silk.NET.Core.Handle
+Silk.NET.Core.Handle.CompareTo(object? obj) -> int
+Silk.NET.Core.Handle.CompareTo(Silk.NET.Core.Handle other) -> int
+Silk.NET.Core.Handle.Equals(Silk.NET.Core.Handle other) -> bool
+Silk.NET.Core.Handle.Handle() -> void
+Silk.NET.Core.Handle.Handle(void* value) -> void
+Silk.NET.Core.Handle.ToString(string? format, System.IFormatProvider? formatProvider) -> string!
+Silk.NET.Core.HResult
+Silk.NET.Core.HResult.Code.get -> int
+Silk.NET.Core.HResult.CompareTo(object? obj) -> int
+Silk.NET.Core.HResult.CompareTo(Silk.NET.Core.HResult other) -> int
+Silk.NET.Core.HResult.Equals(Silk.NET.Core.HResult other) -> bool
+Silk.NET.Core.HResult.Facility.get -> int
+Silk.NET.Core.HResult.Failed.get -> bool
+Silk.NET.Core.HResult.HResult() -> void
+Silk.NET.Core.HResult.HResult(int severity, int facility, int code) -> void
+Silk.NET.Core.HResult.HResult(int value) -> void
+Silk.NET.Core.HResult.IsError.get -> bool
+Silk.NET.Core.HResult.IsFailure.get -> bool
+Silk.NET.Core.HResult.IsSuccess.get -> bool
+Silk.NET.Core.HResult.Severity.get -> int
+Silk.NET.Core.HResult.Succeeded.get -> bool
+Silk.NET.Core.HResult.Throw() -> void
+Silk.NET.Core.HResult.ToString(string? format, System.IFormatProvider? formatProvider) -> string!
+Silk.NET.Core.HString
+Silk.NET.Core.HString.CompareTo(object? obj) -> int
+Silk.NET.Core.HString.CompareTo(Silk.NET.Core.HString other) -> int
+Silk.NET.Core.HString.Equals(Silk.NET.Core.HString other) -> bool
+Silk.NET.Core.HString.HString() -> void
+Silk.NET.Core.HString.HString(void* value) -> void
+Silk.NET.Core.HString.ToString(string? format, System.IFormatProvider? formatProvider) -> string!
+Silk.NET.Core.IBoolScheme
+Silk.NET.Core.IBoolScheme.False() -> T
+Silk.NET.Core.IBoolScheme.IsTrue(T value) -> bool
+Silk.NET.Core.IBoolScheme.True() -> T
+Silk.NET.Core.IClassFactory
+Silk.NET.Core.IClassFactory.AddRef() -> uint
+Silk.NET.Core.IClassFactory.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.IClassFactory() -> void
+Silk.NET.Core.IClassFactory.IClassFactory(Silk.NET.Core.Ptr3D vtbl) -> void
+Silk.NET.Core.IClassFactory.IClassFactory(Silk.NET.Core.Ptr vtbl) -> void
+Silk.NET.Core.IClassFactory.Interface
+Silk.NET.Core.IClassFactory.Interface.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Interface.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Interface.LockServer(Silk.NET.Core.MaybeBool fLock) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.LockServer(Silk.NET.Core.MaybeBool fLock) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.LpVtbl -> Silk.NET.Core.IClassFactory.Native*
+Silk.NET.Core.IClassFactory.Native
+Silk.NET.Core.IClassFactory.Native.AddRef() -> uint
+Silk.NET.Core.IClassFactory.Native.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.CreateInstance(Silk.NET.Core.IUnknown pUnkOuter, out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.LockServer(Silk.NET.Core.MaybeBool fLock) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.lpVtbl -> void**
+Silk.NET.Core.IClassFactory.Native.Native() -> void
+Silk.NET.Core.IClassFactory.Native.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Native.Release() -> uint
+Silk.NET.Core.IClassFactory.Native.Vtbl
+Silk.NET.Core.IClassFactory.Native.Vtbl.AddRef -> delegate* unmanaged
+Silk.NET.Core.IClassFactory.Native.Vtbl.CreateInstance -> delegate* unmanaged
+Silk.NET.Core.IClassFactory.Native.Vtbl.LockServer -> delegate* unmanaged, Silk.NET.Core.HResult>
+Silk.NET.Core.IClassFactory.Native.Vtbl.QueryInterface -> delegate* unmanaged
+Silk.NET.Core.IClassFactory.Native.Vtbl.Release -> delegate* unmanaged
+Silk.NET.Core.IClassFactory.Native.Vtbl.Vtbl() -> void
+Silk.NET.Core.IClassFactory.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IClassFactory.Release() -> uint
+Silk.NET.Core.IComVtbl
+Silk.NET.Core.IComVtbl.GetAddressOf() -> Silk.NET.Core.Ptr2D
+Silk.NET.Core.IComVtbl.GetAddressOf() -> Silk.NET.Core.Ptr2D
+Silk.NET.Core.IComVtbl
+Silk.NET.Core.IGLContext
+Silk.NET.Core.IGLContext.IsCurrent.get -> bool
+Silk.NET.Core.IGLContext.IsCurrent.set -> void
+Silk.NET.Core.IGLContext.SwapBuffers() -> void
+Silk.NET.Core.IGLContext.SwapInterval.get -> int
+Silk.NET.Core.IGLContext.SwapInterval.set -> void
+Silk.NET.Core.IGLContext.VSync.get -> bool
+Silk.NET.Core.IGLContext.VSync.set -> void
+Silk.NET.Core.IGLContextSource
+Silk.NET.Core.IGLContextSource.GLContext.get -> Silk.NET.Core.IGLContext?
+Silk.NET.Core.IID
+Silk.NET.Core.IInspectable
+Silk.NET.Core.IInspectable.AddRef() -> uint
+Silk.NET.Core.IInspectable.GetIids(Silk.NET.Core.Ref iidCount, Silk.NET.Core.Ref2D iids) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.GetIids(uint* iidCount, System.Guid** iids) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.GetRuntimeClassName(Silk.NET.Core.HString* className) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.GetRuntimeClassName(Silk.NET.Core.Ref className) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.GetTrustLevel(Silk.NET.Core.Ref trustLevel) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.GetTrustLevel(Silk.NET.Core.TrustLevel* trustLevel) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.IInspectable() -> void
+Silk.NET.Core.IInspectable.IInspectable(Silk.NET.Core.Ptr3D vtbl) -> void
+Silk.NET.Core.IInspectable.IInspectable(Silk.NET.Core.Ptr vtbl) -> void
+Silk.NET.Core.IInspectable.Interface
+Silk.NET.Core.IInspectable.Interface.GetIids(Silk.NET.Core.Ref iidCount, Silk.NET.Core.Ref2D iids) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Interface.GetIids(uint* iidCount, System.Guid** iids) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Interface.GetRuntimeClassName(Silk.NET.Core.HString* className) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Interface.GetRuntimeClassName(Silk.NET.Core.Ref className) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Interface.GetTrustLevel(Silk.NET.Core.Ref trustLevel) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Interface.GetTrustLevel(Silk.NET.Core.TrustLevel* trustLevel) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.LpVtbl -> Silk.NET.Core.IInspectable.Native*
+Silk.NET.Core.IInspectable.Native
+Silk.NET.Core.IInspectable.Native.AddRef() -> uint
+Silk.NET.Core.IInspectable.Native.GetIids(Silk.NET.Core.Ref iidCount, Silk.NET.Core.Ref2D iids) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.GetIids(uint* iidCount, System.Guid** iids) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.GetRuntimeClassName(Silk.NET.Core.HString* className) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.GetRuntimeClassName(Silk.NET.Core.Ref className) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.GetTrustLevel(Silk.NET.Core.Ref trustLevel) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.GetTrustLevel(Silk.NET.Core.TrustLevel* trustLevel) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.lpVtbl -> void**
+Silk.NET.Core.IInspectable.Native.Native() -> void
+Silk.NET.Core.IInspectable.Native.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Native.Release() -> uint
+Silk.NET.Core.IInspectable.Native.Vtbl
+Silk.NET.Core.IInspectable.Native.Vtbl.AddRef -> delegate* unmanaged
+Silk.NET.Core.IInspectable.Native.Vtbl.GetIids -> delegate* unmanaged
+Silk.NET.Core.IInspectable.Native.Vtbl.GetRuntimeClassName -> delegate* unmanaged
+Silk.NET.Core.IInspectable.Native.Vtbl.GetTrustLevel -> delegate* unmanaged
+Silk.NET.Core.IInspectable.Native.Vtbl.QueryInterface -> delegate* unmanaged
+Silk.NET.Core.IInspectable.Native.Vtbl.Release -> delegate* unmanaged
+Silk.NET.Core.IInspectable.Native.Vtbl.Vtbl() -> void
+Silk.NET.Core.IInspectable.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IInspectable.Release() -> uint
+Silk.NET.Core.INativeGuid
+Silk.NET.Core.INativeGuid.NativeGuid.get -> System.Guid*
+Silk.NET.Core.INativeWindow
+Silk.NET.Core.INativeWindow.TryGetPlatformInfo(out TPlatformInfo? info) -> bool
+Silk.NET.Core.IUnknown
+Silk.NET.Core.IUnknown.AddRef() -> uint
+Silk.NET.Core.IUnknown.Interface
+Silk.NET.Core.IUnknown.Interface.AddRef() -> uint
+Silk.NET.Core.IUnknown.Interface.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.Interface.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.Interface.Release() -> uint
+Silk.NET.Core.IUnknown.IUnknown() -> void
+Silk.NET.Core.IUnknown.IUnknown(Silk.NET.Core.Ptr3D vtbl) -> void
+Silk.NET.Core.IUnknown.IUnknown(Silk.NET.Core.Ptr vtbl) -> void
+Silk.NET.Core.IUnknown.LpVtbl -> Silk.NET.Core.IUnknown.Native*
+Silk.NET.Core.IUnknown.Native
+Silk.NET.Core.IUnknown.Native.AddRef() -> uint
+Silk.NET.Core.IUnknown.Native.lpVtbl -> void**
+Silk.NET.Core.IUnknown.Native.Native() -> void
+Silk.NET.Core.IUnknown.Native.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.Native.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.Native.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.Native.Release() -> uint
+Silk.NET.Core.IUnknown.Native.Vtbl
+Silk.NET.Core.IUnknown.Native.Vtbl.AddRef -> delegate* unmanaged
+Silk.NET.Core.IUnknown.Native.Vtbl.QueryInterface -> delegate* unmanaged
+Silk.NET.Core.IUnknown.Native.Vtbl.Release -> delegate* unmanaged
+Silk.NET.Core.IUnknown.Native.Vtbl.Vtbl() -> void
+Silk.NET.Core.IUnknown.QueryInterface(Silk.NET.Core.Ref riid, Silk.NET.Core.Ref2D ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.QueryInterface(System.Guid* riid, void** ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.QueryInterface(out TCom ppvObject) -> Silk.NET.Core.HResult
+Silk.NET.Core.IUnknown.Release() -> uint
+Silk.NET.Core.Loader.DefaultNativeContext
+Silk.NET.Core.Loader.DefaultNativeContext.DefaultNativeContext() -> void
+Silk.NET.Core.Loader.DefaultNativeContext.Dispose() -> void
+Silk.NET.Core.Loader.DefaultNativeContext.LoadFunction(string! functionName, string! libraryNameHint) -> void*
+Silk.NET.Core.Loader.INativeContext
+Silk.NET.Core.Loader.INativeContext.LoadFunction(string! functionName, string! libraryNameHint) -> void*
+Silk.NET.Core.Loader.LambdaNativeContext
+Silk.NET.Core.Loader.LambdaNativeContext.Dispose() -> void
+Silk.NET.Core.Loader.LambdaNativeContext.LambdaNativeContext() -> void
+Silk.NET.Core.Loader.LambdaNativeContext.LambdaNativeContext(System.Func! loader) -> void
+Silk.NET.Core.Loader.LambdaNativeContext.LoadFunction(string! functionName, string! libraryNameHint) -> void*
+Silk.NET.Core.Loader.LoaderInterface
+Silk.NET.Core.MaybeBool
+Silk.NET.Core.MaybeBool.Deconstruct(out T Value) -> void
+Silk.NET.Core.MaybeBool.Equals(Silk.NET.Core.MaybeBool other) -> bool
+Silk.NET.Core.MaybeBool.MaybeBool() -> void
+Silk.NET.Core.MaybeBool.MaybeBool(T Value) -> void
+Silk.NET.Core.MaybeBool.Value.get -> T
+Silk.NET.Core.MaybeBool.Value.init -> void
+Silk.NET.Core.MaybeBool
+Silk.NET.Core.MaybeBool.Deconstruct(out T Value) -> void
+Silk.NET.Core.MaybeBool.Equals(Silk.NET.Core.MaybeBool other) -> bool
+Silk.NET.Core.MaybeBool.MaybeBool() -> void
+Silk.NET.Core.MaybeBool.MaybeBool(T Value) -> void
+Silk.NET.Core.MaybeBool.Value.get -> T
+Silk.NET.Core.MaybeBool.Value.init -> void
+Silk.NET.Core.NativeFunctionAttribute
+Silk.NET.Core.NativeFunctionAttribute.EntryPoint -> string?
+Silk.NET.Core.NativeFunctionAttribute.NativeFunctionAttribute(string! dllName) -> void
+Silk.NET.Core.NativeFunctionAttribute.Value.get -> string!
+Silk.NET.Core.NativeInheritanceAttribute
+Silk.NET.Core.NativeInheritanceAttribute.Name.get -> string!
+Silk.NET.Core.NativeInheritanceAttribute.NativeInheritanceAttribute(string! name) -> void
+Silk.NET.Core.NativeTypeNameAttribute
+Silk.NET.Core.NativeTypeNameAttribute.Name.get -> string!
+Silk.NET.Core.NativeTypeNameAttribute.NativeTypeNameAttribute(string! name) -> void
+Silk.NET.Core.NullPtr
+Silk.NET.Core.NullPtr.Equals(Silk.NET.Core.NullPtr other) -> bool
+Silk.NET.Core.NullPtr.NullPtr() -> void
+Silk.NET.Core.PointerExtensions
+Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr.AsSpan(int length) -> System.Span
+Silk.NET.Core.Ptr.GetPinnableReference() -> byte
+Silk.NET.Core.Ptr.Handle.get -> byte
+Silk.NET.Core.Ptr.Ptr() -> void
+Silk.NET.Core.Ptr.Ptr(void* ptr) -> void
+Silk.NET.Core.Ptr.ReadToString() -> string!
+Silk.NET.Core.Ptr.this[nuint index].get -> byte
+Silk.NET.Core.Ptr.ToArray(int length) -> T[]!
+Silk.NET.Core.Ptr2D
+Silk.NET.Core.Ptr2D.AsSpan(int length) -> System.Span
+Silk.NET.Core.Ptr2D.GetPinnableReference() -> void*
+Silk.NET.Core.Ptr2D.Handle.get -> byte
+Silk.NET.Core.Ptr2D.Ptr2D() -> void
+Silk.NET.Core.Ptr2D.Ptr2D(Silk.NET.Core.Ptr* ptr) -> void
+Silk.NET.Core.Ptr2D.Ptr2D(void** ptr) -> void
+Silk.NET.Core.Ptr2D.ReadToStringArray(int length) -> string?[]?
+Silk.NET.Core.Ptr2D.this[nuint index].get -> Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr2D.ToArray(int length) -> T[]!
+Silk.NET.Core.Ptr2D.ToArray(int length, int[]! lengths) -> T[]![]!
+Silk.NET.Core.Ptr2D.Value.get -> byte
+Silk.NET.Core.Ptr2D
+Silk.NET.Core.Ptr2D.AsSpan(int length) -> System.Span>
+Silk.NET.Core.Ptr2D.GetPinnableReference() -> T*
+Silk.NET.Core.Ptr2D.Handle.get -> Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr2D.Ptr2D() -> void
+Silk.NET.Core.Ptr2D.Ptr2D(Silk.NET.Core.Ptr* ptr) -> void
+Silk.NET.Core.Ptr2D.Ptr2D(T** ptr) -> void
+Silk.NET.Core.Ptr2D.Ptr2D(void** ptr) -> void
+Silk.NET.Core.Ptr2D.this[nuint index].get -> Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr2D.ToArray(int length) -> Silk.NET.Core.Ptr[]!
+Silk.NET.Core.Ptr2D.ToArray(int length, int[]! lengths) -> T[]![]!
+Silk.NET.Core.Ptr2D.Value.get -> T
+Silk.NET.Core.Ptr3D
+Silk.NET.Core.Ptr3D.AsSpan(int length) -> System.Span
+Silk.NET.Core.Ptr3D.GetPinnableReference() -> void**
+Silk.NET.Core.Ptr3D.Handle.get -> byte
+Silk.NET.Core.Ptr3D.Ptr3D() -> void
+Silk.NET.Core.Ptr3D.Ptr3D(Silk.NET.Core.Ptr2D* ptr) -> void
+Silk.NET.Core.Ptr3D.Ptr3D(void*** ptr) -> void
+Silk.NET.Core.Ptr3D.ReadToStringArray(int length, int[]! lengths) -> string?[]?[]?
+Silk.NET.Core.Ptr3D.this[nuint index].get -> Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr3D.ToArray(int length) -> T[]!
+Silk.NET.Core.Ptr3D.ToArray(int length, int[]! lengths) -> T[]![]!
+Silk.NET.Core.Ptr3D.ToArray(int length, int[]! lengths0, int[]![]! lengths1) -> T[]![]![]!
+Silk.NET.Core.Ptr3D.Value.get -> byte
+Silk.NET.Core.Ptr3D
+Silk.NET.Core.Ptr3D.AsSpan(int length) -> System.Span>
+Silk.NET.Core.Ptr3D.GetPinnableReference() -> T**
+Silk.NET.Core.Ptr3D.Handle.get -> Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr3D.Ptr3D() -> void
+Silk.NET.Core.Ptr3D.Ptr3D(Silk.NET.Core.Ptr2D* ptr) -> void
+Silk.NET.Core.Ptr3D.Ptr3D(T*** ptr) -> void
+Silk.NET.Core.Ptr3D.Ptr3D(void*** ptr) -> void
+Silk.NET.Core.Ptr3D.this[nuint index].get -> Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr3D.ToArray(int length) -> Silk.NET.Core.Ptr2D[]!
+Silk.NET.Core.Ptr3D.ToArray(int length, int[]! lengths) -> Silk.NET.Core.Ptr[]![]!
+Silk.NET.Core.Ptr3D.ToArray(int length, int[]! lengths0, int[]![]! lengths1) -> T[]![]![]!
+Silk.NET.Core.Ptr3D.Value.get -> T
+Silk.NET.Core.Ptr
+Silk.NET.Core.Ptr.AsSpan(int length) -> System.Span
+Silk.NET.Core.Ptr.GetPinnableReference() -> T
+Silk.NET.Core.Ptr.Handle.get -> T
+Silk.NET.Core.Ptr.Ptr() -> void
+Silk.NET.Core.Ptr.Ptr(T* ptr) -> void
+Silk.NET.Core.Ptr