Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.0] Windowing Rewrite #2278

Merged
merged 164 commits into from
Feb 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
164 commits
Select commit Hold shift + click to select a range
7e32758
Initial group codegen
Perksey Apr 6, 2024
e53716f
Fix some trimming oddities
Perksey Apr 6, 2024
67ed5ae
Fix HintTargetPGI and others similarly situated
Perksey Apr 6, 2024
678dc6e
Base typing and namespacing
Perksey Apr 7, 2024
52e401a
Cast enum members, fix stray semicolons, Silk.NET.OpenGL builds again
Perksey Apr 8, 2024
5219292
Group and bool transformations
Perksey Apr 21, 2024
710fa56
Fix erroneous cast order
Perksey Apr 23, 2024
ea85042
Add Delete(singular) overloads (ArrayParameterOverloader)
Perksey Apr 23, 2024
4376388
Add SAL object model & Khronos length metadata parsing
Perksey May 3, 2024
3214433
ArrayParameterTransformer w/ tests
Perksey May 10, 2024
220afd0
Integrate ArrayParameterTransformer
Perksey May 10, 2024
7eec321
Merge branch 'develop/3.0' into feature/opengl-codegen
Perksey May 15, 2024
4450085
Support SupportedApiProfileAttribute generation with metadata
Perksey May 21, 2024
d523e37
PrettifyNames conflict resolution now actually works
Perksey May 21, 2024
90da556
Fix casting transformation ambiguity bugs
Perksey May 23, 2024
4f85362
Fix metadata retrieval for reserved identifiers
Perksey May 23, 2024
110a782
Merge branch 'feature/opengl-codegen' of https://github.com/dotnet/Si…
Perksey May 23, 2024
24343a8
Fix unit tests
Perksey May 23, 2024
ba1f9c4
Fixup for all caps names
Perksey May 24, 2024
37637f5
Fix naive trimming bug
Perksey May 24, 2024
5eca8c3
More self-review comments
Perksey May 24, 2024
e2ff544
SDL bindings
Perksey May 31, 2024
9f36ade
Merge attempt 2
Perksey May 31, 2024
261ddd8
Merge branch 'feature/sdl-bindings' of https://github.com/dotnet/Silk…
Perksey May 31, 2024
6298422
Fix naming regression
Perksey May 31, 2024
58561c8
Prettify & extract the nested _e__{Union,Struct,FixedBuffer} structs
Perksey Jun 3, 2024
8d7af55
Function pointer generation
Perksey Jun 6, 2024
0fb7e09
Add a second pass to name delegates based on usage!
Perksey Jun 6, 2024
384453b
Fixes from self-review
Perksey Jun 9, 2024
56af8e1
Windowing 3.0 Iteration 1 with Dependency Injection - scrapped
Perksey Jul 22, 2024
8bfba2b
WIP Windowing 3.0 for real this time
Perksey Aug 31, 2024
e01289e
Some more work
Perksey Sep 6, 2024
a76c488
Rejig the repo structure
Perksey Sep 7, 2024
9cf86ba
Save progress, as I am deleting the progress
Perksey Sep 12, 2024
f61ccce
Create a Roslyn compilation & workspace
Perksey Oct 2, 2024
570c24c
Merge branch 'feature/silktouch-3.0-fit-for-future' into HEAD
Perksey Oct 2, 2024
851f85b
Bugfixes, generation runs with renaming but is slow and outputs wrong
Perksey Oct 2, 2024
05a0f69
Some more bugfixes
Perksey Oct 2, 2024
79af236
Fix mods not saving outputs, unnecessary subdirs, filenames, and othe…
Perksey Oct 3, 2024
663f520
Add IResponseFileMod, fix EntryPoint not in DllImport, and other fixe…
Perksey Oct 3, 2024
59f6fe8
Delete some stray files
Perksey Oct 3, 2024
116d08e
Minor nits
Perksey Oct 3, 2024
1ba1315
Initial commit of the SymbolFinder rename experiment
Perksey Oct 5, 2024
938d8a9
This is the new renamer
Perksey Oct 6, 2024
789d244
Fix ctors and dtors, stop using `using static`s
Perksey Oct 6, 2024
e31c725
Regenerate bindings
Perksey Oct 6, 2024
e6f2cf3
Use public Roslyn APIs and parallelise
Perksey Oct 7, 2024
d86a14c
Sync with #2288
Perksey Oct 7, 2024
a041dfb
Merge branch 'develop/3.0' of https://github.com/dotnet/Silk.NET into…
Perksey Oct 11, 2024
129d495
Fix buidl
Perksey Oct 11, 2024
5224e0b
Add ISurfaceProvider
Perksey Oct 13, 2024
bd91c25
Add a write-up on the PAL HLU concepts/status for the future
Perksey Oct 16, 2024
2295ce6
Remove the hosting API
Perksey Oct 16, 2024
0e760e6
Start on a more clean sheet and conservative implementation
Perksey Nov 13, 2024
40ce1a2
Separate files
Perksey Nov 13, 2024
df88e68
Lay out impl, add new APIs from proposal
Perksey Nov 14, 2024
b18eebc
Add a Utf8String helper type, and transform string constants to use it
Perksey Nov 15, 2024
a7c35a0
Move bakery functionality into a mod separate from SupportedApiProfiles
Perksey Nov 16, 2024
5606e93
Rename GetTypeDeclaration to BakeMember
Perksey Nov 17, 2024
fbc0edd
Cache the result of function pointer loading
Perksey Nov 17, 2024
9d1ba99
Merge branch 'develop/3.0' into feature/misc-improv-3.0
Perksey Nov 18, 2024
f6f625f
Fix vulnerability?
Perksey Nov 18, 2024
74ddf75
Merge branch 'feature/misc-improv-3.0' of https://github.com/dotnet/S…
Perksey Nov 18, 2024
ed097fb
Merge branch 'feature/misc-improv-3.0' into feature/windowing-3.0
Perksey Nov 18, 2024
19a29a8
Recognise some #define enums, improve pfn type gen, update SDL, more …
Perksey Nov 21, 2024
202b315
Update ClangSharp (with no changes!!!!1111!1!!!111 :tada:)
Perksey Nov 21, 2024
df2ba9e
Commit cache files too
Perksey Nov 21, 2024
4fadfd8
Merge branch 'feature/misc-improv-3.0' into feature/windowing-3.0
Perksey Nov 21, 2024
67619a3
Add SDL_gpu (and other missing headers such as SDL_vulkan)
Perksey Nov 21, 2024
689ed33
Check-in rsp changes, add namespace for windowing, add SDL_main bindings
Perksey Nov 21, 2024
910fc7c
Work on more of the implementation
Perksey Dec 2, 2024
0bd60d8
Add SDL_stdinc bindings (for SDL_free...)
Perksey Dec 2, 2024
34aa1c0
Triangle with Silk.NET.Windowing 3.0
Perksey Dec 5, 2024
bd202f6
Implement all APIs
Perksey Dec 7, 2024
782f384
Wire up all relevant events
Perksey Dec 7, 2024
0c43395
Sweep a macOS deficiency under the rug
Perksey Dec 7, 2024
19b3f80
Apply initial configuration, surprisingly little code...
Perksey Dec 8, 2024
d82c775
Initial work on native build workflow
Perksey Dec 20, 2024
d202213
Stop using YAML for GITHUB_OUTPUT
Perksey Dec 21, 2024
4a48a70
Add GH_TOKEN env var to stage2
Perksey Dec 21, 2024
4324a39
Use an action for comment writing instead
Perksey Dec 21, 2024
a4f65f0
Fix permissions, try to fix expr issue
Perksey Dec 21, 2024
8dbb8a4
Same again
Perksey Dec 21, 2024
6ad84f0
Fix PR comment location
Perksey Dec 21, 2024
ecb5b94
Replace the comment rather than append to it
Perksey Dec 21, 2024
eafcc9d
Start of native build job
Perksey Dec 21, 2024
775be50
Attempt to fix matrix
Perksey Dec 21, 2024
cdd18d3
Add a job name, fix build script permissions issues
Perksey Dec 21, 2024
1fcbfe4
Add OSX build for SDL
Perksey Dec 21, 2024
88148c5
Start of commit job
Perksey Dec 21, 2024
3612345
Add missing checkout
Perksey Dec 21, 2024
5a17532
Use official action to checkout PR
Perksey Dec 21, 2024
40d0a32
Fix permissions issues
Perksey Dec 21, 2024
22af898
Update native binaries for bc824234847be3635913331b0f6fca1c7fc3c982
dotnet-bot Dec 21, 2024
063df43
Start of linux-x64 SDL build
Perksey Dec 21, 2024
ac52bbb
Sudo for apt
Perksey Dec 21, 2024
4710f9a
apt-get update
Perksey Dec 21, 2024
609bb99
Checkout submodule
Perksey Dec 21, 2024
ece2459
Fix path error
Perksey Dec 21, 2024
092d3be
Update native binaries for ece24590373710ff14b68c30800d7091f1a65d9a
dotnet-bot Dec 21, 2024
8573423
Add linux-arm and linux-arm64
Perksey Dec 21, 2024
3e3df2c
Use glibc 2.34 on linux-arm for Y2038 support
Perksey Dec 21, 2024
92b5bf4
Update native binaries for 3e3df2ca0b8424b3805d53db44fda1ccb976c387
dotnet-bot Dec 21, 2024
68abcc9
Add win-arm, win-arm64, win-x64
Perksey Dec 21, 2024
f46df63
Fix dir structure
Perksey Dec 21, 2024
8577e7b
Attempt to keep win-arm support, may be on the chopping block though
Perksey Dec 21, 2024
934ec01
Fix batch script error
Perksey Dec 21, 2024
7bb3e4d
Use curl instead of wget?
Perksey Dec 21, 2024
7919b67
Fix winsdk install?
Perksey Dec 21, 2024
0815e4c
Remove 32-bit Windows on Arm support
Perksey Dec 21, 2024
230123d
Use a Microsoft Developer Command Prompt
Perksey Dec 21, 2024
dc58874
Fix vcvarsall path
Perksey Dec 21, 2024
601bb66
Use Ninja - libsdl-org/SDL##11487
Perksey Dec 21, 2024
ec88886
Update native binaries for 601bb669523a67cd2f7650b2df01a3f3c935b10c
dotnet-bot Dec 21, 2024
aa29dc3
Fix artifact download path
Perksey Dec 21, 2024
4630438
Fix the fix
Perksey Dec 24, 2024
cf89f08
Update native binaries for 4630438977fe234017171daa18258b989c222bff
dotnet-bot Dec 24, 2024
b20e415
Add iOS and tvOS for SDL
Perksey Dec 24, 2024
7e827f8
Merge branch 'feature/natives-3.0' of https://github.com/dotnet/Silk.…
Perksey Dec 24, 2024
45f36d0
Fix file permissions
Perksey Dec 24, 2024
dde8e23
Update native binaries for 45f36d05463ee8dd7462ecb904d519253348f475
dotnet-bot Dec 24, 2024
1071026
Add Android build for SDL
Perksey Dec 27, 2024
e006e0a
Apparently sdkmanager is not in PATH
Perksey Dec 27, 2024
cd73ccb
Install Python 3.11
Perksey Dec 27, 2024
d7d3c69
Install Ninja
Perksey Dec 27, 2024
addb3da
Update native binaries for d7d3c696e56cfc8862c3e7ed8f09c3e7b375a7ae
dotnet-bot Dec 27, 2024
cb3e44c
Try to ungitignore the Android jar
Perksey Dec 27, 2024
f79ad90
Merge branch 'feature/natives-3.0' of https://github.com/dotnet/Silk.…
Perksey Dec 27, 2024
2243bfe
Update native binaries for f79ad90e3b32074ddf8f22056cea149303f0acb2
dotnet-bot Dec 27, 2024
b26f378
Add an easy update script
Perksey Dec 27, 2024
917d412
Merge branch 'feature/natives-3.0' of https://github.com/dotnet/Silk.…
Perksey Dec 27, 2024
8cf95c2
Include org.libsdl.app bindings with the aar, working package now
Perksey Dec 28, 2024
48221ff
Update native binaries for 8cf95c218c6070c2a47b9b2b833a49e03b04656f
dotnet-bot Dec 28, 2024
4a47ce0
Some cleanup, and add docs
Perksey Dec 28, 2024
c5bdec1
Merge branch 'feature/natives-3.0' of https://github.com/dotnet/Silk.…
Perksey Dec 28, 2024
ceca47d
Fix build
Perksey Dec 28, 2024
186f907
Install workloads in test too
Perksey Dec 28, 2024
de163dc
Update native binaries for 186f9079270c7481a62a6076d2f0ba9a63e7f1ef
dotnet-bot Dec 28, 2024
b85b05d
Fix build (not ideally)
Perksey Dec 28, 2024
44b9933
Merge branch 'feature/natives-3.0' of https://github.com/dotnet/Silk.…
Perksey Dec 28, 2024
7a761c7
Update native binaries for 44b99335a2a9a09df42feeb3f829808c99896e09
dotnet-bot Dec 28, 2024
496aed4
Dummy commit to run Test/Build again
Perksey Dec 28, 2024
eccb9a6
Merge branch 'feature/natives-3.0' of https://github.com/dotnet/Silk.…
Perksey Dec 28, 2024
3976598
Merge branch 'feature/natives-3.0' into feature/windowing-3.0
Perksey Dec 28, 2024
e61e2f8
Remove old code
Perksey Dec 28, 2024
f2e9a93
Fix it
Perksey Dec 28, 2024
eb1a920
Stop downloading previews?
Perksey Dec 28, 2024
cee9fe4
Add dependency to native package for SDL
Perksey Dec 28, 2024
ab30f75
Fix build
Perksey Dec 28, 2024
3beeabc
Only duplicate the VersionSuffix for natives
Perksey Dec 28, 2024
2140d38
Merge branch 'feature/natives-3.0' into feature/windowing-3.0
Perksey Dec 28, 2024
7fe88dd
Add SilkActivity
Perksey Dec 30, 2024
cd866cb
WG comments
Perksey Jan 26, 2025
43a41a9
Pull dev
Perksey Jan 27, 2025
2244e60
Fix build?
Perksey Jan 27, 2025
f0aceeb
More build fix attempts
Perksey Jan 27, 2025
79e5cd2
Use the condition guards for xplat builds
Perksey Feb 2, 2025
11ceb11
Merge branch 'develop/3.0' into feature/windowing-3.0
Perksey Feb 2, 2025
94647c1
Fix csproj
Perksey Feb 2, 2025
9bb6569
Clear locals to try and fix weird .NET SDK bug
Perksey Feb 2, 2025
52153ab
Add workaround from dotnet/maui#27215
Perksey Feb 2, 2025
5816b63
Fixes from self review
Perksey Feb 2, 2025
b1b9c0e
Rectify remaining self-review comments
Perksey Feb 8, 2025
22e2a5f
nit
Perksey Feb 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*.sln text eol=lf
*.targets text eol=lf
*.yml text eol=lf
*.hlsl text eof=lf

