From 9f3091c9309fd27d5c5002278690e9eee94075cf Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Wed, 18 Aug 2021 21:57:01 +0100 Subject: [PATCH 1/9] Initial pass of adding .NET 6 support for sustaining --- .github/workflows/build.yml | 11 ++-- .github/workflows/deploy.yml | 9 ++- Silk.NET.sln | 13 ++++ global.json | 2 +- .../Silk.NET.Windowing.Sdl/SdlView.cs | 15 ++--- .../Silk.NET.Windowing.Sdl/SdlVkSurface.cs | 1 - .../Silk.NET.Windowing.Sdl.csproj | 62 ++++++++++++++++++- .../Silk.NET.Windowing.csproj | 13 +++- .../{Class1.cs => SilkMobile.cs} | 0 9 files changed, 107 insertions(+), 19 deletions(-) rename src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/{Class1.cs => SilkMobile.cs} (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5b8aabe34a..c1e6f0c8b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,16 +13,15 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'true' - - name: Setup .NET 5.0 + - name: Setup .NET 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: 5.0.201 - - name: Setup .NET Core 3.1 - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 3.1.404 + dotnet-version: 6.0.100-preview.7.21379.14 - name: Setup NUKE run: dotnet tool install Nuke.GlobalTool --global + - name: Install Workloads + # TODO: This is slow. Maybe we can make a docker container with this already done? + run: dotnet workload install android android-aot ios maccatalyst maui - name: Test # skip Clean, Restore, and Compile as this will build the affect the whole solution. # dotnet test will compile the necessary projects for testing only. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ef20681386..81b528b511 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,10 +12,15 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'true' - - name: Setup .NET Core + - name: Setup .NET 6.0 uses: actions/setup-dotnet@v1 with: - dotnet-version: 5.0.201 + dotnet-version: 6.0.100-preview.7.21379.14 + - name: Setup NUKE + run: dotnet tool install Nuke.GlobalTool --global + - name: Install Workloads + # TODO: This is slow. Maybe we can make a docker container with this already done? + run: dotnet workload install android android-aot ios maccatalyst maui - name: Setup NUKE run: dotnet tool install Nuke.GlobalTool --global - name: Pack diff --git a/Silk.NET.sln b/Silk.NET.sln index 565f9416ed..b6bf38990e 100644 --- a/Silk.NET.sln +++ b/Silk.NET.sln @@ -2902,6 +2902,19 @@ Global {048B85BE-276B-4C75-B4FF-BB825C0FEE54} = {1E76124C-D849-4D44-B7A2-5383C8C636B9} {AE5A7BBD-E303-46C4-9DDC-29E80C9128F5} = {048B85BE-276B-4C75-B4FF-BB825C0FEE54} {0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038} = {048B85BE-276B-4C75-B4FF-BB825C0FEE54} + {6EADA376-E83F-40B7-9539-71DD17AEF7A4} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {0651C5EF-50AA-4598-8D9C-8F210ADD8490} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {FA9D1C95-5585-4DEC-B226-1447A486C376} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {DFA0E841-33E5-4533-AF00-964E21A141B8} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {41EEBDB3-75C4-4A60-B4D5-673FBCA791E7} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {F2CF5D32-4B41-425E-B229-8FFC48F88063} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {081E7761-B200-4DBF-8950-941464DECACE} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {72E7FA64-5B1E-477D-BD30-63B7F206B3C4} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {23324041-2076-477C-A4BF-B385B8066C6C} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {E2ABDF45-C329-47B2-8E09-B7298E2557F7} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {ABD1AF6D-D9D1-4157-A1FF-AC98A054DA92} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {0E9C83A8-A413-4921-8F39-59519BFF939B} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {D00DC827-E7DF-48A9-9BEB-E1ED2F73C990} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F5273D7F-3334-48DF-94E3-41AE6816CD4D} diff --git a/global.json b/global.json index 6b78d4bca5..21f25390e7 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "5.0.201", + "version": "6.0.100-preview.7.21379.14", "rollForward": "major" } } diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs b/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs index c1f7cface0..85b4436b1a 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs +++ b/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Reflection; @@ -11,7 +10,9 @@ using Silk.NET.Maths; using Silk.NET.SDL; using Silk.NET.Windowing.Internals; -using Point = System.Drawing.Point; + +// We can't import System because System has a type called nint on iOS and Mac Catalyst. +// As such, throughout this file System is fully qualified. // ReSharper disable BitwiseOperatorOnEnumWithoutFlags @@ -47,10 +48,10 @@ public SdlView(void* nativeHandle, IGLContext? ctx, SdlPlatform platform) : base } // Events - public override event Action>? Resize; - public override event Action>? FramebufferResize; - public override event Action? Closing; - public override event Action? FocusChanged; + public override event System.Action>? Resize; + public override event System.Action>? FramebufferResize; + public override event System.Action? Closing; + public override event System.Action? FocusChanged; // Properties protected override IGLContext? CoreGLContext => API.API == ContextAPI.OpenGL || API.API == ContextAPI.OpenGLES @@ -173,7 +174,7 @@ protected void CoreInitialize { ContextProfile.Core => GLprofile.GLContextProfileCore, ContextProfile.Compatability => GLprofile.GLContextProfileCompatibility, - _ => throw new ArgumentOutOfRangeException(nameof(opts), "Bad ContextProfile") + _ => throw new System.ArgumentOutOfRangeException(nameof(opts), "Bad ContextProfile") }) ), (GLattr.GLContextFlags, (int) opts.API.Flags), diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/SdlVkSurface.cs b/src/Windowing/Silk.NET.Windowing.Sdl/SdlVkSurface.cs index 464f42137b..33c7127338 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/SdlVkSurface.cs +++ b/src/Windowing/Silk.NET.Windowing.Sdl/SdlVkSurface.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Runtime.InteropServices; using Silk.NET.Core; using Silk.NET.Core.Contexts; diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj index 62f3a4b4fb..044019a91d 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj +++ b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj @@ -1,10 +1,11 @@ - netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 + netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net6.0-android;net6.0-ios;net6.0-maccatalyst 8 true enable + true @@ -20,6 +21,65 @@ + + + + + + + + + + + + + + + + + + $(TargetsForTfmSpecificContentInPackage);_SdlTfmSpecific + + + + + + + + + + + + + + + + + + diff --git a/src/Windowing/Silk.NET.Windowing/Silk.NET.Windowing.csproj b/src/Windowing/Silk.NET.Windowing/Silk.NET.Windowing.csproj index 93ea17b96c..7586402520 100644 --- a/src/Windowing/Silk.NET.Windowing/Silk.NET.Windowing.csproj +++ b/src/Windowing/Silk.NET.Windowing/Silk.NET.Windowing.csproj @@ -1,16 +1,27 @@ - netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 + netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net6.0-android;net6.0-ios;net6.0-maccatalyst false + + + + + + + + + + + diff --git a/src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/Class1.cs b/src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/SilkMobile.cs similarity index 100% rename from src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/Class1.cs rename to src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/SilkMobile.cs From dfbd298f6056fc8e8445e97608ae933b36ea1f0b Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Fri, 20 Aug 2021 16:56:01 +0100 Subject: [PATCH 2/9] Get packaging working properly (afiak) --- Silk.NET.sln | 115 ++++++++++-------- src/Lab/Experiments/InputTest/Program.cs | 9 +- src/Lab/Experiments/Triangle/Program.cs | 9 +- .../Experiments/TriangleDroid/MainActivity.cs | 7 +- src/Lab/Experiments/TriangleIOS/Main.cs | 2 + .../TriangleNET6/AndroidManifest.xml | 14 +++ src/Lab/Experiments/TriangleNET6/Program.cs | 3 + .../TriangleNET6/Resources/AboutResources.txt | 44 +++++++ .../Resources/layout/activity_main.xml | 13 ++ .../mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../Resources/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1634 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 1441 bytes .../mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3552 bytes .../Resources/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1362 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 958 bytes .../mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2413 bytes .../Resources/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2307 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 2056 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4858 bytes .../Resources/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3871 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 3403 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8001 bytes .../Resources/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5016 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 4889 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 10893 bytes .../values/ic_launcher_background.xml | 4 + .../TriangleNET6/Resources/values/strings.xml | 4 + .../TriangleNET6/TriangleNET6.csproj | 26 ++++ .../Silk.NET.Windowing.Sdl.Android.targets | 8 +- .../Silk.NET.Windowing.Sdl.csproj | 18 ++- 31 files changed, 217 insertions(+), 69 deletions(-) create mode 100644 src/Lab/Experiments/TriangleNET6/AndroidManifest.xml create mode 100644 src/Lab/Experiments/TriangleNET6/Program.cs create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/AboutResources.txt create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/layout/activity_main.xml create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher_round.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-mdpi/ic_launcher.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-mdpi/ic_launcher_round.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xhdpi/ic_launcher.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xhdpi/ic_launcher_round.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/values/ic_launcher_background.xml create mode 100644 src/Lab/Experiments/TriangleNET6/Resources/values/strings.xml create mode 100644 src/Lab/Experiments/TriangleNET6/TriangleNET6.csproj diff --git a/Silk.NET.sln b/Silk.NET.sln index b6bf38990e..e67bfccf66 100644 --- a/Silk.NET.sln +++ b/Silk.NET.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30517.126 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31612.314 MinimumVisualStudioVersion = 15.0.26124.0 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.BuildTools", "src\Core\Silk.NET.BuildTools\Silk.NET.BuildTools.csproj", "{FD24E9FF-1097-4777-A418-F2D88C558665}" EndProject @@ -392,67 +392,65 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WavePlayer", "examples\CSha EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImGuiVulkan", "src\Lab\Experiments\ImGuiVulkan\ImGuiVulkan.csproj", "{89B03DDB-EBCA-4E6A-80AB-9FFD48110097}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenAL.Soft.Native", "src\Native\Silk.NET.OpenAL.Soft.Native\Silk.NET.OpenAL.Soft.Native.csproj", "{0DF430D1-39E6-46F5-AE58-B6DE0BD3F72B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenAL.Soft.Native", "src\Native\Silk.NET.OpenAL.Soft.Native\Silk.NET.OpenAL.Soft.Native.csproj", "{0DF430D1-39E6-46F5-AE58-B6DE0BD3F72B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.EPIC", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.EPIC\Silk.NET.OpenXR.Extensions.EPIC.csproj", "{591836FE-0DAC-48A5-86AB-4C317A6B009A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.EPIC", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.EPIC\Silk.NET.OpenXR.Extensions.EPIC.csproj", "{591836FE-0DAC-48A5-86AB-4C317A6B009A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.EXTX", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.EXTX\Silk.NET.OpenXR.Extensions.EXTX.csproj", "{960CCDC0-5327-4DD6-A4FE-90466B27F9C9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.EXTX", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.EXTX\Silk.NET.OpenXR.Extensions.EXTX.csproj", "{960CCDC0-5327-4DD6-A4FE-90466B27F9C9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.FB", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.FB\Silk.NET.OpenXR.Extensions.FB.csproj", "{749B0BAE-63F0-4B22-A883-CD521F725DAA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.FB", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.FB\Silk.NET.OpenXR.Extensions.FB.csproj", "{749B0BAE-63F0-4B22-A883-CD521F725DAA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.HUAWEI", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.HUAWEI\Silk.NET.OpenXR.Extensions.HUAWEI.csproj", "{A1D90A8D-B1FE-463A-884E-AEC201FB75EF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.HUAWEI", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.HUAWEI\Silk.NET.OpenXR.Extensions.HUAWEI.csproj", "{A1D90A8D-B1FE-463A-884E-AEC201FB75EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.HTC", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.HTC\Silk.NET.OpenXR.Extensions.HTC.csproj", "{60AFD661-4BE5-4040-896A-CE2EA95F98B7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.HTC", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.HTC\Silk.NET.OpenXR.Extensions.HTC.csproj", "{60AFD661-4BE5-4040-896A-CE2EA95F98B7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.LUNARG", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.LUNARG\Silk.NET.OpenXR.Extensions.LUNARG.csproj", "{71FF6EB5-2AA9-4B6B-8C7C-CE9AC889A50E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.LUNARG", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.LUNARG\Silk.NET.OpenXR.Extensions.LUNARG.csproj", "{71FF6EB5-2AA9-4B6B-8C7C-CE9AC889A50E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.MAGICLEAP", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.MAGICLEAP\Silk.NET.OpenXR.Extensions.MAGICLEAP.csproj", "{AF8E3CF5-EEAD-477C-80DF-E0CF576D5A73}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.MAGICLEAP", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.MAGICLEAP\Silk.NET.OpenXR.Extensions.MAGICLEAP.csproj", "{AF8E3CF5-EEAD-477C-80DF-E0CF576D5A73}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.ML", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.ML\Silk.NET.OpenXR.Extensions.ML.csproj", "{4CFC3947-9763-4FD1-869B-EEDFA7EB53AC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.ML", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.ML\Silk.NET.OpenXR.Extensions.ML.csproj", "{4CFC3947-9763-4FD1-869B-EEDFA7EB53AC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.MND", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.MND\Silk.NET.OpenXR.Extensions.MND.csproj", "{3076E116-F160-4C5D-A3D9-B3B51845675C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.MND", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.MND\Silk.NET.OpenXR.Extensions.MND.csproj", "{3076E116-F160-4C5D-A3D9-B3B51845675C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.MNDX", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.MNDX\Silk.NET.OpenXR.Extensions.MNDX.csproj", "{A1890199-5E68-4AF3-A2AD-21A1D84AF22B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.MNDX", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.MNDX\Silk.NET.OpenXR.Extensions.MNDX.csproj", "{A1890199-5E68-4AF3-A2AD-21A1D84AF22B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.OCULUS", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.OCULUS\Silk.NET.OpenXR.Extensions.OCULUS.csproj", "{358A6DC8-866C-4C8D-8F41-682F6683E683}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.OCULUS", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.OCULUS\Silk.NET.OpenXR.Extensions.OCULUS.csproj", "{358A6DC8-866C-4C8D-8F41-682F6683E683}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.ULTRALEAP", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.ULTRALEAP\Silk.NET.OpenXR.Extensions.ULTRALEAP.csproj", "{CBE8E2D0-B1DE-422D-BF66-7FF02AE81CB9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.ULTRALEAP", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.ULTRALEAP\Silk.NET.OpenXR.Extensions.ULTRALEAP.csproj", "{CBE8E2D0-B1DE-422D-BF66-7FF02AE81CB9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.VALVE", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.VALVE\Silk.NET.OpenXR.Extensions.VALVE.csproj", "{5C59C1E1-6392-41AA-AD73-6DA34B1B369B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.VALVE", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.VALVE\Silk.NET.OpenXR.Extensions.VALVE.csproj", "{5C59C1E1-6392-41AA-AD73-6DA34B1B369B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.VARJO", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.VARJO\Silk.NET.OpenXR.Extensions.VARJO.csproj", "{51868FC9-C052-4C2D-98F9-10379AAD2671}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.VARJO", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.VARJO\Silk.NET.OpenXR.Extensions.VARJO.csproj", "{51868FC9-C052-4C2D-98F9-10379AAD2671}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenCL.Extensions.LOADER", "src\OpenCL\Extensions\Silk.NET.OpenCL.Extensions.LOADER\Silk.NET.OpenCL.Extensions.LOADER.csproj", "{23172004-FF6B-45D8-9653-944CECE741E1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenCL.Extensions.LOADER", "src\OpenCL\Extensions\Silk.NET.OpenCL.Extensions.LOADER\Silk.NET.OpenCL.Extensions.LOADER.csproj", "{23172004-FF6B-45D8-9653-944CECE741E1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.ARM", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.ARM\Silk.NET.Vulkan.Extensions.ARM.csproj", "{04E05BC4-5769-4FC1-BBA0-06EC9D8E3130}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.ARM", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.ARM\Silk.NET.Vulkan.Extensions.ARM.csproj", "{04E05BC4-5769-4FC1-BBA0-06EC9D8E3130}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.BRCM", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.BRCM\Silk.NET.Vulkan.Extensions.BRCM.csproj", "{98C25360-F03A-4929-959B-C80A48D21FF2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.BRCM", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.BRCM\Silk.NET.Vulkan.Extensions.BRCM.csproj", "{98C25360-F03A-4929-959B-C80A48D21FF2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.IMG", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.IMG\Silk.NET.Vulkan.Extensions.IMG.csproj", "{FD32964B-4144-43CD-B313-2A5DD6A05DEA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.IMG", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.IMG\Silk.NET.Vulkan.Extensions.IMG.csproj", "{FD32964B-4144-43CD-B313-2A5DD6A05DEA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.MESA", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.MESA\Silk.NET.Vulkan.Extensions.MESA.csproj", "{859A77A8-73F0-447B-9076-B42D5CA3CA33}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.MESA", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.MESA\Silk.NET.Vulkan.Extensions.MESA.csproj", "{859A77A8-73F0-447B-9076-B42D5CA3CA33}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.QCOM", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.QCOM\Silk.NET.Vulkan.Extensions.QCOM.csproj", "{92FCD7CC-52BE-487F-B990-1B5CACF9D40F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.QCOM", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.QCOM\Silk.NET.Vulkan.Extensions.QCOM.csproj", "{92FCD7CC-52BE-487F-B990-1B5CACF9D40F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.HUAWEI", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.HUAWEI\Silk.NET.Vulkan.Extensions.HUAWEI.csproj", "{64E177FC-38AA-45AE-B748-419E91F95EC7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.HUAWEI", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.HUAWEI\Silk.NET.Vulkan.Extensions.HUAWEI.csproj", "{64E177FC-38AA-45AE-B748-419E91F95EC7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.QNX", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.QNX\Silk.NET.Vulkan.Extensions.QNX.csproj", "{F16B4AE5-F68F-42A2-8AB5-029282032CE0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.QNX", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.QNX\Silk.NET.Vulkan.Extensions.QNX.csproj", "{F16B4AE5-F68F-42A2-8AB5-029282032CE0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.VALVE", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.VALVE\Silk.NET.Vulkan.Extensions.VALVE.csproj", "{AB59F09A-9BD9-4CBB-8497-87B768C7C949}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.VALVE", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.VALVE\Silk.NET.Vulkan.Extensions.VALVE.csproj", "{AB59F09A-9BD9-4CBB-8497-87B768C7C949}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.JUICE", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.JUICE\Silk.NET.Vulkan.Extensions.JUICE.csproj", "{86B6B40E-EA8F-47F0-9D1F-FDBAFBE2842C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.JUICE", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.JUICE\Silk.NET.Vulkan.Extensions.JUICE.csproj", "{86B6B40E-EA8F-47F0-9D1F-FDBAFBE2842C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Vulkan.Extensions.FB", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.FB\Silk.NET.Vulkan.Extensions.FB.csproj", "{D1DD841D-9F34-47A6-91EB-A8632D577BD7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Vulkan.Extensions.FB", "src\Vulkan\Extensions\Silk.NET.Vulkan.Extensions.FB\Silk.NET.Vulkan.Extensions.FB.csproj", "{D1DD841D-9F34-47A6-91EB-A8632D577BD7}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{16AFCF73-8CC1-4B5D-8969-A90F468DC6D5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenXR", "OpenXR", "{1E76124C-D849-4D44-B7A2-5383C8C636B9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.UNITY", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.UNITY\Silk.NET.OpenXR.Extensions.UNITY.csproj", "{AE5A7BBD-E303-46C4-9DDC-29E80C9128F5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{048B85BE-276B-4C75-B4FF-BB825C0FEE54}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.OpenXR.Extensions.LIV", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.LIV\Silk.NET.OpenXR.Extensions.LIV.csproj", "{0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.UNITY", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.UNITY\Silk.NET.OpenXR.Extensions.UNITY.csproj", "{AE5A7BBD-E303-46C4-9DDC-29E80C9128F5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.LIV", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.LIV\Silk.NET.OpenXR.Extensions.LIV.csproj", "{0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriangleNET6", "src\Lab\Experiments\TriangleNET6\TriangleNET6.csproj", "{477046D2-AF81-4E2B-83BD-20176A971FDD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -2695,16 +2693,30 @@ Global {0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038}.Release|x64.Build.0 = Release|Any CPU {0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038}.Release|x86.ActiveCfg = Release|Any CPU {0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038}.Release|x86.Build.0 = Release|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Debug|x64.ActiveCfg = Debug|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Debug|x64.Build.0 = Debug|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Debug|x86.ActiveCfg = Debug|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Debug|x86.Build.0 = Debug|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Release|Any CPU.Build.0 = Release|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Release|x64.ActiveCfg = Release|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Release|x64.Build.0 = Release|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Release|x86.ActiveCfg = Release|Any CPU + {477046D2-AF81-4E2B-83BD-20176A971FDD}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {FD24E9FF-1097-4777-A418-F2D88C558665} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490} + {23324041-2076-477C-A4BF-B385B8066C6C} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {BFE429EB-4C2E-4BF3-A302-C9C5A2FDA6D7} = {23324041-2076-477C-A4BF-B385B8066C6C} {136C6154-D300-4B82-80D3-17B637841A2B} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490} {0A18FCAE-572E-47FF-B8E3-C97ED15132FA} = {23324041-2076-477C-A4BF-B385B8066C6C} {956F722C-DFD3-435E-9D2E-A0549C4D8BC0} = {23324041-2076-477C-A4BF-B385B8066C6C} + {081E7761-B200-4DBF-8950-941464DECACE} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {5A41E9D5-67F5-447C-8AE2-78FED7A45206} = {081E7761-B200-4DBF-8950-941464DECACE} {896B1A79-FEC8-4B7A-8A9C-0CC8EDA2CCFC} = {081E7761-B200-4DBF-8950-941464DECACE} {FC015604-3326-4BCC-9212-C5CB0DFB0D12} = {896B1A79-FEC8-4B7A-8A9C-0CC8EDA2CCFC} @@ -2712,6 +2724,8 @@ Global {352E06E3-9D5E-4C2B-836D-C5538F8AA48D} = {896B1A79-FEC8-4B7A-8A9C-0CC8EDA2CCFC} {94D7D3A3-3640-4791-BE19-CA50C59187C6} = {896B1A79-FEC8-4B7A-8A9C-0CC8EDA2CCFC} {8FFF49D6-B029-400B-8510-1A088868DFA6} = {FA9D1C95-5585-4DEC-B226-1447A486C376} + {FA9D1C95-5585-4DEC-B226-1447A486C376} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {0E9C83A8-A413-4921-8F39-59519BFF939B} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {A01F43A5-B4ED-47C5-B426-D1AC3C94B5E7} = {0E9C83A8-A413-4921-8F39-59519BFF939B} {446DD80A-CAF4-4E19-B87E-A43135E2D59D} = {0E9C83A8-A413-4921-8F39-59519BFF939B} {24CE7080-FF44-46BF-886F-456F30E54442} = {0E9C83A8-A413-4921-8F39-59519BFF939B} @@ -2769,9 +2783,11 @@ Global {3BC72F4A-8B32-490A-9EA7-B68320991E15} = {CF69D5C3-4ACE-4458-BA5A-0E9A3B294CDC} {6D2F52DB-2DB4-49EF-8DD1-212FA33CE034} = {CF69D5C3-4ACE-4458-BA5A-0E9A3B294CDC} {8D534FE1-6113-457A-97DD-FD42782580A5} = {CF69D5C3-4ACE-4458-BA5A-0E9A3B294CDC} + {0651C5EF-50AA-4598-8D9C-8F210ADD8490} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {3908DEF6-7403-49F5-B8EC-5B3B12C325D4} = {FA9D1C95-5585-4DEC-B226-1447A486C376} {020A8E88-B607-4281-BA0D-5ED03484A201} = {FA9D1C95-5585-4DEC-B226-1447A486C376} {7BB1DE56-DA1C-4776-A961-B810574E1EF4} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490} + {E2ABDF45-C329-47B2-8E09-B7298E2557F7} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {7F347EDA-EC20-4E3F-9C25-CF32ED7D9642} = {E2ABDF45-C329-47B2-8E09-B7298E2557F7} {49BC383A-D7E6-4013-93C7-371479B984CC} = {E2ABDF45-C329-47B2-8E09-B7298E2557F7} {043852EA-FBD4-4F42-9CDC-92078F9EF942} = {49BC383A-D7E6-4013-93C7-371479B984CC} @@ -2787,8 +2803,10 @@ Global {65E16908-BD7A-4FC2-BC23-FD8194039C5B} = {49BC383A-D7E6-4013-93C7-371479B984CC} {3D945DE0-1E2D-439E-991D-9C65C325F82F} = {49BC383A-D7E6-4013-93C7-371479B984CC} {D27D10F0-F22B-49B5-9933-375BB120AD70} = {CF69D5C3-4ACE-4458-BA5A-0E9A3B294CDC} + {DFA0E841-33E5-4533-AF00-964E21A141B8} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {3501BAD6-406A-49BC-BE0E-5A49A3AAAE6A} = {23324041-2076-477C-A4BF-B385B8066C6C} {50D5EAD9-78BB-4D1B-AF37-130BF3AF82FD} = {3501BAD6-406A-49BC-BE0E-5A49A3AAAE6A} + {D00DC827-E7DF-48A9-9BEB-E1ED2F73C990} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {93041A0D-9BA2-4BAB-B01E-3003AEAC0A31} = {D00DC827-E7DF-48A9-9BEB-E1ED2F73C990} {757F2B10-B69D-4C19-BFE0-D99070A00AD9} = {D00DC827-E7DF-48A9-9BEB-E1ED2F73C990} {13AAF660-1E37-4C63-B2B7-49140B9F5049} = {757F2B10-B69D-4C19-BFE0-D99070A00AD9} @@ -2802,11 +2820,13 @@ Global {45407BC4-DF4C-49BD-ADEF-706683C90E14} = {757F2B10-B69D-4C19-BFE0-D99070A00AD9} {8D84B804-168F-4EAA-BC09-F55A35A29887} = {FA9D1C95-5585-4DEC-B226-1447A486C376} {8DCB2EB4-D0DE-4EF9-ACB3-332055D594CB} = {8D84B804-168F-4EAA-BC09-F55A35A29887} + {ABD1AF6D-D9D1-4157-A1FF-AC98A054DA92} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {B6017708-8E8C-4230-95AD-2D06237D68D4} = {ABD1AF6D-D9D1-4157-A1FF-AC98A054DA92} {90471225-AC23-424E-B62E-F6EC4C6ECAC0} = {ABD1AF6D-D9D1-4157-A1FF-AC98A054DA92} {59C98A03-427A-40A0-8467-C85C4807907F} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} {0030C8EE-8EBB-499F-A310-957BE176AEB1} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} {E51CD67A-A6D9-4850-A8A6-348B23C5DA7F} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} + {6EADA376-E83F-40B7-9539-71DD17AEF7A4} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {19586F56-E799-49EA-9B3C-910BF2D4976A} = {6EADA376-E83F-40B7-9539-71DD17AEF7A4} {00D8F04F-2063-4F4E-B793-0F9DCF2BCFA9} = {23324041-2076-477C-A4BF-B385B8066C6C} {6B703607-0D63-4A25-BB6A-EC1FBBD77A8C} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490} @@ -2818,6 +2838,7 @@ Global {603F28D1-E982-47C0-98D9-3E6DA1DD37E2} = {488775D1-32CC-46D7-8DD7-BB331EC659B9} {488775D1-32CC-46D7-8DD7-BB331EC659B9} = {23324041-2076-477C-A4BF-B385B8066C6C} {B9A8D738-FE7D-4860-A446-4A03E3DDEB74} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490} + {F2CF5D32-4B41-425E-B229-8FFC48F88063} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {F3B7A9D6-5B15-45E8-925B-20B5BBD33428} = {F2CF5D32-4B41-425E-B229-8FFC48F88063} {A768A346-6388-4881-8FF6-15F0163B76E0} = {F2CF5D32-4B41-425E-B229-8FFC48F88063} {2C3099EA-C01C-4639-8300-153A9BD79292} = {F2CF5D32-4B41-425E-B229-8FFC48F88063} @@ -2825,10 +2846,12 @@ Global {07DD7965-849F-4311-9DAD-07C1CCF8BEA4} = {F2CF5D32-4B41-425E-B229-8FFC48F88063} {4712BFE1-67DA-407F-8BDC-FAF529E5BF94} = {F2CF5D32-4B41-425E-B229-8FFC48F88063} {E8DE9BA0-8391-4278-926D-DD931C4172AF} = {F2CF5D32-4B41-425E-B229-8FFC48F88063} + {41EEBDB3-75C4-4A60-B4D5-673FBCA791E7} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {BD86AB4D-74FD-429D-9AEE-79B0C429BB3A} = {41EEBDB3-75C4-4A60-B4D5-673FBCA791E7} {07915304-3B6B-400C-94F8-C49EF5F347E7} = {41EEBDB3-75C4-4A60-B4D5-673FBCA791E7} {8C7A30EF-C257-421C-AABD-D42FF6D955A5} = {41EEBDB3-75C4-4A60-B4D5-673FBCA791E7} {DE477265-8F7D-4D7F-B5DA-F3C5DE631788} = {3501BAD6-406A-49BC-BE0E-5A49A3AAAE6A} + {72E7FA64-5B1E-477D-BD30-63B7F206B3C4} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} {F9AA41B4-1C36-472B-A1A5-4A10EE0A79FC} = {72E7FA64-5B1E-477D-BD30-63B7F206B3C4} {84F51960-D814-450D-80EB-D9E46A1D5187} = {72E7FA64-5B1E-477D-BD30-63B7F206B3C4} {D3D9891B-88E6-46AD-919C-7EC4EABE5266} = {72E7FA64-5B1E-477D-BD30-63B7F206B3C4} @@ -2887,34 +2910,20 @@ Global {CBE8E2D0-B1DE-422D-BF66-7FF02AE81CB9} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} {5C59C1E1-6392-41AA-AD73-6DA34B1B369B} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} {51868FC9-C052-4C2D-98F9-10379AAD2671} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} + {23172004-FF6B-45D8-9653-944CECE741E1} = {757F2B10-B69D-4C19-BFE0-D99070A00AD9} {04E05BC4-5769-4FC1-BBA0-06EC9D8E3130} = {49BC383A-D7E6-4013-93C7-371479B984CC} {98C25360-F03A-4929-959B-C80A48D21FF2} = {49BC383A-D7E6-4013-93C7-371479B984CC} - {64E177FC-38AA-45AE-B748-419E91F95EC7} = {49BC383A-D7E6-4013-93C7-371479B984CC} {FD32964B-4144-43CD-B313-2A5DD6A05DEA} = {49BC383A-D7E6-4013-93C7-371479B984CC} - {86B6B40E-EA8F-47F0-9D1F-FDBAFBE2842C} = {49BC383A-D7E6-4013-93C7-371479B984CC} {859A77A8-73F0-447B-9076-B42D5CA3CA33} = {49BC383A-D7E6-4013-93C7-371479B984CC} {92FCD7CC-52BE-487F-B990-1B5CACF9D40F} = {49BC383A-D7E6-4013-93C7-371479B984CC} + {64E177FC-38AA-45AE-B748-419E91F95EC7} = {49BC383A-D7E6-4013-93C7-371479B984CC} {F16B4AE5-F68F-42A2-8AB5-029282032CE0} = {49BC383A-D7E6-4013-93C7-371479B984CC} {AB59F09A-9BD9-4CBB-8497-87B768C7C949} = {49BC383A-D7E6-4013-93C7-371479B984CC} - {23172004-FF6B-45D8-9653-944CECE741E1} = {757F2B10-B69D-4C19-BFE0-D99070A00AD9} + {86B6B40E-EA8F-47F0-9D1F-FDBAFBE2842C} = {49BC383A-D7E6-4013-93C7-371479B984CC} {D1DD841D-9F34-47A6-91EB-A8632D577BD7} = {49BC383A-D7E6-4013-93C7-371479B984CC} - {1E76124C-D849-4D44-B7A2-5383C8C636B9} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {048B85BE-276B-4C75-B4FF-BB825C0FEE54} = {1E76124C-D849-4D44-B7A2-5383C8C636B9} - {AE5A7BBD-E303-46C4-9DDC-29E80C9128F5} = {048B85BE-276B-4C75-B4FF-BB825C0FEE54} - {0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038} = {048B85BE-276B-4C75-B4FF-BB825C0FEE54} - {6EADA376-E83F-40B7-9539-71DD17AEF7A4} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {0651C5EF-50AA-4598-8D9C-8F210ADD8490} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {FA9D1C95-5585-4DEC-B226-1447A486C376} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {DFA0E841-33E5-4533-AF00-964E21A141B8} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {41EEBDB3-75C4-4A60-B4D5-673FBCA791E7} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {F2CF5D32-4B41-425E-B229-8FFC48F88063} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {081E7761-B200-4DBF-8950-941464DECACE} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {72E7FA64-5B1E-477D-BD30-63B7F206B3C4} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {23324041-2076-477C-A4BF-B385B8066C6C} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {E2ABDF45-C329-47B2-8E09-B7298E2557F7} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {ABD1AF6D-D9D1-4157-A1FF-AC98A054DA92} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {0E9C83A8-A413-4921-8F39-59519BFF939B} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} - {D00DC827-E7DF-48A9-9BEB-E1ED2F73C990} = {16AFCF73-8CC1-4B5D-8969-A90F468DC6D5} + {AE5A7BBD-E303-46C4-9DDC-29E80C9128F5} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} + {0D1E5AD9-E329-4B84-A5FE-FC1EE33BF038} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} + {477046D2-AF81-4E2B-83BD-20176A971FDD} = {39B598E9-44BA-4A61-A1BB-7C543734DBA6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F5273D7F-3334-48DF-94E3-41AE6816CD4D} diff --git a/src/Lab/Experiments/InputTest/Program.cs b/src/Lab/Experiments/InputTest/Program.cs index d62d151cec..836837e173 100644 --- a/src/Lab/Experiments/InputTest/Program.cs +++ b/src/Lab/Experiments/InputTest/Program.cs @@ -12,7 +12,14 @@ namespace InputTest { public class Program { - private static void Main() +#if !NET6_0 + // Exclude the entry point if we're running in .NET 6, as this file is + // compiled into the TriangleNET6 project too which has its own + // entrypoint. + private static void Main() => Run(); +#endif + + private static void Run() { //Window.PrioritizeSdl(); diff --git a/src/Lab/Experiments/Triangle/Program.cs b/src/Lab/Experiments/Triangle/Program.cs index 5ebf1bcd18..652af910a2 100644 --- a/src/Lab/Experiments/Triangle/Program.cs +++ b/src/Lab/Experiments/Triangle/Program.cs @@ -29,7 +29,14 @@ public static class Program public static GraphicsAPI API { get; set; } = GraphicsAPI.Default; - public static void Main(string[] args) +#if !NET6_0 + // Exclude the entry point if we're running in .NET 6, as this file is + // compiled into the TriangleNET6 project too which has its own + // entrypoint. + public static void Main() => Run(); +#endif + + public static void Run() { //Silk.NET.Windowing.Sdl.SdlWindowing.Use(); //SdlProvider.SetMainReady = true; diff --git a/src/Lab/Experiments/TriangleDroid/MainActivity.cs b/src/Lab/Experiments/TriangleDroid/MainActivity.cs index 854c6243a5..afb5e89b96 100644 --- a/src/Lab/Experiments/TriangleDroid/MainActivity.cs +++ b/src/Lab/Experiments/TriangleDroid/MainActivity.cs @@ -1,3 +1,4 @@ +#if __ANDROID__ using Android.App; using Android.Content.PM; using Silk.NET.Windowing; @@ -8,7 +9,8 @@ namespace TriangleDroid { [Activity ( - Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true, + Label = "@string/app_name", + MainLauncher = true, ConfigurationChanges = ConfigChangesFlags )] public class MainActivity : SilkActivity @@ -17,7 +19,8 @@ protected override void OnRun() { Program.API = new GraphicsAPI (ContextAPI.OpenGLES, ContextProfile.Compatability, ContextFlags.Default, new APIVersion(3, 0)); - Program.Main(null!); + Program.Run(); } } } +#endif diff --git a/src/Lab/Experiments/TriangleIOS/Main.cs b/src/Lab/Experiments/TriangleIOS/Main.cs index 1fa9d2afde..b169699e39 100644 --- a/src/Lab/Experiments/TriangleIOS/Main.cs +++ b/src/Lab/Experiments/TriangleIOS/Main.cs @@ -1,3 +1,4 @@ +#if __IOS__ using System; using Silk.NET.Input.Sdl; using Silk.NET.SDL; @@ -26,3 +27,4 @@ static void Run(string[] args) } } } +#endif diff --git a/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml b/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml new file mode 100644 index 0000000000..6fdc48f1d2 --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/src/Lab/Experiments/TriangleNET6/Program.cs b/src/Lab/Experiments/TriangleNET6/Program.cs new file mode 100644 index 0000000000..2c97fbb3ea --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Program.cs @@ -0,0 +1,3 @@ +#if !__IOS__ && !__ANDROID__ +Triangle.Program.Run(); +#endif diff --git a/src/Lab/Experiments/TriangleNET6/Resources/AboutResources.txt b/src/Lab/Experiments/TriangleNET6/Resources/AboutResources.txt new file mode 100644 index 0000000000..219f42544b --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.xml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.xml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "Resource" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the Resource class would expose: + +public class Resource { + public class Drawable { + public const int icon = 0x123; + } + + public class Layout { + public const int main = 0x456; + } + + public class Strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use Resource.Drawable.icon to reference the drawable/icon.png file, or +Resource.Layout.main to reference the layout/main.xml file, or Resource.Strings.first_string +to reference the first string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/src/Lab/Experiments/TriangleNET6/Resources/layout/activity_main.xml b/src/Lab/Experiments/TriangleNET6/Resources/layout/activity_main.xml new file mode 100644 index 0000000000..f94985291b --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Resources/layout/activity_main.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher.xml b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher_round.xml b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2531cb31efc3a0a3de6113ab9c7845dc1d9654e4 GIT binary patch literal 1634 zcmV-o2A%ndP)B+Z3$1(8#|f~9B42Y^N-3=o2YCq0YUY$Zu=pM;#hG{lHi%n~Vh z1d1vN#EDO19X?u$`cV z!a}AKG@Bb*#1cdYg8af_;jP69b`k%G1n?0=F^8bI^o>wg-vEliK^U}y^!D|^p|ax; zC|pK=f+FHp!RUAhtlpGGUxJb|wm^5! z<1r%$<$TR02wajxKZ4MiR#aAxDLE(##UNyD|ABr4WoGRF*?@e^2|~Hq(gurSSJH*;Q~5lw{J5A_(PCXBWhzZE${qgzv0{dk-F( z1<}>r181tLiEla&f1j&?p2xjbfp2cTt-c1Ox~?9EhK9`cJ9Vatf)loIoQ@#h&}cIGD>Z#QLE}&(bMo@7Ff|7f#Nm^$PJpVcbj+v~K7wfVwF}=) zRQsc+`=A-+C)vrRvaIC-5u>|;3h z*G4-u#RI<_vuSN~vZ6{|I~q5FFk3%de#+*>UFG>&bq6~ zUEMZ~FIOmFO=kA^5rkp-Msw?^63xvdXVZ-rv@{6{iVO}M!}^Je%2BPbi+(L<5<%~h z2v^D+f<|j%7~cJjOzg*!GPQ{%uE{i%YgcZhuZh{yNlQ}RhaU1jd=K+AopVKP+D}&} zZ3y$llqZiln=Z_A$!qzkGbX0D{?l(v5@1|`QyCvCnQ`eKI>|zj_zo%y#fKf85VhQ} zP)y&j4P*nR3q{-o35iV6nx7QDqq<;WDVIt}|N%`!dgv*y3va8eLNj zU9x(?ieweHfQ*yXk8|=ssZ~qJEz^QoKJ|iGa>ge_Vm_8l}S+UvJ{8g4jr+o#aTSFsz1W;PDP zW765JXGU#3JL>SlIl3NRV2{7B2dLO1cIP)a4ZRYL|MBD36O1#oSgAf}APz5@;x=_U-<=y)Py7*}O5(uu7BL_eLe6Ek7pH|G zMq)FrF1EFq&yruS5b=F=w)fVVoPd(oeRyTFym_Uwyn~L=OL(O?cf^2L5R(SmjORx6 z%nmZf^W=3pkvT*>@osUNi>DULH1hL;y`JGQX$onRCr_U0=H~Viodq!<7Q{3rPk~{G gu#IhOV;e2n|1(WJB~7~kivR!s07*qoM6N<$g7lUVaR2}S literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher_foreground.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..7a859c25556af7a2e46e22a2220eaded55628e9f GIT binary patch literal 1441 zcma)+`#%#30L6FjMQg%tuA0%p#0??L`*E=rD#U2F4L5n@F+O9Sp;(QwEQy7+?sX?r zCWN(!Hg`+j5k8*H@|yQEtnAi*(D{7M`Tlf1=eKjq)BUsp2nqrK01B=yNUv`!`EH=x zx8$xJQUd^Fuec%|(TT&0V}4orr_==mmCnEuzD+ff8Pg>pJRqsWsD{#?eGPaCu0(sEH_2RG@<6-Nt<8 ztPMUmmAz9Ga$23Y9~p9dqJSgJJ#Jk_r@o13^%d-Xf46i+Lrmz3 zy9(DUDVXj;Zny7nO+yn&W2flEX=C!8&D0zI`G# z8;XmlonoghgRFUY*$+7pPLa}Uy)onw>TT9t(FTV6#BV8&lXWDPRvQW_n~xZ|yLcZjX>m$Eaf1)dwXS`&E^ zkNjO;%;fWywchc=+w4utQ0Vbn%B>b~yy4I#D{?1!P`$P>Wdo+ljCo(tYia04JTc=$$u+IbzDVPFYpm8+AQj+ zGKH zfS{{hN%W)kF+(26oZpkURD5Q_G_z97F6{Jval+TOj-;5y)*Rdo3a$^^k~q5gpTzmp1q@+2X9O z;_VUF>;s~C1~gpFrFoh?{aQ|LlBIYz!z^P~lndX5-ES)p#+9GW*|-WBTzQ*&gKOE` zM##bUaWl`6rZBXw0!~_oUhf+H$tNc@lLZCj0bZT^KSo@C|P?7YR8dP0se1jj z9aA0|7MONf(ZYaLZs$s}r*05fx25-iN6mZe_*Rq%uyz(+^-k;t`!R`?uf~rn#1ZC7 zuv3}UrmMzcBbo4jym@fS5%I+G`GJIC1s$)MQs3Vhld?a2U;w}$@V%dC@%qpO7+3#$ N&GnQ!lI8SQ#{X#Iv!eh2 literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher_round.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d35b3a1cfe5308bb099a5a1429555c41417e36 GIT binary patch literal 3552 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 literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-mdpi/ic_launcher_round.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8f56909cddfa86f1387074bf43003f36d6e67be1 GIT binary patch literal 2413 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 b;}yxl--Ss53i@>Q4YQuNcebmsMJN0NT!aL! literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xhdpi/ic_launcher_round.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..9737d79c0492b2c8a811621660eba33e79fab959 GIT binary patch literal 4858 zcmVxlCBHiW_rSgI3_J^MKwHqJEz|i*Sg*YtOHn%!8|O@U|xT*V!1aH) zx9aT)+OT1e6*I^fro))}A|t%nqOC49C*uh}iznRD0RVt(Fkci3aF-cE^~v-{jirSe z8y+KDRrXqA%?3VAUmJ!e`Y4{{Db{MI)J1oI-WfBjRTVY1Q!rK-v!l86id7G;UWZ3x z7~0LnZOuZ2xjo$KBiYmM_`2d z5?SVjnV>hVk!Z_9*%?FywwjSrU-z}DU~qVkNCML#z4GhV z_dS*4ib?_|4A~&o6c6ZDCNLfVt@G)TDg@Pe&InwDu_Y44rH_jqbYt zQQk%w?14PLdL_onhlQI!tDo8~G_ws5=fN6HW6)RMZ1xE78Tw}PR+Lk5El;CNtD@BG z@-c!)0b@`g>cgGvV&(C9t(F;co=4};U+^dfw6xu|4X@RormvOYhELMs z#n0=>EFFekYFvrh+S)vl0br1y$L?uHF?ZLL#>k8mg*7cHSw;nCRmALvD)pwhLaqK` zH{FAdpJ?$&@EJOEIG%e~S}30iDZGsfvTJYqebn^#ei9&%5{a3h)`)uHexhMfx2GC}a7&+PSj;~z&<#NnP097H+5#qe^HCa1jY34dHKXo8 zyY}pNY0`(An$dSZ{AfkZ$4_A9@iVII_BL<*2^~Fl!lh?HY6o9?8_(#NGRALVO#8VI z9n&Hr&MA(;4gAX2_<|07{q29d4A%Yse8#Sg>u#G&F@_8Hz`UC4@30;drblKka481` z?((Z|zQ@@uWsI@Bpz3gpTq7nHw%?y+JiTRw)x(8QKjZG6LV@5aU|(2+QR(aE^IiQA zbbY#Ry<58f_jBjbjM>lIwKaI;ZD{|mhuvbp&fR-a)yVM<(;)5!g71B_7Ufosrv7ZTPIz#p-Luu#-A?Iq&cPX$ zzM1o0ayvrq*fGO)ASt78v{QGK(f{&-ng{so_ts*sjO@u0Q~!L6QwtMIG_TAibnspej~MaY~_~X)&16cA3OA}Uc)}S zZIuHg0l)fIxZO8!t8bb(l>-Cnku0bDbBiIiN=wjhmPbZL24MzlVdpYjrNWx)(Pv+N zBWOAR3??M;Y<>CqF?UmT!q$5#$Hw0_5S%iz0WXT*1g|T5HRZin>UI=?a+d@J@ z!s*q|QbSDkGb%|Ptu~nUaAClGGv)}o`WafkaSJLkjkN=I!IBjnQqbDkiW**Ov@?)k zGq(Qtv*2Socm6z@IOPdFd$xCn2c|3a@PedtiB%Y-T!Ns zB*nm2J}l((;v)h?(g?ET>{yU|?VjUA$|Z5Ar4z zy&(!+?I)a55qI7%Xw>;RW~l8%Ar-Om{WT5^Y~x$+J4{7<@%1J_QxP{h$Tzu?ijZcP zKq?}fVC`eW07@i+F8B>mD^4f z)ZCiSzUcJ1kJo--m#qXTfHz@!FdhAeQdfr()df(n8{lw5hWt__$<&YXgbf+9gAJMc zW<2fEh74^Wt)GRe=bqeL_c`r8F zZ%NkP(2@K3Gurh1b{rks2WKzipslrswj^bFgIglwlMH~dvpP|4vRM$R(A9m*hXM4a z{4CC!@(@?pZpuIQ%!_Vq%1@oy;BZ@V_r3$1Hs$Z-xhbElE&Cp0JBVQHxI|GZmG;L! z!cy}pUl5`!WzA<_x?Ps?(38*EwFT+}D%{)w4WeKG+_o)f-(4r+oe$Td9FAov)Yh)P z4vEusup1UeF!pl7fNJ<-5Wab=5QSObu{0lZy)X+3VhwhMS;IIMX0@RgaIog6Fbk?C zTx|!ur{OpMjaOloqObP-sLfq@n$Z3)UV(sl1(Orr_5onOR78jzqW7(*JljLXv( z@h(qS6x5&?Y5JXjX{Y+%Mhyk@@83TeKfIkwUdT~|ykpm%Uc~^Yq_8a%b~pV1Kc(8z zoqm3P3c4D?#dpPGV`HIoB1)QRoC#7O#GxDz9Gw!NHm6%&QMzz}Dm~%)iV{ zGPeP+B$&E(5j7MN5)+rJ)D3A8;w8Q8Ui6aQr~h3q$V+_zR@JpD!O z6@t8|oswO4Y(T`I62MR_7K=EYk`fUS0Y|&XC1n`qz>CL1NP%Y`Rj{AeQ3cHE2i+g9 z$XNi`5e&JWnnKxva6i8wwX9(94k6-#zI|8+z44N)E#Bqp8<0hBzPP9Rok_u<_*BiE zpx1Fxs=hMmM6B-%{ zA2dja5v#^23aZ50BUK|xXAp(ZNxW`U&_!XEVU zV=I}8Hxwt!nhV$vjJo7JX>U56>IHQz@}zXb3SyKmUA_mmg3DQhUCz8!fC<4Spew($ z;e$P^5VEzFCeakFf!%)Me)ZWyyPbef8C|hjw-#fOPGdr0)8${-=*QRtI6OT$v*@eK zi3wKVrx$(=1tndn_noPttFW$%gmXQxy3=ANthcD6zW40_8=X((d6Lp}-{86D0tN(& zZvEtyH_Ip|VaiO>7(QVPGkrcnp8}qJ7#~Vh7lPV>GV>&s(e3sxEJ25Ufq{YWg(3I~ zU4}R<|4n&8b;l=6`T`RyF%KQ(#w&8b;KGpu5;Awcp8UKO#RMXPAPH&lO6_b}ZskR& zg{195@012Qu|}yJD!-GOQ*kj)rU6$ojja60o(A8hpey)lFE0@=K^2{-xJ8;-yobph z^)_i>uX^gpvCN{qQFM@{qUQ*6_423>yD?RDp(2q8PKHwW2Z!m!s={|bY(W~B4{CZc zBgoh~q*j(U7>QN+?}>s2z^;~p%x!?DfzM_FxM6|*{{Hd!XA1bo10~8y5>4?As19Hv zXJVxP@Fdrg9#hA8pGcxH?u+Cm=y&w<~fq{a`3jA*+9(;bhBKtXM zc3BhSDM86L(XTyXBiK5gjD@OThB3w~vQ@?l6Mli8uULbAMT{ygP>eX7*m2G=arDK$ZBF}Q^?qZJyqqn zs*>=^35vw}6AZKrL^?D)sxnTNIS&VL+rdVVNZLw8F)D#!iaU&9?q|O7!fuc02hQ(- zzF`b;shJHS;gMBD-N@*%QeKXzH>ez!B4=8E21biSp%TJ~G+$re+-R|EVxl_lZE05N zewrCWSdzj1Rt=>p+F4)5ZfAgH|Bktj4K}mVfzc4B;J)@jpU^iRLmpZ2GJ0&3x(V#= z$hNy|1Bh}U=v3lSfND}<5Hf;-29ykx$R{Nza~qR044YE3%a6(Os;LcbSgo`tWz85z zM6Y}k^$a{K&#$=z^*PCz#!b*R^Z|WApR`-)l>%cSdOonz`u#q}hyd`Xv7U{CH=~GD zr~w#EIbjjeb+AI?Q?+vvl=*LnGxVQHGK)8-Xv==V%sG^rS9w&PS9u%={+*grehB`C zwp4sK%tv;}Pv(A9KbA_?6$<gpmV|K5zk3V^6LOr zItEUINek*iBnmPHhK5%JV^9ZN9bXRw|Aya*M8O8Qhuo_nI$cfLl0w_GVWsqY5b3*L zUsE+)7~w;7ZhxW%!r+Bw@V#kOMM+39QCTtqD3F3ha`Lwn`d*O)o`p8Z%h6$^?f#@M zpUWM1R~X_)cHscHP`c6}I0E!FfNDe0@HbM85K5l$Cv98-oF_vVruYz*(T{-2Cg%4( gUP6AytBbGy15leQhEvp{>;M1&07*qoM6N<$g7ZLQy#N3J literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9133e31b43252d00767a6a3806df9ba68de2d265 GIT binary patch literal 3871 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 literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher_round.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ae5f5ccdecc01a9b17a2a0c2b1bb20602f0151 GIT binary patch literal 8001 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 z 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 F@PB1o0BisN literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxxhdpi/ic_launcher_round.png b/src/Lab/Experiments/TriangleNET6/Resources/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ef89bd5215ffcc38c68b119a7495a77a7084543b GIT binary patch literal 10893 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 literal 0 HcmV?d00001 diff --git a/src/Lab/Experiments/TriangleNET6/Resources/values/ic_launcher_background.xml b/src/Lab/Experiments/TriangleNET6/Resources/values/ic_launcher_background.xml new file mode 100644 index 0000000000..6ec24e6413 --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Resources/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #2C3E50 + \ No newline at end of file diff --git a/src/Lab/Experiments/TriangleNET6/Resources/values/strings.xml b/src/Lab/Experiments/TriangleNET6/Resources/values/strings.xml new file mode 100644 index 0000000000..59a3f7289a --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/Resources/values/strings.xml @@ -0,0 +1,4 @@ + + Silk.NET Triangle + Hello, Android! + diff --git a/src/Lab/Experiments/TriangleNET6/TriangleNET6.csproj b/src/Lab/Experiments/TriangleNET6/TriangleNET6.csproj new file mode 100644 index 0000000000..443e498d04 --- /dev/null +++ b/src/Lab/Experiments/TriangleNET6/TriangleNET6.csproj @@ -0,0 +1,26 @@ + + + + Exe + net6.0;net6.0-android + true + preview + $(NETCoreSdkRuntimeIdentifier) + android-arm64;android-x86;android-arm;android-x64 + + + + + + + + + + + + + + + + + diff --git a/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Silk.NET.Windowing.Sdl.Android.targets b/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Silk.NET.Windowing.Sdl.Android.targets index d632d2d7e9..2525d3e898 100644 --- a/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Silk.NET.Windowing.Sdl.Android.targets +++ b/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Silk.NET.Windowing.Sdl.Android.targets @@ -1,6 +1,10 @@ - + - + + diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj index 044019a91d..5273644dfc 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj +++ b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net6.0-android;net6.0-ios;net6.0-maccatalyst @@ -35,8 +35,8 @@ Link="Android/EnumFields.xml" /> - + + + - - + PackagePath="lib/$(_NuGetShortFolderName)/Silk.NET.Windowing.Sdl.aar" /> + From 5eb603cba22597ccd27d43b95c8033a9b81150e7 Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Fri, 20 Aug 2021 17:04:34 +0100 Subject: [PATCH 3/9] lol --- .../Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj index 5273644dfc..6834febb28 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj +++ b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj @@ -76,7 +76,6 @@ Pack="true" PackagePath="lib/$(_NuGetShortFolderName)/Silk.NET.Windowing.Sdl.aar" /> - From dd507adf1ddc630c40ea69cee2e6760e738e3eb8 Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Sat, 21 Aug 2021 18:26:11 +0100 Subject: [PATCH 4/9] SilkTouch: Stop making managed conv assumptions (.NET 5+), short names --- src/Core/Silk.NET.SilkTouch/Extensions.cs | 76 ++++++++ .../INativeContextOverride.cs | 3 +- src/Core/Silk.NET.SilkTouch/NameGenerator.cs | 52 +++-- .../Silk.NET.SilkTouch/NativeApiGenerator.cs | 69 ++----- .../NativeContextOverrideGeneration.cs | 7 +- .../PInvokeNativeContextOverride.cs | 178 ++++++++++++++---- .../Silk.NET.SilkTouch/VTableGeneration.cs | 26 +-- 7 files changed, 280 insertions(+), 131 deletions(-) create mode 100644 src/Core/Silk.NET.SilkTouch/Extensions.cs diff --git a/src/Core/Silk.NET.SilkTouch/Extensions.cs b/src/Core/Silk.NET.SilkTouch/Extensions.cs new file mode 100644 index 0000000000..e5720a5cb0 --- /dev/null +++ b/src/Core/Silk.NET.SilkTouch/Extensions.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; + +namespace Silk.NET.SilkTouch +{ + internal static class Extensions + { + public static bool IsNet5OrGreater(this SyntaxTree syntaxTree) + => syntaxTree + .Options + .PreprocessorSymbolNames // newer SDKs (circa .NET 6) have _OR_GREATER + .Any(static x => x is "NET5_0" or "NET6_0" or "NET5_0_OR_GREATER"); + + public static string GetCallingConvention(this CallingConvention convention) + => convention switch + { + // CallingConvention.Winapi => "", netstandard2.0 doesn't allow this + CallingConvention.Cdecl => "Cdecl", + CallingConvention.ThisCall => "Thiscall", + CallingConvention.StdCall => "Stdcall", + CallingConvention.FastCall => "Fastcall", + _ => throw new ArgumentException("convention is invalid", nameof(convention)) + }; + + public static FunctionPointerTypeSyntax GetFuncPtrType + ( + this IEnumerable loadTypes, + CallingConvention? unmanagedCallingConvention + ) => loadTypes.Select + ( + static x => FunctionPointerParameter + (IdentifierName(x.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))) + ) + .GetFuncPtrType(unmanagedCallingConvention); + + public static FunctionPointerTypeSyntax GetFuncPtrType + ( + this IEnumerable loadTypes, + CallingConvention? unmanagedCallingConvention + ) => loadTypes + .Select(FunctionPointerParameter) + .GetFuncPtrType(unmanagedCallingConvention); + + public static FunctionPointerTypeSyntax GetFuncPtrType + ( + this IEnumerable parameters, + CallingConvention? unmanagedCallingConvention + ) => FunctionPointerType + ( + unmanagedCallingConvention switch + { + CallingConvention.Winapi => FunctionPointerCallingConvention(Token(SyntaxKind.UnmanagedKeyword)), + { } => FunctionPointerCallingConvention + ( + Token(SyntaxKind.UnmanagedKeyword), + FunctionPointerUnmanagedCallingConventionList + ( + SingletonSeparatedList + ( + FunctionPointerUnmanagedCallingConvention + (Identifier(GetCallingConvention(unmanagedCallingConvention.Value))) + ) + ) + ), + _ => FunctionPointerCallingConvention(Token(SyntaxKind.ManagedKeyword)) + }, + FunctionPointerParameterList(SeparatedList(parameters)) + ); + } +} diff --git a/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs b/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs index 73e9383414..d2bd7af89f 100644 --- a/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs +++ b/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs @@ -3,12 +3,13 @@ using System; using System.Collections.Generic; +using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace Silk.NET.SilkTouch { public interface INativeContextOverride { - TypeDeclarationSyntax Type(string name, string lib, EntryPoint[] entrypoints); + TypeDeclarationSyntax Type(string name, string lib, EntryPoint[] entrypoints, Compilation comp); } } diff --git a/src/Core/Silk.NET.SilkTouch/NameGenerator.cs b/src/Core/Silk.NET.SilkTouch/NameGenerator.cs index 7d11e13454..964cec2caf 100644 --- a/src/Core/Silk.NET.SilkTouch/NameGenerator.cs +++ b/src/Core/Silk.NET.SilkTouch/NameGenerator.cs @@ -1,40 +1,52 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Text; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; namespace Silk.NET.SilkTouch { public static class NameGenerator { private static int _c = 1; - - private static char ToAlphabet(int i) - { - return (char) (i + 65); - } - + private static ConcurrentDictionary _names = new(); + private const int ColumnBase = 26; + private const int MaxLength = 7 + 1; // 7 characters can contain zero through int.MaxValue, +1 for underscore + private const string Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static string ToAlphabetString(int i) { - const int maxChar = 26; - var s = ""; + if (i <= ColumnBase) + { + Span theResult = stackalloc char[]{'_', Digits[i - 1]}; + return theResult.ToString(); + } + + Span result = stackalloc char[MaxLength]; + var offset = MaxLength; while (i > 0) { - var x = (i - 1) % maxChar; - s = ToAlphabet(x) + s; - i = (i - x) / 24; + result[--offset] = Digits[--i % ColumnBase]; + i /= ColumnBase; } + + // Make all identifiers start with _. Otherwise, eventually we will end up generating stuff like "GL" and + // "SDL" out of sheer luck for example, which could conflict. + result[--offset] = '_'; - return s; + return result.Slice(offset, MaxLength - offset).ToString(); } +#if !DEBUG + public static string Name(string suggestion) => suggestion; +#else public static string Name(string suggestion) - { - // BUG the name shortener for some reason is causing duplicate member bugs. such as: - // GL.3491994.gen.cs(107452,35): Error CS0111 : Type 'GL.TXDY' already defines a member called 'VNWU' with - // the same parameter types - // return ToAlphabetString(_c++); - return suggestion; - } + => _names.GetOrAdd(suggestion, static _ => ToAlphabetString(Interlocked.Increment(ref _c))); +#endif + + public static IdentifierNameSyntax IdentifierSilk(string hint) => IdentifierName(Name(hint)); } } diff --git a/src/Core/Silk.NET.SilkTouch/NativeApiGenerator.cs b/src/Core/Silk.NET.SilkTouch/NativeApiGenerator.cs index 8e6b7ec3df..8f11839a60 100644 --- a/src/Core/Silk.NET.SilkTouch/NativeApiGenerator.cs +++ b/src/Core/Silk.NET.SilkTouch/NativeApiGenerator.cs @@ -16,6 +16,7 @@ using Silk.NET.Core.Native; using Silk.NET.SilkTouch.NativeContextOverrides; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using static Silk.NET.SilkTouch.NameGenerator; namespace Silk.NET.SilkTouch { @@ -324,7 +325,14 @@ where declaration.Item1.Modifiers.Any ); } - ProcessNativeContextOverrides(processedEntrypoints.ToArray(), ref newMembers, sharedClassSymbol, excludeFromOverrideAttribute); + ProcessNativeContextOverrides + ( + processedEntrypoints.ToArray(), + ref newMembers, + sharedClassSymbol, + excludeFromOverrideAttribute, + compilation + ); var newNamespace = namespaceDeclaration.WithMembers ( @@ -393,39 +401,6 @@ SyntaxList generationusings ) { const string invocationShimName = "StCall"; - static FunctionPointerTypeSyntax GetFuncPtrType - ( - CallingConvention callingConvention, - ITypeSymbol[] loadTypes - ) => FunctionPointerType - ( - callingConvention == CallingConvention.Winapi ? FunctionPointerCallingConvention - ( - Token(SyntaxKind.UnmanagedKeyword) - ) : FunctionPointerCallingConvention - ( - Token(SyntaxKind.UnmanagedKeyword), - FunctionPointerUnmanagedCallingConventionList - ( - SingletonSeparatedList - ( - FunctionPointerUnmanagedCallingConvention - (Identifier(GetCallingConvention(callingConvention))) - ) - ) - ), - FunctionPointerParameterList - ( - SeparatedList - ( - loadTypes.Select - ( - x => FunctionPointerParameter - (IdentifierName(x.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))) - ) - ) - ) - ); static MemberAccessExpressionSyntax GetFuncPtrExpr ( @@ -441,7 +416,7 @@ string entryPoint SyntaxKind.AsExpression, IdentifierName("CurrentVTable"), IdentifierName(generatedVTableName) ) - ), IdentifierName(FirstLetterToUpper(entryPoint)) + ), IdentifierSilk(entryPoint) ); void BuildLoadInvoke(ref IMarshalContext ctx, Action next) @@ -471,14 +446,7 @@ void BuildLoadInvoke(ref IMarshalContext ctx, Action next) Func expression; - var defs = declaration.SyntaxTree.Options.PreprocessorSymbolNames; - - // ReSharper disable PossibleMultipleEnumeration - just not an issue - var hasFastWinapi = defs.Contains("NET5_0") || - defs.Contains("NET6_0") || - defs.Contains("NET5_0_OR_GREATER"); // newer SDKs (circa .NET 6) have _OR_GREATER - // ReSharper restore PossibleMultipleEnumeration - + var hasFastWinapi = declaration.SyntaxTree.IsNet5OrGreater(); var needsInvocationShim = callingConvention == CallingConvention.Winapi && !hasFastWinapi; if ((classIsSealed || generateSeal) && generateVTable) @@ -486,7 +454,7 @@ void BuildLoadInvoke(ref IMarshalContext ctx, Action next) // build load + invocation expression = ctx => { - var fPtrType = GetFuncPtrType(callingConvention, ctx.LoadTypes); + var fPtrType = ctx.LoadTypes.GetFuncPtrType(callingConvention); return InvocationExpression ( needsInvocationShim ? IdentifierName(invocationShimName) : ParenthesizedExpression @@ -619,7 +587,7 @@ CallingConvention callingConvention ( CastExpression ( - GetFuncPtrType(callingConvention, ctx.LoadTypes), + ctx.LoadTypes.GetFuncPtrType(callingConvention), GetFuncPtrExpr(generatedVTableName, entryPoint) ) ), @@ -713,17 +681,6 @@ StatementSyntax ManualWinapiInvokeShim(IMarshalContext ctx) } } - private static string GetCallingConvention(CallingConvention convention) - => convention switch - { - // CallingConvention.Winapi => "", netstandard2.0 doesn't allow this - CallingConvention.Cdecl => "Cdecl", - CallingConvention.ThisCall => "Thiscall", - CallingConvention.StdCall => "Stdcall", - CallingConvention.FastCall => "Fastcall", - _ => throw new ArgumentException("convention is invalid", nameof(convention)) - }; - private static NativeApiAttribute? ToNativeApiAttribute(AttributeData? attributeData) { if (attributeData is null) diff --git a/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs b/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs index 49568e3e11..cf9f9ed7f7 100644 --- a/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs +++ b/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs @@ -24,7 +24,8 @@ private void ProcessNativeContextOverrides EntryPoint[] entrypoints, ref List members, ITypeSymbol classSymbol, - INamedTypeSymbol excludeFromOverrideAttribute + INamedTypeSymbol excludeFromOverrideAttribute, + Compilation comp ) { var overrides = FindNativeContextOverrides(classSymbol); @@ -50,7 +51,7 @@ INamedTypeSymbol excludeFromOverrideAttribute foreach (var (attSymbol, attId, lib, @override) in overrides.OrderBy(x => x.Item2)) { - var name = $"OVERRIDE_{attId}"; + var name = NameGenerator.Name($"OVERRIDE_{attId}"); members.Add(@override.Type(name, lib, entrypoints.Where(x => x.SourceSymbol.GetAttributes() .All(x2 => { @@ -59,7 +60,7 @@ INamedTypeSymbol excludeFromOverrideAttribute var matchId = (int) x2.ConstructorArguments[0].Value!; return matchId != attId; - })).ToArray())); + })).ToArray(), comp)); last = IfStatement ( BinaryExpression diff --git a/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs b/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs index 04781712e7..30c87013ac 100644 --- a/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs +++ b/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs @@ -8,19 +8,20 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using static Silk.NET.SilkTouch.NameGenerator; namespace Silk.NET.SilkTouch.NativeContextOverrides { public sealed class PInvokeNativeContextOverride : INativeContextOverride { /// - public TypeDeclarationSyntax Type(string name, string lib, EntryPoint[] entrypoints) + public TypeDeclarationSyntax Type(string name, string lib, EntryPoint[] entrypoints, Compilation comp) { - static BlockSyntax GetSlotSwitch(EntryPoint[] entrypoints, List members) + var canUseCorrectCallConv = comp.SyntaxTrees.FirstOrDefault()?.IsNet5OrGreater() ?? false; + static BlockSyntax GetSlotSwitch(EntryPoint[] entrypoints, List members, bool canUseCorrectCallConv) { members.Add(NativeContextOverrideHelper.GetProcAddress); members.Add(NativeContextOverrideHelper.TryGetProcAddress); - return Block ( ReturnStatement @@ -41,16 +42,21 @@ static BlockSyntax GetSlotSwitch(EntryPoint[] entrypoints, List MethodDeclaration(entrypoint.LoadTypes.Last(), Identifier($"I_{entrypoint.Name}")) - .WithAttributeLists + MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint, bool callConvCorrection = false) + { + var ret = MethodDeclaration + ( + entrypoint.LoadTypes.Last(), + Identifier(Name(callConvCorrection ? $"S_{entrypoint.Name}" : $"I_{entrypoint.Name}")) + ) + .WithAttributeLists + ( + SingletonList ( - SingletonList + AttributeList ( - AttributeList + SingletonSeparatedList ( - SingletonSeparatedList - ( - Attribute + callConvCorrection + ? Attribute + ( + QualifiedName + ( + QualifiedName + ( + QualifiedName + (IdentifierName("System"), IdentifierName("Runtime")), + IdentifierName("InteropServices") + ), IdentifierName("UnmanagedCallersOnly") + ) + ) + .WithArgumentList + ( + AttributeArgumentList + ( + SeparatedList + ( + new SyntaxNodeOrToken[] + { + AttributeArgument + ( + ImplicitArrayCreationExpression + ( + InitializerExpression + ( + SyntaxKind.ArrayInitializerExpression, + SingletonSeparatedList + ( + TypeOfExpression + ( + QualifiedName + ( + QualifiedName + ( + QualifiedName + ( + IdentifierName + ("System"), + IdentifierName + ("Runtime") + ), + IdentifierName + ("CompilerServices") + ), + IdentifierName + ( + "CallConv" + + entrypoint.CallingConvention + .GetCallingConvention() + ) + ) + ) + ) + ) + ) + ) + .WithNameEquals(NameEquals(IdentifierName("CallConvs"))) + } + ) + ) + ) + : Attribute ( QualifiedName ( QualifiedName ( - QualifiedName(IdentifierName("System"), IdentifierName("Runtime")), + QualifiedName + (IdentifierName("System"), IdentifierName("Runtime")), IdentifierName("InteropServices") ), IdentifierName("DllImport") ) @@ -105,7 +180,8 @@ MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint) Literal(entrypoint.Name) ) ) - .WithNameEquals(NameEquals(IdentifierName("EntryPoint"))), + .WithNameEquals + (NameEquals(IdentifierName("EntryPoint"))), Token(SyntaxKind.CommaToken), AttributeArgument ( @@ -135,35 +211,67 @@ MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint) ) ) ) - ) ) ) ) - .WithModifiers - ( - TokenList + ) + .WithModifiers + ( + callConvCorrection + ? TokenList(Token(SyntaxKind.PrivateKeyword), Token(SyntaxKind.StaticKeyword)) + : TokenList ( - Token(SyntaxKind.PrivateKeyword), Token(SyntaxKind.StaticKeyword), + Token(SyntaxKind.PrivateKeyword), + Token(SyntaxKind.StaticKeyword), Token(SyntaxKind.ExternKeyword) ) + ) + .WithParameterList + ( + ParameterList + ( + SeparatedList + ( + entrypoint.LoadTypes.Take + (entrypoint.LoadTypes.Length - 1) + .Select((x, i) => Parameter(default, default, x, Identifier($"p{i}"), default)) + ) ) - .WithParameterList + ); + + if (callConvCorrection) + { + ret = ret.WithExpressionBody ( - ParameterList + ArrowExpressionClause ( - SeparatedList + InvocationExpression ( - entrypoint.LoadTypes.Take - (entrypoint.LoadTypes.Length - 1) - .Select((x, i) => Parameter(default, default, x, Identifier($"p_{i}"), default)) + IdentifierSilk($"I_{entrypoint.Name}"), + ArgumentList + ( + SeparatedList + ( + entrypoint.LoadTypes.Take(entrypoint.LoadTypes.Length - 1) + .Select((_, i) => Argument(IdentifierName($"p{i}"))) + ) + ) ) ) - ) - .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); + ); + } + + return ret.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); + } var v = entrypoints.Distinct(new NameComparer()).ToArray(); var members = new List(); - members.AddRange(v.Select(GetMethodFromEntrypoint)); + members.AddRange(v.Select(x => GetMethodFromEntrypoint(x))); + if (canUseCorrectCallConv) + { + members.AddRange(v.Select(x => GetMethodFromEntrypoint(x, true))); + } + members.Add ( MethodDeclaration(IdentifierName("IntPtr"), Identifier("CoreGetProcAddress")) @@ -197,7 +305,7 @@ MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint) ) ) ) - .WithBody(GetSlotSwitch(v, members)) + .WithBody(GetSlotSwitch(v, members, canUseCorrectCallConv)) ); members.Add ( diff --git a/src/Core/Silk.NET.SilkTouch/VTableGeneration.cs b/src/Core/Silk.NET.SilkTouch/VTableGeneration.cs index 662e04be60..a64f517103 100644 --- a/src/Core/Silk.NET.SilkTouch/VTableGeneration.cs +++ b/src/Core/Silk.NET.SilkTouch/VTableGeneration.cs @@ -6,6 +6,7 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using static Silk.NET.SilkTouch.NameGenerator; namespace Silk.NET.SilkTouch { @@ -58,7 +59,7 @@ private TypeDeclarationSyntax GenerateVTable AssignmentExpression ( SyntaxKind.SimpleAssignmentExpression, - IdentifierName($"_{entryPoint}"), + IdentifierSilk($"_{entryPoint}"), InvocationExpression ( MemberAccessExpression @@ -90,7 +91,7 @@ private TypeDeclarationSyntax GenerateVTable vTableMembers.Add ( - ConstructorDeclaration("GeneratedVTable") + ConstructorDeclaration(Name("GeneratedVTable")) .WithModifiers(TokenList(Token(SyntaxKind.InternalKeyword))) .WithParameterList ( @@ -114,8 +115,7 @@ private TypeDeclarationSyntax GenerateVTable List slotVars = new List(); foreach (var entrypoint in entryPoints.Distinct()) { - var name = $"_{entrypoint}"; - slotVars.Add(VariableDeclarator(name)); + slotVars.Add(VariableDeclarator(Name($"_{entrypoint}"))); } vTableMembers.Add @@ -207,7 +207,7 @@ private TypeDeclarationSyntax GenerateVTable ( ConstantPattern (LiteralExpression(SyntaxKind.StringLiteralExpression, Literal(s))), - IdentifierName(FirstLetterToUpper(s)) + IdentifierSilk(s) ) ) .Append @@ -248,8 +248,7 @@ private TypeDeclarationSyntax GenerateVTable ( entryPoints.Distinct().Select ( - s => PropertyDeclaration - (IdentifierName("nint"), FirstLetterToUpper(s)) + s => PropertyDeclaration(IdentifierName("nint"), Name(s)) .WithExpressionBody ( ArrowExpressionClause @@ -258,14 +257,14 @@ private TypeDeclarationSyntax GenerateVTable ( BinaryExpression ( - SyntaxKind.NotEqualsExpression, IdentifierName("_" + s), + SyntaxKind.NotEqualsExpression, IdentifierSilk("_" + s), DefaultExpression(IdentifierName("nint")) - ), IdentifierName("_" + s), + ), IdentifierSilk("_" + s), ParenthesizedExpression ( AssignmentExpression ( - SyntaxKind.SimpleAssignmentExpression, IdentifierName("_" + s), + SyntaxKind.SimpleAssignmentExpression, IdentifierSilk("_" + s), InvocationExpression ( IdentifierName("_ctx.GetProcAddress"), @@ -308,7 +307,7 @@ private TypeDeclarationSyntax GenerateVTable AssignmentExpression ( SyntaxKind.SimpleAssignmentExpression, - IdentifierName($"_{x}"), + IdentifierSilk($"_{x}"), DefaultExpression (IdentifierName("nint")) ) @@ -344,10 +343,5 @@ private TypeDeclarationSyntax GenerateVTable ), List(), List(vTableMembers) ); } - - private static string FirstLetterToUpper(string s) - { - return s.First().ToString().ToUpper() + s.Substring(1); - } } } From 207a39239aba48d8224c91fe95eba8fd224e1c06 Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Sat, 21 Aug 2021 20:24:11 +0100 Subject: [PATCH 5/9] Triangle on .NET 6 on Android now works --- src/Lab/Experiments/Triangle/Program.cs | 4 +++ .../Experiments/TriangleDroid/MainActivity.cs | 4 ++- .../TriangleNET6/AndroidManifest.xml | 3 +- .../TriangleNET6/TriangleNET6.csproj | 2 ++ .../Additions/SilkActivity.cs | 9 +++++- .../Silk.NET.Windowing.Sdl/SdlView.cs | 7 +++-- .../Silk.NET.Windowing.Sdl.csproj | 29 +++++-------------- 7 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/Lab/Experiments/Triangle/Program.cs b/src/Lab/Experiments/Triangle/Program.cs index 652af910a2..7146df2e56 100644 --- a/src/Lab/Experiments/Triangle/Program.cs +++ b/src/Lab/Experiments/Triangle/Program.cs @@ -103,7 +103,11 @@ private static unsafe void Load() (GLEnum.ArrayBuffer, (nuint)( _vertices.Length * sizeof(float)), vertices, GLEnum.StaticDraw); } +#if NET6_0 + _shader = new Shader("TriangleNET6.shader.vert", "TriangleNET6.shader.frag", _gl, typeof(Program)); +#else _shader = new Shader("Triangle.shader.vert", "Triangle.shader.frag", _gl, typeof(Program)); +#endif _shader.Use(); _vertexArrayObject = _gl.GenVertexArray(); _gl.BindVertexArray(_vertexArrayObject); diff --git a/src/Lab/Experiments/TriangleDroid/MainActivity.cs b/src/Lab/Experiments/TriangleDroid/MainActivity.cs index afb5e89b96..f4aaba0108 100644 --- a/src/Lab/Experiments/TriangleDroid/MainActivity.cs +++ b/src/Lab/Experiments/TriangleDroid/MainActivity.cs @@ -11,7 +11,9 @@ namespace TriangleDroid ( Label = "@string/app_name", MainLauncher = true, - ConfigurationChanges = ConfigChangesFlags + ConfigurationChanges = ConfigChangesFlags, + ScreenOrientation = ScreenOrientation.Landscape, + Theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" )] public class MainActivity : SilkActivity { diff --git a/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml b/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml index 6fdc48f1d2..ac8b2a6b92 100644 --- a/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml +++ b/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml @@ -1,7 +1,8 @@ + + diff --git a/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Additions/SilkActivity.cs b/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Additions/SilkActivity.cs index 34a3be3201..26c735290a 100644 --- a/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Additions/SilkActivity.cs +++ b/src/Windowing/Android/Silk.NET.Windowing.Sdl.Android/Additions/SilkActivity.cs @@ -2,9 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Android.App; using Android.Content.PM; +using Android.Provider; using Org.Libsdl.App; using Silk.NET.Core.Loader; using Silk.NET.Core.Native; @@ -47,7 +49,7 @@ internal static unsafe void Main() public override unsafe void LoadLibraries() { base.LoadLibraries(); - if (!(Instance is null)) + if (Instance is not null) { throw new InvalidOperationException("Only one SilkActivity may be present throughout the whole application."); } @@ -56,6 +58,11 @@ public override unsafe void LoadLibraries() SetupMain(SilkMarshal.DelegateToPtr(CurrentMain)); } + public override void SetOrientationBis(int w, int h, bool resizable, string hint) + { + // do nothing, Silk.NET respects the OS and doesn't want to do any meddling the consumer can't control. + } + protected abstract void OnRun(); private void Run() diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs b/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs index 85b4436b1a..d1b22d3ba6 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs +++ b/src/Windowing/Silk.NET.Windowing.Sdl/SdlView.cs @@ -114,10 +114,13 @@ protected void CoreInitialize { var flags = WindowFlags.WindowAllowHighdpi | WindowFlags.WindowShown; - if (additionalFlags is null) { - flags |= WindowFlags.WindowResizable; + flags |= _platform.IsViewOnly switch + { + true => WindowFlags.WindowBorderless | WindowFlags.WindowFullscreen, + false => WindowFlags.WindowResizable + }; } else { diff --git a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj index 6834febb28..60c916efbb 100644 --- a/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj +++ b/src/Windowing/Silk.NET.Windowing.Sdl/Silk.NET.Windowing.Sdl.csproj @@ -29,12 +29,9 @@ - - - + + + @@ -50,31 +47,19 @@ - + - - + + - + From 5672726abed1c0e2d669291f3f3cbef6e8a59275 Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Sat, 21 Aug 2021 21:50:38 +0100 Subject: [PATCH 6/9] Fix old android lab app for fullscreen --- .../Experiments/TriangleDroid/Properties/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Lab/Experiments/TriangleDroid/Properties/AndroidManifest.xml b/src/Lab/Experiments/TriangleDroid/Properties/AndroidManifest.xml index fc347b9ad5..720aefe59b 100644 --- a/src/Lab/Experiments/TriangleDroid/Properties/AndroidManifest.xml +++ b/src/Lab/Experiments/TriangleDroid/Properties/AndroidManifest.xml @@ -2,7 +2,8 @@ + package="com.companyname.triangledroid" + android:theme="@android:style/Theme.NoTitleBar"> Date: Sat, 21 Aug 2021 21:54:52 +0100 Subject: [PATCH 7/9] Fix bad ifdef --- src/Core/Silk.NET.SilkTouch/NameGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Silk.NET.SilkTouch/NameGenerator.cs b/src/Core/Silk.NET.SilkTouch/NameGenerator.cs index 964cec2caf..096f193fff 100644 --- a/src/Core/Silk.NET.SilkTouch/NameGenerator.cs +++ b/src/Core/Silk.NET.SilkTouch/NameGenerator.cs @@ -40,7 +40,7 @@ private static string ToAlphabetString(int i) return result.Slice(offset, MaxLength - offset).ToString(); } -#if !DEBUG +#if DEBUG public static string Name(string suggestion) => suggestion; #else public static string Name(string suggestion) From bc38c2bd7a943cd432fbcc3a91af03362506d1eb Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Sun, 22 Aug 2021 00:23:46 +0100 Subject: [PATCH 8/9] CI fix? --- .github/workflows/build.yml | 10 +- .github/workflows/deploy.yml | 10 +- README.md | 16 +- build/nuke/Build.cs | 325 +++++++++--------- build/nuke/Projects.cs | 59 +++- .../Silk.NET.Windowing.Sdl.iOS.csproj | 2 +- 6 files changed, 249 insertions(+), 173 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c1e6f0c8b4..acbe9e885a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,14 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: 6.0.100-preview.7.21379.14 + - name: Setup .NET 5.0 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.201 + - name: Setup .NET Core 3.1 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.404 - name: Setup NUKE run: dotnet tool install Nuke.GlobalTool --global - name: Install Workloads @@ -30,7 +38,7 @@ jobs: run: nuke ValidateSolution - name: Pack # TODO build native mixins such as BuildLibSilkDroid - run: nuke Pack --configuration Release --msbuild-properties VersionSuffix=build${{ github.run_number }}.0 ContinuousIntegrationBuild=true --feature-sets Android iOS + run: nuke Pack --configuration Release --msbuild-properties VersionSuffix=build${{ github.run_number }}.0 ContinuousIntegrationBuild=true --feature-sets Legacy-Android Legacy-iOS - name: Push to NuGet if: ${{ github.repository == 'dotnet/Silk.NET' && github.event_name != 'pull_request' }} run: nuke PushToNuGet --skip Clean Restore Compile Pack --nuget-feed https://pkgs.dev.azure.com/UltzOS/Silk.NET/_packaging/Experimental/nuget/v3/index.json --nuget-username ${{ secrets.AZDO_ARTIFACTS_USERNAME }} --nuget-password ${{ secrets.AZDO_ARTIFACTS_TOKEN }} --nuget-api-key az diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 81b528b511..a7283bf725 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,6 +16,14 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: 6.0.100-preview.7.21379.14 + - name: Setup .NET 5.0 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.201 + - name: Setup .NET Core 3.1 + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.404 - name: Setup NUKE run: dotnet tool install Nuke.GlobalTool --global - name: Install Workloads @@ -24,7 +32,7 @@ jobs: - name: Setup NUKE run: dotnet tool install Nuke.GlobalTool --global - name: Pack - run: nuke Pack --msbuild-properties ContinuousIntegrationBuild=true SilkEnableSourceLink=true --feature-sets Android iOS + run: nuke Pack --msbuild-properties ContinuousIntegrationBuild=true SilkEnableSourceLink=true --feature-sets Legacy-Android Legacy-iOS - name: Upload Unsigned Artifacts to Actions uses: actions/upload-artifact@v2.2.4 with: diff --git a/README.md b/README.md index cf351c4975..793bc12973 100644 --- a/README.md +++ b/README.md @@ -54,13 +54,21 @@ In addition, the Silk.NET working group help drive larger user-facing changes pr

Building from source

-- Make sure you have at least the .NET 5 SDK installed, preferably with Visual Studio's .NET Framework and Xamarin workloads too. -- Clone the repository -- Run build.sh, build.cmd, build.ps1, or `nuke build`. To build for iOS and Android, add the `--feature-sets ios android` arguments. +Prerequisites +- **Must**: .NET 6 SDK +- **Should**: Android (w/ AOT), iOS, and MAUI .NET 6 workloads (use `dotnet workload install android android-aot ios maui` to install them) +- **Should**: Android SDK version 30 with NDK tools installed +- **Could**: Java JDK (for gradle) +- **Could**: Visual Studio 2019 Community version 16.10 or later + +Instructions +- Clone the repository (recursively) +- Run build.sh, build.cmd, build.ps1, or `nuke compile`. By default all packages targeting .NET Core, Standard, or .NET 6 are built. To build our older Xamarin iOS and Android packages, add the `--feature-sets legacy-ios legacy-android` arguments. +- Use the DLLs. To get nupkgs you can use with NuGet instead, use `nuke pack`. There are more advanced build actions you can do too, such as FullBuild, Pack, FullPack, among others which you can view by doing `nuke --plan`. -Some projects may not build properly without being configured to use Desktop MSBuild (i.e. the MSBuild shipped with Visual Studio). As a result, you will ideally need to be on Windows and have Visual Studio 2019 Community (or greater) installed with .NET Core and Xamarin workloads. If you don't have this (i.e. because you're on Linux or Mac), you can still develop Silk.NET in a limited capacity but you will not be able to work on mobile workloads. +The older Xamarin projects will not build properly without being configured to use Desktop MSBuild (i.e. the MSBuild shipped with Visual Studio). As a result, you will ideally need to be on Windows and have Visual Studio 2019 Community (v16.10 or greater) installed with .NET Core and Xamarin workloads. If you don't have this (i.e. because you're on Linux or Mac), you won't be able to build the older Xamarin packages.

Contributing

diff --git a/build/nuke/Build.cs b/build/nuke/Build.cs index c15d97b7b3..d7f0fbcaa3 100644 --- a/build/nuke/Build.cs +++ b/build/nuke/Build.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; +using JetBrains.Annotations; using Nuke.Common; using Nuke.Common.Execution; using Nuke.Common.IO; @@ -25,8 +26,7 @@ class Build : NukeBuild /// - JetBrains Rider https://nuke.build/rider /// - Microsoft VisualStudio https://nuke.build/visualstudio /// - Microsoft VSCode https://nuke.build/vscode - - public static int Main () => Execute(x => x.Compile); + public static int Main() => Execute(x => x.Compile); static int IndexOfOrThrow(string x, char y) { @@ -47,7 +47,7 @@ bool HasDesktopMsBuild { return false; } - + try { MSBuildToolPathResolver.Resolve(); // throws if it can't find msbuild @@ -59,15 +59,21 @@ bool HasDesktopMsBuild } } } - + bool HasProcessedSolutions { get; set; } bool HasProcessedProperties { get; set; } - [Parameter("The feature sets to build - Could include Core, iOS, or Android. Any projects that aren't " + - "categorized into a feature set will always be built.")] - string[] FeatureSets = {"core"}; - - [Parameter("Forces the build system to use \"dotnet build\" instead of \"msbuild\" if available.")] + [Parameter + ( + "The feature sets to build - Could include Core, Legacy-iOS, or Legacy-Android. Any projects that aren't " + + "categorized into a feature set will always be built." + )] + string[] FeatureSets = { "core" }; + + [Parameter + ( + "Forces the build system to use \"dotnet build\" instead of \"msbuild\" if available. Ignored for legacy Android and iOS feature sets." + )] readonly bool ForceDotnet; [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")] @@ -80,26 +86,19 @@ bool HasDesktopMsBuild [Parameter("NuGet password")] readonly string NugetPassword; [Parameter("Code-signing service username")] readonly string SignUsername; [Parameter("Code-signing service password")] readonly string SignPassword; + [Parameter("Extra properties passed to MSBuild commands")] - readonly string[] MsbuildProperties = Array.Empty(); + readonly string[] MsbuildProperties = Array.Empty(); [Solution] readonly Solution Solution; - Solution ProcessedSolution - { - get - { - if (!HasProcessedSolutions) - { - Projects.ProcessSolution(Solution, FeatureSets, HasDesktopMsBuild); - HasProcessedSolutions = true; - } - - return Solution; - } - } + [CanBeNull] Dictionary SolutionsValue; + + Dictionary Solutions + => SolutionsValue ??= Projects.ProcessSolution(Solution, FeatureSets, HasDesktopMsBuild); Dictionary ProcessedMsbuildPropertiesValue; + Dictionary ProcessedMsbuildProperties { get @@ -127,9 +126,8 @@ Dictionary ProcessedMsbuildProperties // ReSharper disable once RedundantEmptyObjectOrCollectionInitializer readonly HashSet AllowedExclusions = new() { - }; - + Target ValidateSolution => _ => _ .Executes ( @@ -158,7 +156,7 @@ Dictionary ProcessedMsbuildProperties $"\"{file}\" if this is acceptable please add the project name (excluding the path and " + "extension) to the AllowedExclusions array in the NUKE Build.cs file." ); - + missedOut.Add(file); } } @@ -178,52 +176,58 @@ Dictionary ProcessedMsbuildProperties Target Clean => _ => _ .Before(Restore) - .Executes(() => - { - if (!HasProcessedSolutions) + .Executes + ( + () => { - var slnDir = Path.Combine(Solution.Directory!, "build", "sln"); - if (Directory.Exists(slnDir)) + if (!HasProcessedSolutions) { - Directory.Delete(slnDir, true); + var slnDir = Path.Combine(Solution.Directory!, "build", "sln"); + if (Directory.Exists(slnDir)) + { + Directory.Delete(slnDir, true); + } + } + else + { + Logger.Warn + ( + "Solution has already been preprocessed prior to the Clean target. " + + "Unable to clean the preprocessed solution folder." + ); } - } - else - { - Logger.Warn - ( - "Solution has already been preprocessed prior to the Clean target. " + - "Unable to clean the preprocessed solution folder." - ); - } - - - if (HasDesktopMsBuild) - { - MSBuild - ( - s => s.SetTargetPath(ProcessedSolution) - .SetTargets("Clean") - .SetMaxCpuCount(Environment.ProcessorCount) - .SetProperties(ProcessedMsbuildProperties) - ); - } - else - { - DotNetClean(s => s.SetProject(ProcessedSolution) - .SetConfiguration(Configuration) - .SetProperties(ProcessedMsbuildProperties)); - } - if (Directory.Exists(RootDirectory / "build" / "output_packages")) - { - Directory.Delete(RootDirectory / "build" / "output_packages", true); - } + foreach (var (key, (sln, useDesktopMsBuild)) in Solutions) + { + Logger.Info($"Cleaning feature set \"{key}\" ({sln})"); + if (useDesktopMsBuild) + { + MSBuild + ( + s => s.SetTargets("Clean") + .SetMaxCpuCount(Environment.ProcessorCount) + .SetProperties(ProcessedMsbuildProperties) + .SetTargetPath(sln) + ); + } + else + { + DotNetClean + ( + s => s.SetProject(sln) + .SetConfiguration(Configuration) + .SetProperties(ProcessedMsbuildProperties) + ); + } + } + + if (Directory.Exists(RootDirectory / "build" / "output_packages")) + { + Directory.Delete(RootDirectory / "build" / "output_packages", true); + } + + Directory.CreateDirectory(RootDirectory / "build" / "output_packages"); - Directory.CreateDirectory(RootDirectory / "build" / "output_packages"); - - if (FeatureSets.Any(x => x.Equals("android", StringComparison.InvariantCultureIgnoreCase))) - { var silkDroid = SourceDirectory / "Windowing" / "Android" / "SilkDroid"; using var process = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? StartProcess("bash", "-c \"./gradlew clean\"", silkDroid) @@ -231,67 +235,78 @@ Dictionary ProcessedMsbuildProperties process.AssertZeroExitCode(); return process.Output; } - - Logger.Warn("Skipping gradlew clean because Android hasn't been specified as a feature set."); - return default; - }); + ); Target Restore => _ => _ .After(Clean) - .Executes(() => - { - if (HasDesktopMsBuild) - { - MSBuild - ( - s => s - .SetTargetPath(ProcessedSolution) - .SetConfiguration(Configuration) - .SetTargets("Restore") - .SetMaxCpuCount(Environment.ProcessorCount) - .SetProperties(ProcessedMsbuildProperties) - ); - } - else + .Executes + ( + () => { - DotNetRestore - ( - s => s - .SetProjectFile(ProcessedSolution) - .SetProperties(ProcessedMsbuildProperties) - ); + foreach (var (key, (sln, useDesktopMsBuild)) in Solutions) + { + Logger.Info($"Restoring {key}"); + if (useDesktopMsBuild) + { + MSBuild + ( + s => s + .SetTargetPath(sln) + .SetConfiguration(Configuration) + .SetTargets("Restore") + .SetMaxCpuCount(Environment.ProcessorCount) + .SetProperties(ProcessedMsbuildProperties) + ); + } + else + { + DotNetRestore + ( + s => s + .SetProjectFile(sln) + .SetProperties(ProcessedMsbuildProperties) + ); + } + } } - }); + ); Target Compile => _ => _ .DependsOn(Clean, Restore) - .Executes(() => - { - if (HasDesktopMsBuild) - { - MSBuild - ( - s => s - .SetTargets("Build") - .SetTargetPath(ProcessedSolution) - .SetConfiguration(Configuration) - .SetMaxCpuCount(Environment.ProcessorCount) - .SetNodeReuse(IsLocalBuild) - .SetProperties(ProcessedMsbuildProperties) - ); - } - else + .Executes + ( + () => { - DotNetBuild - ( - s => s - .SetProjectFile(ProcessedSolution) - .SetConfiguration(Configuration) - .SetNoRestore(true) - .SetProperties(ProcessedMsbuildProperties) - ); + foreach (var (key, (sln, useDesktopMsBuild)) in Solutions) + { + Logger.Info($"Compiling {key}"); + if (useDesktopMsBuild) + { + MSBuild + ( + s => s + .SetTargets("Build") + .SetTargetPath(sln) + .SetConfiguration(Configuration) + .SetMaxCpuCount(Environment.ProcessorCount) + .SetNodeReuse(IsLocalBuild) + .SetProperties(ProcessedMsbuildProperties) + ); + } + else + { + DotNetBuild + ( + s => s + .SetProjectFile(sln) + .SetConfiguration(Configuration) + .SetNoRestore(true) + .SetProperties(ProcessedMsbuildProperties) + ); + } + } } - }); + ); Target Test => _ => _ .DependsOn(Compile) @@ -304,7 +319,7 @@ Dictionary ProcessedMsbuildProperties ControlFlow.Fail("The Test target can currently not run against additional feature sets."); } - foreach (var project in ProcessedSolution.GetProjects("*")) + foreach (var project in Solutions["Core"].Solution.GetProjects("*")) { if (project.Name.Contains("tests", StringComparison.InvariantCultureIgnoreCase)) { @@ -320,7 +335,7 @@ Dictionary ProcessedMsbuildProperties ( () => { - var project = ProcessedSolution.GetProject("Silk.NET.BuildTools"); + var project = Solutions["Core"].Solution.GetProject("Silk.NET.BuildTools"); if (project == default) { Logger.Error("Couldn't find BuildTools in the solution file."); @@ -342,12 +357,6 @@ Dictionary ProcessedMsbuildProperties ( () => { - if (!FeatureSets.Any(x => x.Equals("android", StringComparison.InvariantCultureIgnoreCase))) - { - Logger.Warn("Skipping BuildLibSilkDroid because Android hasn't been specified as a feature set."); - return default; - } - var sdl = RootDirectory / "build" / "submodules" / "SDL"; var silkDroid = SourceDirectory / "Windowing" / "Android" / "SilkDroid"; var xcopy = new (string, string)[] @@ -363,7 +372,7 @@ Dictionary ProcessedMsbuildProperties { ControlFlow.Fail($"\"{from}\" does not exist (did you forget to recursively clone the repo?)"); } - + CopyDirectoryRecursively(from, to, DirectoryExistsPolicy.Merge, FileExistsPolicy.Overwrite); } @@ -389,38 +398,45 @@ Dictionary ProcessedMsbuildProperties Target Pack => _ => _ .DependsOn(Clean, Restore) .After(RegenerateBindings, BuildLibSilkDroid) - .Executes(() => - { - if (HasDesktopMsBuild) - { - MSBuild - ( - s => s - .SetTargets("Pack") - .SetTargetPath(ProcessedSolution) - .SetConfiguration(Configuration) - .SetMaxCpuCount(Environment.ProcessorCount) - .SetNodeReuse(IsLocalBuild) - .SetProperties(ProcessedMsbuildProperties) - ); - } - else + .Executes + ( + () => { - DotNetPack - ( - s => s - .SetProject(ProcessedSolution) - .SetConfiguration(Configuration) - .SetNoRestore(true) - .SetProperties(ProcessedMsbuildProperties) - ); + foreach (var (key, (sln, useDesktopMsBuild)) in Solutions) + { + Logger.Info($"Packing {key}"); + if (useDesktopMsBuild) + { + MSBuild + ( + s => s + .SetTargets("Pack") + .SetTargetPath(sln) + .SetConfiguration(Configuration) + .SetMaxCpuCount(Environment.ProcessorCount) + .SetNodeReuse(IsLocalBuild) + .SetProperties(ProcessedMsbuildProperties) + ); + } + else + { + DotNetPack + ( + s => s + .SetProject(sln) + .SetConfiguration(Configuration) + .SetNoRestore(true) + .SetProperties(ProcessedMsbuildProperties) + ); + } + } } - }); + ); Target FullPack => _ => _ .DependsOn(BuildLibSilkDroid, RegenerateBindings, Pack); - Target PushToNuGet => _ => _ + Target PushToNuGet => _ => _ .DependsOn(Pack) .Executes(PushPackages); @@ -428,6 +444,7 @@ Dictionary ProcessedMsbuildProperties .DependsOn(FullPack, PushToNuGet); static string PackageDirectory => RootDirectory / "build" / "output_packages"; + static IEnumerable Packages => Directory.GetFiles(PackageDirectory, "*.nupkg") .Where(x => Path.GetFileName(x).StartsWith("Silk.NET") || Path.GetFileName(x).StartsWith("Ultz.Native")); @@ -462,7 +479,7 @@ async Task PushPackages() } } - var allFiles = Packages.Select((x, i) => new {Index = i, Value = x}) + var allFiles = Packages.Select((x, i) => new { Index = i, Value = x }) .GroupBy(x => x.Index / rateLimit) .Select(x => x.Select(v => v.Value).ToList()) .ToList(); diff --git a/build/nuke/Projects.cs b/build/nuke/Projects.cs index 95082033d9..ba06784bcb 100644 --- a/build/nuke/Projects.cs +++ b/build/nuke/Projects.cs @@ -9,39 +9,66 @@ using Nuke.Common; using Nuke.Common.IO; using Nuke.Common.ProjectModel; +using static Nuke.Common.ProjectModel.ProjectModelTasks; public static class Projects { // Modify this bit if you want to define another feature set public static readonly IReadOnlyList FeatureSets = new[] { - new FeatureSet("iOS", true, "Silk.NET.Windowing.Sdl.iOS", "TriangleIOS"), - new FeatureSet("Android", true, "Silk.NET.Windowing.Sdl.Android", "TriangleDroid", "TriangleDroidUvExperiment"), - new FeatureSet("NUKE", false, "Silk.NET.NUKE", "Silk.NET.NUKE.SshAgent"), + new FeatureSet("Legacy-iOS", true, true, "Silk.NET.Windowing.Sdl.iOS", "TriangleIOS"), + new FeatureSet("Legacy-Android", true, true, "Silk.NET.Windowing.Sdl.Android", "TriangleDroid", "TriangleDroidUvExperiment"), + new FeatureSet("NUKE", false, false, "Silk.NET.NUKE", "Silk.NET.NUKE.SshAgent"), }; - public static void ProcessSolution(Solution originalSolution, string[] featureSets, bool hasDesktopMsBuild) + public static Dictionary ProcessSolution + ( + Solution originalSolution, + string[] featureSets, + bool hasDesktopMsBuild + ) { + var originalSolutionPath = originalSolution; + var featureSetSpecificSolutions = new Dictionary(); + var rm = new List(); foreach (var featureSet in FeatureSets!) { + rm.Clear(); var featureSetUsed = featureSets.Any (x => x.Equals(featureSet.Name, StringComparison.OrdinalIgnoreCase)); if (featureSetUsed && !hasDesktopMsBuild && featureSet.RequiresDesktopMsBuild) { throw new NotSupportedException("Desktop MSBuild is not available."); } - + foreach (var proj in originalSolution.GetProjects("*")) { - if (!featureSetUsed && - featureSet.Projects.Any(x => x.Equals(proj.Name, StringComparison.OrdinalIgnoreCase))) + if (!featureSet.Projects.Any(x => x.Equals(proj.Name, StringComparison.OrdinalIgnoreCase))) + { + rm.Add(proj.Path); + continue; + } + + if (!featureSetUsed) { Logger.Trace($"\"{proj.Name}\" will not be built as its feature set \"{featureSet.Name}\" has " + "not been enabled. To build this project, specify the feature set name when " + "invoking NUKE."); - - originalSolution.RemoveProject(proj); } + + originalSolution.RemoveProject(proj); + } + + if (!featureSet.GenerateExclusiveSln) + { + break; + } + + var sln = ParseSolution(originalSolutionPath); + featureSetSpecificSolutions[featureSet.Name] = (sln, featureSet.RequiresDesktopMsBuild); + foreach (var removal in rm) + { + sln.RemoveProject(sln.GetProject(removal)); } } @@ -51,20 +78,28 @@ public static void ProcessSolution(Solution originalSolution, string[] featureSe Directory.CreateDirectory(slnDir); } - var filename = Path.Combine(slnDir, Path.GetRandomFileName() + ".gen.sln"); - originalSolution.SaveAs(filename); + featureSetSpecificSolutions["Core"] = (originalSolution, false); + + foreach (var (key, (sln, _)) in featureSetSpecificSolutions) + { + sln.SaveAs(Path.Combine(slnDir, key + ".gen.sln")); + } + + return featureSetSpecificSolutions; } public struct FeatureSet { public string Name { get; } public bool RequiresDesktopMsBuild { get; } + public bool GenerateExclusiveSln { get; } public string[] Projects { get; } - public FeatureSet(string name, bool requiresDesktopMsBuild, params string[] projects) + public FeatureSet(string name, bool requiresDesktopMsBuild, bool generateExclusiveSln, params string[] projects) { Name = name; RequiresDesktopMsBuild = requiresDesktopMsBuild; + GenerateExclusiveSln = generateExclusiveSln; Projects = projects; } } diff --git a/src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/Silk.NET.Windowing.Sdl.iOS.csproj b/src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/Silk.NET.Windowing.Sdl.iOS.csproj index dbd22080f7..46798c7feb 100644 --- a/src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/Silk.NET.Windowing.Sdl.iOS.csproj +++ b/src/Windowing/iOS/Silk.NET.Windowing.Sdl.iOS/Silk.NET.Windowing.Sdl.iOS.csproj @@ -1,4 +1,4 @@ - + xamarinios10 Library From ba78646f6376cb319ecab9e99116a4e9907700b3 Mon Sep 17 00:00:00 2001 From: Dylan Perks Date: Sun, 22 Aug 2021 15:20:29 +0100 Subject: [PATCH 9/9] Review fixes --- .../Silk.NET.SilkTouch/INativeContextOverride.cs | 2 +- .../NativeContextOverrideGeneration.cs | 4 ++-- .../PInvokeNativeContextOverride.cs | 13 ++++++++----- src/Core/Silk.NET.SilkTouch/OverrideContext.cs | 15 +++++++++++++++ .../Experiments/TriangleNET6/AndroidManifest.xml | 1 - 5 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 src/Core/Silk.NET.SilkTouch/OverrideContext.cs diff --git a/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs b/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs index d2bd7af89f..0878bd813b 100644 --- a/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs +++ b/src/Core/Silk.NET.SilkTouch/INativeContextOverride.cs @@ -10,6 +10,6 @@ namespace Silk.NET.SilkTouch { public interface INativeContextOverride { - TypeDeclarationSyntax Type(string name, string lib, EntryPoint[] entrypoints, Compilation comp); + TypeDeclarationSyntax Type(OverrideContext ctx); } } diff --git a/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs b/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs index cf9f9ed7f7..16fa5d8659 100644 --- a/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs +++ b/src/Core/Silk.NET.SilkTouch/NativeContextOverrideGeneration.cs @@ -52,7 +52,7 @@ Compilation comp foreach (var (attSymbol, attId, lib, @override) in overrides.OrderBy(x => x.Item2)) { var name = NameGenerator.Name($"OVERRIDE_{attId}"); - members.Add(@override.Type(name, lib, entrypoints.Where(x => x.SourceSymbol.GetAttributes() + members.Add(@override.Type(new(name, lib, entrypoints.Where(x => x.SourceSymbol.GetAttributes() .All(x2 => { if (!SymbolEqualityComparer.Default.Equals(x2.AttributeClass, excludeFromOverrideAttribute)) @@ -60,7 +60,7 @@ Compilation comp var matchId = (int) x2.ConstructorArguments[0].Value!; return matchId != attId; - })).ToArray(), comp)); + })).ToArray(), comp.SyntaxTrees?.FirstOrDefault()?.IsNet5OrGreater() ?? false))); last = IfStatement ( BinaryExpression diff --git a/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs b/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs index 30c87013ac..e83484ba2d 100644 --- a/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs +++ b/src/Core/Silk.NET.SilkTouch/NativeContextOverrides/PInvokeNativeContextOverride.cs @@ -15,9 +15,9 @@ namespace Silk.NET.SilkTouch.NativeContextOverrides public sealed class PInvokeNativeContextOverride : INativeContextOverride { /// - public TypeDeclarationSyntax Type(string name, string lib, EntryPoint[] entrypoints, Compilation comp) + public TypeDeclarationSyntax Type(OverrideContext ctx) { - var canUseCorrectCallConv = comp.SyntaxTrees.FirstOrDefault()?.IsNet5OrGreater() ?? false; + var canUseCorrectCallConv = ctx.IsNet5OrGreater; static BlockSyntax GetSlotSwitch(EntryPoint[] entrypoints, List members, bool canUseCorrectCallConv) { members.Add(NativeContextOverrideHelper.GetProcAddress); @@ -169,7 +169,10 @@ MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint, bool call AttributeArgument ( LiteralExpression - (SyntaxKind.StringLiteralExpression, Literal(lib)) + ( + SyntaxKind.StringLiteralExpression, + Literal(ctx.Library) + ) ), Token(SyntaxKind.CommaToken), AttributeArgument @@ -264,7 +267,7 @@ MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint, bool call return ret.WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); } - var v = entrypoints.Distinct(new NameComparer()).ToArray(); + var v = ctx.EntryPoints.Distinct(new NameComparer()).ToArray(); var members = new List(); members.AddRange(v.Select(x => GetMethodFromEntrypoint(x))); if (canUseCorrectCallConv) @@ -314,7 +317,7 @@ MethodDeclarationSyntax GetMethodFromEntrypoint(EntryPoint entrypoint, bool call .WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword))) .WithBody(Block()) ); - return ClassDeclaration(name) + return ClassDeclaration(ctx.Name) .WithBaseList ( BaseList diff --git a/src/Core/Silk.NET.SilkTouch/OverrideContext.cs b/src/Core/Silk.NET.SilkTouch/OverrideContext.cs new file mode 100644 index 0000000000..b4169d8eb9 --- /dev/null +++ b/src/Core/Silk.NET.SilkTouch/OverrideContext.cs @@ -0,0 +1,15 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Silk.NET.SilkTouch +{ + public readonly struct OverrideContext + { + public OverrideContext(string name, string lib, EntryPoint[] entrypoints, bool isNet5OrGreater) + => (Name, Library, EntryPoints, IsNet5OrGreater) = (name, lib, entrypoints, isNet5OrGreater); + public string Name { get; } + public string Library { get; } + public EntryPoint[] EntryPoints { get; } + public bool IsNet5OrGreater { get; } + } +} diff --git a/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml b/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml index ac8b2a6b92..88ee7e96d9 100644 --- a/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml +++ b/src/Lab/Experiments/TriangleNET6/AndroidManifest.xml @@ -11,5 +11,4 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true">
-