###############################################################################
# Set explicit file behavior to:
Expand Down Expand Up @@ -53,10 +54,35 @@
*.7z binary
*.ttf binary
*.stout binary
*.p7s binary
*.sample binary
*.nupkg binary
*.exe binary
*.idx binary
*.pack binary
*.spv binary
*.lib binary
*.dylib binary
*.so binary
*.dll binary
*.dylib binary
*.xcscheme binary
*.xcworkspacedata binary
*.pdf binary
*.pfx binary
*.metal binary
*.jar binary
*.apk binary
*.aar binary
*.aidl binary
*.flata binary
*.metallib binary
*.items binary
*.stamp binary
*.icns binary
*.mdb binary
*.pdb binary
*.bmp binary
*.dat binary

# Verify
*.verified.txt text eol=lf working-tree-encoding=UTF-8
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/publish-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,15 @@ jobs:
Build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Setup .NET 8
uses: actions/setup-dotnet@v3
with:
dotnet-version: '8.0.x'
- name: Setup .NET 9
uses: actions/setup-dotnet@v3
with:
dotnet-version: '9.0.102'
- name: Build Website
run: |
git submodule update --init eng/submodules/silk.net-2.x
Expand Down
Binary file removed .silktouch/0afb5dc84012c2fa.stout
Binary file not shown.
Binary file added .silktouch/91c9aa14a031651f.stout
Binary file not shown.
Binary file modified .silktouch/c8c046b328b09d23.stout
Binary file not shown.
1 change: 1 addition & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
<PackageVersionDependsOn>SilkShippingControl;$(PackageVersionDependsOn)</PackageVersionDependsOn>
<TargetsForTfmSpecificContentInPackage>SilkNativePackaging;$(TargetsForTfmSpecificContentInPackage)</TargetsForTfmSpecificContentInPackage>
<GenerateNuspecDependsOn>SilkShippingControl;$(GenerateNuspecDependsOn)</GenerateNuspecDependsOn>
<UseMonoRuntime>false</UseMonoRuntime>
</PropertyGroup>

<!-- SourceLink -->
Expand Down
3 changes: 3 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
<PackageVersion Include="Fody" Version="6.8.2" PrivateAssets="all" />
<PackageVersion Include="InlineIL.Fody" Version="1.9.0" PrivateAssets="all" />

<!-- Analyzers -->
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />

<!-- SilkTouch -->
<PackageVersion Include="ClangSharp.PInvokeGenerator" Version="18.1.0.2" />
<PackageVersion Include="CSharpier.Core" Version="0.30.2" />
Expand Down
11 changes: 11 additions & 0 deletions Silk.NET.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
LICENSE.md = LICENSE.md
generator.json = generator.json
Silk.NET.sln.DotSettings = Silk.NET.sln.DotSettings
Directory.Packages.props = Directory.Packages.props
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{9DB0EA3E-7216-4F9C-98F5-8A7483E9F083}"
Expand Down Expand Up @@ -97,6 +98,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Win32", "Win32", "{6E739132
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.SDL.Native", "sources\SDL\Native\Silk.NET.SDL.Native.csproj", "{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Windowing", "Windowing", "{FE4414F8-5370-445D-9F24-C3AD3223F299}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.Windowing", "sources\Windowing\Windowing\Silk.NET.Windowing.csproj", "{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -159,6 +164,10 @@ Global
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6}.Release|Any CPU.Build.0 = Release|Any CPU
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -189,6 +198,8 @@ Global
{6FA628B8-9696-4847-89F9-E58F470AF4FB} = {5CD096DB-6C44-48F1-9093-AD4C84B6B7EC}
{6E739132-EEAB-43A5-83C7-EB58C50D03A1} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{F16C0AB9-DE7E-4C09-9EE9-DAA8B8E935A6} = {EC4D7B06-D277-4411-BD7B-71A6D37683F0}
{FE4414F8-5370-445D-9F24-C3AD3223F299} = {DD29EA8F-B1A6-45AA-8D2E-B38DA56D9EF6}
{EF07CBB5-D253-4CA9-A5DA-8B3DF2B0DF8E} = {FE4414F8-5370-445D-9F24-C3AD3223F299}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {78D2CF6A-60A1-43E3-837B-00B73C9DA384}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# The Event Pump

The largest influence in the `ISurfaceApplication` design is the fact that for many platforms only the entry thread is
allowed to interact with the window manager (e.g. for the purposes of events). This creates a problem because rendering
is very much not single-threaded, nor are most use cases where the user has multiple windows. As such,
`ISurfaceApplication` gives the implementation freedom to decide what the most appropriate thread is to call into the
surface to raise events. This is further emphasised by the definition of `ISurfaceChildren` where the user can only
`Spawn` a surface, and not have a blocking call they can send off to their own thread. This allows the child windows to
use the same event thread and synchronization. This is likely inconvenient for rendering scenarios though
(e.g. for OpenGL where it's one thread per context/window, but all surfaces use the same thread by default...), for
which I expect that we'll add the ability to multithread for certain events in `SurfaceTimingOptions` or
`SurfaceTickOptions`. This however has been excluded from the initial 3.0 proposal.

Note that `SDL_AppEvent` is only guaranteed to be called on the event thread for events raised by the window
manager/operating system. As such, we always assume that those events are on the event thread when received and invoke
the window directly. For other events, we should be wary of concurrency. Note that I have absolutely no idea what this
means for things like our `Surface.Continue` method for `IsEventDriven` - right now this isn't implemented. Read more
here: https://github.com/libsdl-org/SDL/issues/11387
32 changes: 32 additions & 0 deletions docs/for-contributors/Windowing/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Silk.NET.Windowing

Silk.NET.Windowing is our cross-platform windowing abstraction. For more information about what it is, see the [proposal](../../proposals/Proposal%20-%20Windowing%203.0.md).

As per the proposal, Windowing is implemented in exactly one project/assembly containing the abstractions and one
"reference implementation" given available target information (e.g. TFM). Today, this includes:
- SDL3, used for every platform.

If the user doesn't want to use our reference implementation, it is expected that they use the trimmer to make its
presence benign.

Note that for each "reference implementation" it is expected that there shall be a matching Silk.NET.Input "reference
implementation" capable of receiving an `INativeWindow` from the Silk.NET.Windowing implementation in use. How you
interpret this requirement is up to you, e.g. we could have a Silk.NET.Input Win32-specific implementation that uses
`Win32PlatformInfo` for our SDL3 surface, likewise we could have a Silk.NET.Input SDL3 implementation that receives a
`Win32PlatformInfo` from a Silk.NET.Windowing implementation and automatically creates a wrapping window - this is up to
you (but try to keep it sane please, that last one sounded extremely cursed). Ultimately, the goal is the user being
able to pull in `Silk.NET.Windowing` and `Silk.NET.Input`, create a surface, be able to do `surface.CreateInput()` and
it all Just Work. Right now, this equates to a 1:1 match of Silk.NET.Windowing/Silk.NET.Input implementations, and is
not expected to change.

Silk.NET.Input is completely independent from Silk.NET.Windowing this time around, unlike 1.X/2.X. This is because we
believe the Input HLU can target wider applicability beyond just receiving input for a window, with VR being the
principal use case in mind when making this decision. For more information, read the [Multi-Backend Input proposal](../../proposals/Proposal%20-%20Multi-Backend%20Input.md).

Most of the files within the top-level Windowing directory are exactly as proposed. The exception is the `Surface`
class, which seeks to make as much common as humanly possible (this includes the Render/Update timing logic and some
other auxiliary functions). Beyond that, this is functionally an interface. The actual entry-points into the Windowing
API, `ISurfaceApplication.Run` and `IDetachedSurfaceLifecycle.TryCreate`, are defined `partial`ly with matching
implementation parts in the `Implementations` subdirectories.

To find out more about the implementation details, see the `Implementations` directory.
87 changes: 87 additions & 0 deletions docs/for-contributors/Windowing/future-improvements.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Future Improvements

Initially when we were having design discussions around Silk.NET 3.0's Windowing API, we wanted to introduce a
lower-level API upon which our high-level API. The idea being that this would be an extensible API for which there would
be lower implementation friction and delegating common boilerplate code to a common higher-level implementation i.e.
there's very little work for us to do in mapping our API into new backends. This would functionally be a PAL, but the
details of this would depend on the actual requirements we derive as part of designing this API. Ultimately it was
determined that this work was simply out-of-scope for the initial 3.0 release as the extensibility benefits emerging
from having a lower-level API was determined to not be a requirement for the initial release, and was not included in
the original Working Group approved software development plan.

We're well aware this sounds very similar to what our friends at OpenTK are planning for 5.0, for much of the same
reasons. Indeed we still have community members who are also OpenTK community members that were advocating for it for
this reason. It's great to consider this sort of prior art, the sharing of insights and lifting eachother up is what
makes open-source amazing after all. We should also consider how other libraries like SDL and GLFW handle this
internally. Much like OpenTK, there is motivation for adding a lower-level API to Silk.NET to reduce the implementation
friction in adding more windowing backends as we believe esoteric platforms like mobile could be served well by them.
Unlike OpenTK, for desktop there's less appetite due to the shear number of platforms that would cause a lot of
maintenance effort - OpenTK 4.0 moved to use GLFW because of this, and most of the issues logged before this were
regarding its per-platform custom implementations, whereas Silk.NET 3.0 is keen to optimise for maintainability and
delegating maintenance effort to more expert sources (as we have done for SilkTouch by using ClangSharp's P/Invoke
Generator) like SDL is part of this so we can focus on crafting the best user experience specific to our project. Hence
why even if we would add this lower-level API, unlike OpenTK 5.0 I don't think we'd use it to implement desktop
windowing ourselves. But that can change after the initial release, and in any case having this lower-level API would be
useful.

When reviewing OpenTK specifically, their API design is indeed sound however the mechanisms by which it was exposed to
the higher-level API left a lot to be desired. Namely, using a dictionary of enums to implementations did not feel like
the best way to do this. There are likely more intelligent things we can do with the type system to make these patterns
more JIT friendly and also more extensible - having an enum enumerating the component types requires the extensibility
model to be defined in a way that is contrary to how the type system works e.g. to define components that are extensions
beyond our standard set. It was also deemed to be desirable to use `static abstract`s for this sort of low-level API,
which does help towards JIT friendliness, but this needn't prejudice any future efforts towards these goals - this was
just an idea.

Ultimately, to make our solution more write-once-run-everywhere, the API design philosophy behind the `Surface`
type was primarily to make it seem like a modular "component bag" e.g. `window.OpenGL` for OpenGL-specific
functionality, rather than having specific APIs always exposed as part of the standard interface but only valid for
usage in specific circumstances. The `IView` separation in 2.X achieved what we wanted somewhat, but this again left a
lot to be desired given that writing against `IView` instead of `IWindow` is contrary to what most users were doing
(this is also likely a symptom of being an afterthought introduced quite late into the 1.0 Preview cycle). By using this
design philosophy, our users have to get used to not assuming that functionality is available, meaning that users are
encouraged to write in a way that is portable instead of them having to go out of their way by writing against `IView`
as in 1.X and 2.X.

As for the extensibility goals (i.e. additional components being defined on top of our standard API), my hope was to
eventually have a `GetComponent` API on `Surface` which things like `window.OpenGL` were defined on top of. This has
been excluded from the 3.0 initial release, but we could in theory add something like this without the PAL concepts in
this document being implemented - a component-based architecture for our high-level API and a component-based
architecture for our low-level API can be developed independently. An example of why we might want this is a virtual
reality extension that manages the creation of OpenXR bindings from a surface, but this is just one example. It is
possible that "extension everything" might make this easier on the user while also making it easier for us (e.g.
extension everything defining an `window.OpenXR` property that implicitly checks the component can be created or
whatever, `DependentHandle` can probably used for this if we wanted or we could just use `window is IMyComponent` -
again these are all just ideas, this is just to demonstrate the idea of the API shape). Way earlier in 3.0's development
we were discussing the use of `IDynamicInterfaceCastable`, but the Silk.NET team were not able to implement support for
this in the Mono runtime in an acceptable timeframe and complexity level. All of these details depend on how and if we
make it possible to attach components to existing implementations without requiring modification of the original
backend. I would quite like this to be the case, but again it depends on the nature of the high-level component-based
architecture and/or the low-level component-based architecture i.e. where is the extensibility point.

As much as we didn't continue down the path illustrated in this document, it was certainly explored somewhat before we
decided it wasn't needed for 3.0 (engineers like to overengineer, go figure). The first exploration was essentially a
static dependency injection API i.e. a [`IHluComponentRegistry`](https://github.com/dotnet/Silk.NET/blob/56af8e1b34dc41a43de10dff45d09d25f12e8e57/sources/Core/Core/Abstractions/IHluComponentRegistry.cs)
provides components (these can be changed together for extensibility) that configures a [`Surface`](https://github.com/dotnet/Silk.NET/blob/56af8e1b34dc41a43de10dff45d09d25f12e8e57/sources/Windowing/Common/Surface.cs)
(well, a [`IHluComponentHost`](https://github.com/dotnet/Silk.NET/blob/56af8e1b34dc41a43de10dff45d09d25f12e8e57/sources/Core/Core/Abstractions/IHluComponentHost.cs)
which `Surface` implements) with the components. There was also some [source generator magic](https://github.com/dotnet/Silk.NET/blob/56af8e1b34dc41a43de10dff45d09d25f12e8e57/sources/Core/Analyzers/HluSourceGenerator.Hosts.cs)
explored to make this more JIT friendly, but that itself had some downsides e.g. one object being an implementation type
of multiple component types had two references stored in the surface. These problems aren't insurmountable but
ultimately it was determined that making an entire dependency injection API just for this was a bit silly.

After this attempt at implementing these concepts, another attempt was made that encompassed the low-level API desired
to reduce implementation friction. Essentially, [`ISurfaceHost`](https://github.com/dotnet/Silk.NET/blob/129d4957ce1058252723add2f6890fb53f234432/sources/Windowing/Common/Hosting/ISurfaceHost.cs)
had a bunch of lower-level APIs as `static abstract`s that essentially boiled down to "get a property, set a property"
on surface objects or surface requests. Didn't quite get round to implementing the "additional component" extensibility
concepts described but this could likely be done using type chaining and essentially changing those get/set property
methods to accept a generic "property type", but again these are just ideas - this was never realised or prototyped.
This was progressing well enough, and had some decent benefits as well like centralising all the [multi-threading logic](https://github.com/dotnet/Silk.NET/blob/129d4957ce1058252723add2f6890fb53f234432/sources/Windowing/Common/Hosting/MultiThreadedSurfaceHost%601.cs)
at the lowest level of implementation.

All in all, there's a lot of benefits to having a modular, component-based, and extensible approach to designing our
windowing API and this is definitely something we're keen to pursue. But for now, we determined that for the 3.0 initial
release we only needed to do this for the user-facing API (as per the goals stated in the SDP to make the API more
encouraging of write-once-run-everywhere) and as much as we want to fulfill that `GetComponent` extensibility vision to
allow extensions of our standard API set, that also isn't needed for the initial release. Nonetheless, it was key to
ensure we had enough jumping off points to ensure this can be implemented in the future, and also to implement the
lower-level, implementation-facing API to make our life easier if we did want to add more backends outside of SDL.
8 changes: 8 additions & 0 deletions eng/silktouch/sdl/SDL3/generate.rsp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ SDL_memmove
SDL_memset
SDL_BeginThreadFunction
SDL_EndThreadFunction
SDL_fabsf
SDL_size_add_check_overflow_builtin
SDL_size_mul_check_overflow_builtin
--file
sdl-SDL.h
--methodClassName
Expand All @@ -32,6 +35,7 @@ Silk.NET.SDL
../../../submodules/sdl/include/SDL3/SDL_events.h
../../../submodules/sdl/include/SDL3/SDL_filesystem.h
../../../submodules/sdl/include/SDL3/SDL_gamepad.h
../../../submodules/sdl/include/SDL3/SDL_gpu.h
../../../submodules/sdl/include/SDL3/SDL_guid.h
../../../submodules/sdl/include/SDL3/SDL_haptic.h
../../../submodules/sdl/include/SDL3/SDL_hidapi.h
Expand All @@ -45,6 +49,7 @@ Silk.NET.SDL
../../../submodules/sdl/include/SDL3/SDL_locale.h
../../../submodules/sdl/include/SDL3/SDL_log.h
../../../submodules/sdl/include/SDL3/SDL_messagebox.h
../../../submodules/sdl/include/SDL3/SDL_main.h
../../../submodules/sdl/include/SDL3/SDL_metal.h
../../../submodules/sdl/include/SDL3/SDL_misc.h
../../../submodules/sdl/include/SDL3/SDL_mouse.h
Expand All @@ -53,11 +58,13 @@ Silk.NET.SDL
../../../submodules/sdl/include/SDL3/SDL_pixels.h
../../../submodules/sdl/include/SDL3/SDL_platform.h
../../../submodules/sdl/include/SDL3/SDL_power.h
../../../submodules/sdl/include/SDL3/SDL_process.h
../../../submodules/sdl/include/SDL3/SDL_properties.h
../../../submodules/sdl/include/SDL3/SDL_rect.h
../../../submodules/sdl/include/SDL3/SDL_render.h
../../../submodules/sdl/include/SDL3/SDL_scancode.h
../../../submodules/sdl/include/SDL3/SDL_sensor.h
../../../submodules/sdl/include/SDL3/SDL_stdinc.h
../../../submodules/sdl/include/SDL3/SDL_storage.h
../../../submodules/sdl/include/SDL3/SDL_surface.h
../../../submodules/sdl/include/SDL3/SDL_system.h
Expand All @@ -67,3 +74,4 @@ Silk.NET.SDL
../../../submodules/sdl/include/SDL3/SDL_touch.h
../../../submodules/sdl/include/SDL3/SDL_version.h
../../../submodules/sdl/include/SDL3/SDL_video.h
../../../submodules/sdl/include/SDL3/SDL_vulkan.h
2 changes: 2 additions & 0 deletions eng/silktouch/sdl/SDL3/sdl-SDL.h
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3/SDL_vulkan.h>
4 changes: 4 additions & 0 deletions eng/silktouch/sdl/remap.rsp
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
--remap
SDL_fabsf=float.Abs
VkSurfaceKHR=ulong
VkInstance=void*
VkPhysicalDevice=ulong
VkAllocationCallbacks=void
Loading
Loading