Skip to content

Commit c42673d

Browse files
[PAID BOUNTY] A shared base for public and console repos (#8309)
This is a shared native base for future platform work in MonoGame. See #8242 The implementation is now finished and we're looking for final feedback before we merge things. - ~~C# to C++ wrapper generator.~~ - ~~C# native wrapper.~~ - ~~Windows VK setup.~~ - ~~C++ native wrapper.~~ - ~~SDL native backend.~~ - ~~Vulkan rendering backend.~~ - ~~Input native backend.~~ - ~~WindowsVK unit tests.~~ - ~~Sound API stubs~~ --------- Co-authored-by: harry.cpp <[email protected]>
1 parent d44ed76 commit c42673d

File tree

186 files changed

+24235
-2203
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

186 files changed

+24235
-2203
lines changed

Diff for: .github/workflows/main.yml

+15
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,27 @@ jobs:
2121
with:
2222
dotnet-version: '8.0.x'
2323

24+
- name: Add msbuild to PATH
25+
if: runner.os == 'Windows'
26+
uses: microsoft/[email protected]
27+
28+
- name: Setup Premake5
29+
uses: abel0b/[email protected]
30+
with:
31+
version: "5.0.0-beta2"
32+
2433
- name: Setup Java
2534
uses: actions/setup-java@v4
2635
with:
2736
distribution: 'microsoft'
2837
java-version: '17'
2938

39+
- name: Install Vulkan SDK
40+
uses: humbletim/[email protected]
41+
with:
42+
version: 1.3.283.0
43+
cache: true
44+
3045
- name: Disable annotations
3146
run: echo "::remove-matcher owner=csc::"
3247

Diff for: .gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,9 @@ IDE/MonoDevelop/MonoDevelop.MonoGame/templates/Common/MonoGame.Framework.dll.con
8989
# CAKE
9090
.cake/**
9191

92+
# Xmake
93+
.xmake
94+
vsxmake2022
95+
9296
# docfx
9397
_*

Diff for: .gitmodules

+12
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,15 @@
1010
[submodule "ThirdParty/StbImageWriteSharp"]
1111
path = ThirdParty/StbImageWriteSharp
1212
url = https://github.com/StbSharp/StbImageWriteSharp.git
13+
[submodule "src/monogame/external/sdl2"]
14+
path = native/monogame/external/sdl2
15+
url = https://github.com/MonoGame/MonoGame.Library.SDL.git
16+
[submodule "src/monogame/external/vulkan-headers"]
17+
path = native/monogame/external/vulkan-headers
18+
url = https://github.com/KhronosGroup/Vulkan-Headers.git
19+
[submodule "src/monogame/external/volk"]
20+
path = native/monogame/external/volk
21+
url = https://github.com/zeux/volk.git
22+
[submodule "src/monogame/external/vma"]
23+
path = native/monogame/external/vma
24+
url = https://github.com/LunarG/VulkanMemoryAllocator.git

Diff for: .vscode/launch.json

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@
44
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
66
"configurations": [
7+
{
8+
"name": "Generator: CTypes",
9+
"type": "coreclr",
10+
"request": "launch",
11+
"preLaunchTask": "generator-ctypes",
12+
"program": "${workspaceFolder}/Tools/MonoGame.Generator.CTypes/bin/Debug/net8.0/MonoGame.Generator.CTypes",
13+
"args": [],
14+
"cwd": "${workspaceFolder}/Tools/MonoGame.Generator.CTypes/bin/Debug/net8.0",
15+
"console": "internalConsole",
16+
"stopAtEntry": false
17+
},
718
{
819
"name": "MGCB Editor (Mac)",
920
"type": "coreclr",

Diff for: .vscode/tasks.json

+12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@
2424
"/consoleloggerparameters:NoSummary"
2525
],
2626
"problemMatcher": "$msCompile"
27+
},
28+
{
29+
"label": "generator-ctypes",
30+
"command": "dotnet",
31+
"type": "process",
32+
"args": [
33+
"build",
34+
"${workspaceFolder}/Tools/MonoGame.Generator.CTypes/MonoGame.Generator.CTypes.csproj",
35+
"/property:GenerateFullPaths=true",
36+
"/consoleloggerparameters:NoSummary"
37+
],
38+
"problemMatcher": "$msCompile"
2739
}
2840
]
2941
}

Diff for: MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public override bool Supports(TargetPlatform platform)
1515
{
1616
return platform == TargetPlatform.Android ||
1717
platform == TargetPlatform.DesktopGL ||
18+
platform == TargetPlatform.DesktopVK ||
1819
platform == TargetPlatform.MacOSX ||
1920
platform == TargetPlatform.NativeClient ||
2021
platform == TargetPlatform.RaspberryPi ||
@@ -64,6 +65,7 @@ private static TextureProcessorOutputFormat GetTextureFormatForPlatform(TextureP
6465
}
6566
else if (platform == TargetPlatform.Windows ||
6667
platform == TargetPlatform.DesktopGL ||
68+
platform == TargetPlatform.DesktopVK ||
6769
platform == TargetPlatform.MacOSX ||
6870
platform == TargetPlatform.NativeClient ||
6971
platform == TargetPlatform.Web)

Diff for: MonoGame.Framework.Content.Pipeline/Processors/EffectProcessor.cs

+2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ private string GetProfileForPlatform(TargetPlatform platform)
9595
case TargetPlatform.RaspberryPi:
9696
case TargetPlatform.Web:
9797
return "OpenGL";
98+
case TargetPlatform.DesktopVK:
99+
return "Vulkan";
98100
}
99101

100102
return platform.ToString();

Diff for: MonoGame.Framework.Content.Pipeline/Serialization/Compiler/ContentWriter.cs

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public sealed class ContentWriter : BinaryWriter
5454
'O', // XboxOne
5555
'S', // Nintendo Switch
5656
'b', // WebAssembly and Bridge.NET
57+
'V', // DesktopVK (Vulkan)
5758
};
5859

5960
/// <summary>

Diff for: MonoGame.Framework.Content.Pipeline/TargetPlatform.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ public enum TargetPlatform
8585
/// <summary>
8686
/// WebAssembly and Bridge.NET
8787
/// </summary>
88-
Web
88+
Web,
89+
90+
/// <summary>
91+
/// All desktop versions using Vulkan.
92+
/// </summary>
93+
DesktopVK,
8994
}
9095

9196

Diff for: MonoGame.Framework.Native.sln

+84-4
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,100 @@ Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio Version 17
44
VisualStudioVersion = 17.0.31903.59
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoGame.Framework.Native", "MonoGame.Framework\MonoGame.Framework.Native.csproj", "{56BA741D-6AF1-489B-AB00-338DE11B1D32}"
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoGame.Framework.Native", "MonoGame.Framework\MonoGame.Framework.Native.csproj", "{56BA741D-6AF1-489B-AB00-338DE11B1D32}"
7+
EndProject
8+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{65B3DC17-24BA-4C39-810F-E371AC48199A}"
9+
EndProject
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoGame.Generator.CTypes", "Tools\MonoGame.Generator.CTypes\MonoGame.Generator.CTypes.csproj", "{74F12E34-D96B-4EC1-A218-BAFC83DC6220}"
11+
EndProject
12+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoGame.Tests.WindowsVK", "Tests\MonoGame.Tests.WindowsVK.csproj", "{C670BF60-56F7-493F-B5DD-50F97DB80A04}"
13+
EndProject
14+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "desktopvk", "native\monogame\desktopvk.vcxproj", "{60D6243F-CC40-D9B5-157F-8A5B8128B70A}"
715
EndProject
816
Global
917
GlobalSection(SolutionConfigurationPlatforms) = preSolution
18+
Debug_VK|Any CPU = Debug_VK|Any CPU
19+
Debug_VK|x64 = Debug_VK|x64
1020
Debug|Any CPU = Debug|Any CPU
21+
Debug|x64 = Debug|x64
22+
Release_VK|Any CPU = Release_VK|Any CPU
23+
Release_VK|x64 = Release_VK|x64
1124
Release|Any CPU = Release|Any CPU
12-
EndGlobalSection
13-
GlobalSection(SolutionProperties) = preSolution
14-
HideSolutionNode = FALSE
25+
Release|x64 = Release|x64
1526
EndGlobalSection
1627
GlobalSection(ProjectConfigurationPlatforms) = postSolution
28+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug_VK|Any CPU.ActiveCfg = Debug|Any CPU
29+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug_VK|Any CPU.Build.0 = Debug|Any CPU
30+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug_VK|x64.ActiveCfg = Debug|Any CPU
31+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug_VK|x64.Build.0 = Debug|Any CPU
1732
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1833
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug|Any CPU.Build.0 = Debug|Any CPU
34+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug|x64.ActiveCfg = Debug|Any CPU
35+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Debug|x64.Build.0 = Debug|Any CPU
36+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release_VK|Any CPU.ActiveCfg = Release|Any CPU
37+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release_VK|Any CPU.Build.0 = Release|Any CPU
38+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release_VK|x64.ActiveCfg = Release|Any CPU
39+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release_VK|x64.Build.0 = Release|Any CPU
1940
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release|Any CPU.ActiveCfg = Release|Any CPU
2041
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release|Any CPU.Build.0 = Release|Any CPU
42+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release|x64.ActiveCfg = Release|Any CPU
43+
{56BA741D-6AF1-489B-AB00-338DE11B1D32}.Release|x64.Build.0 = Release|Any CPU
44+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug_VK|Any CPU.ActiveCfg = Debug|Any CPU
45+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug_VK|Any CPU.Build.0 = Debug|Any CPU
46+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug_VK|x64.ActiveCfg = Debug|Any CPU
47+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug_VK|x64.Build.0 = Debug|Any CPU
48+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
49+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug|Any CPU.Build.0 = Debug|Any CPU
50+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug|x64.ActiveCfg = Debug|Any CPU
51+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Debug|x64.Build.0 = Debug|Any CPU
52+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release_VK|Any CPU.ActiveCfg = Release|Any CPU
53+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release_VK|Any CPU.Build.0 = Release|Any CPU
54+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release_VK|x64.ActiveCfg = Release|Any CPU
55+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release_VK|x64.Build.0 = Release|Any CPU
56+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release|Any CPU.ActiveCfg = Release|Any CPU
57+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release|Any CPU.Build.0 = Release|Any CPU
58+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release|x64.ActiveCfg = Release|Any CPU
59+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220}.Release|x64.Build.0 = Release|Any CPU
60+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug_VK|Any CPU.ActiveCfg = Debug|Any CPU
61+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug_VK|Any CPU.Build.0 = Debug|Any CPU
62+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug_VK|x64.ActiveCfg = Debug|Any CPU
63+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug_VK|x64.Build.0 = Debug|Any CPU
64+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
65+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug|Any CPU.Build.0 = Debug|Any CPU
66+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug|x64.ActiveCfg = Debug|Any CPU
67+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Debug|x64.Build.0 = Debug|Any CPU
68+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release_VK|Any CPU.ActiveCfg = Release|Any CPU
69+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release_VK|Any CPU.Build.0 = Release|Any CPU
70+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release_VK|x64.ActiveCfg = Release|Any CPU
71+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release_VK|x64.Build.0 = Release|Any CPU
72+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release|Any CPU.ActiveCfg = Release|Any CPU
73+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release|Any CPU.Build.0 = Release|Any CPU
74+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release|x64.ActiveCfg = Release|Any CPU
75+
{C670BF60-56F7-493F-B5DD-50F97DB80A04}.Release|x64.Build.0 = Release|Any CPU
76+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug_VK|Any CPU.ActiveCfg = Debug|x64
77+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug_VK|Any CPU.Build.0 = Debug|x64
78+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug_VK|x64.ActiveCfg = Debug|x64
79+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug_VK|x64.Build.0 = Debug|x64
80+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug|Any CPU.ActiveCfg = Debug|x64
81+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug|Any CPU.Build.0 = Debug|x64
82+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug|x64.ActiveCfg = Debug|x64
83+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Debug|x64.Build.0 = Debug|x64
84+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release_VK|Any CPU.ActiveCfg = Release|x64
85+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release_VK|Any CPU.Build.0 = Release|x64
86+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release_VK|x64.ActiveCfg = Release|x64
87+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release_VK|x64.Build.0 = Release|x64
88+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release|Any CPU.ActiveCfg = Release|x64
89+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release|Any CPU.Build.0 = Release|x64
90+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release|x64.ActiveCfg = Release|x64
91+
{60D6243F-CC40-D9B5-157F-8A5B8128B70A}.Release|x64.Build.0 = Release|x64
92+
EndGlobalSection
93+
GlobalSection(SolutionProperties) = preSolution
94+
HideSolutionNode = FALSE
95+
EndGlobalSection
96+
GlobalSection(NestedProjects) = preSolution
97+
{74F12E34-D96B-4EC1-A218-BAFC83DC6220} = {65B3DC17-24BA-4C39-810F-E371AC48199A}
98+
EndGlobalSection
99+
GlobalSection(ExtensibilityGlobals) = postSolution
100+
SolutionGuid = {CDA9FB22-5A50-47C6-B732-CE09AC673DCA}
21101
EndGlobalSection
22102
EndGlobal

Diff for: MonoGame.Framework/Audio/SoundEffectInstance.cs

+12-14
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ public partial class SoundEffectInstance : IDisposable
1919
internal SoundEffect _effect;
2020
private float _pan;
2121
private float _volume;
22-
private float _pitch;
22+
private float _pitch;
23+
private bool _isLooped;
2324

2425
/// <summary>Enables or Disables whether the SoundEffectInstance should repeat after playback.</summary>
2526
/// <remarks>This value has no effect on an already playing sound.</remarks>
2627
public virtual bool IsLooped
27-
{
28-
get { return PlatformGetIsLooped(); }
29-
set { PlatformSetIsLooped(value); }
28+
{
29+
get { return _isLooped; }
30+
set { _isLooped = value; }
3031
}
3132

3233
/// <summary>Gets or sets the pan, or speaker balance..</summary>
@@ -94,13 +95,8 @@ internal SoundEffectInstance()
9495
{
9596
_pan = 0.0f;
9697
_volume = 1.0f;
97-
_pitch = 0.0f;
98-
}
99-
100-
internal SoundEffectInstance(byte[] buffer, int sampleRate, int channels)
101-
: this()
102-
{
103-
PlatformInitialize(buffer, sampleRate, channels);
98+
_pitch = 0.0f;
99+
_isLooped = false;
104100
}
105101

106102
/// <summary>
@@ -142,19 +138,21 @@ public virtual void Play()
142138
{
143139
if (_isDisposed)
144140
throw new ObjectDisposedException("SoundEffectInstance");
141+
142+
var state = State;
145143

146-
if (State == SoundState.Playing)
144+
if (state == SoundState.Playing)
147145
return;
148146

149-
if (State == SoundState.Paused)
147+
if (state == SoundState.Paused)
150148
{
151149
Resume();
152150
return;
153151
}
154152

155153
// We don't need to check if we're at the instance play limit
156154
// if we're resuming from a paused state.
157-
if (State != SoundState.Paused)
155+
if (state != SoundState.Paused)
158156
{
159157
if (!SoundEffectInstancePool.SoundsAvailable)
160158
throw new InstancePlayLimitException();

Diff for: MonoGame.Framework/Content/ContentManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public partial class ContentManager : IDisposable
4949
'O', // XboxOne
5050
'S', // Nintendo Switch
5151
'b', // WebAssembly and Bridge.NET
52+
'V', // DesktopVK
5253

5354
// NOTE: There are additional identifiers for consoles that
5455
// are not defined in this repository. Be sure to ask the

Diff for: MonoGame.Framework/Game.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ protected virtual void UnloadContent() { }
672672
protected virtual void Initialize()
673673
{
674674
// TODO: This should be removed once all platforms use the new GraphicsDeviceManager
675-
#if !(WINDOWS && DIRECTX)
675+
#if !(WINDOWS && DIRECTX) && !NATIVE
676676
applyChanges(graphicsDeviceManager);
677677
#endif
678678

@@ -791,7 +791,7 @@ private void Platform_AsyncRunLoopEnded(object sender, EventArgs e)
791791
// break entirely the possibility that additional platforms could
792792
// be added by third parties without changing MonoGame itself.
793793

794-
#if !(WINDOWS && DIRECTX)
794+
#if !(WINDOWS && DIRECTX) && !NATIVE
795795
internal void applyChanges(GraphicsDeviceManager manager)
796796
{
797797
Platform.BeginScreenDeviceChange(GraphicsDevice.PresentationParameters.IsFullScreen);

Diff for: MonoGame.Framework/GameWindow.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ public abstract class GameWindow
3434
/// </summary>
3535
public virtual bool AllowAltF4 { get { return _allowAltF4; } set { _allowAltF4 = value; } }
3636

37-
#if WINDOWS || DESKTOPGL
3837
/// <summary>
3938
/// The location of this window on the desktop, eg: global coordinate space
4039
/// which stretches across all screens.
40+
///
41+
/// May be zero on platforms where it is not supported.
4142
/// </summary>
4243
public abstract Point Position { get; set; }
43-
#endif
4444

4545
/// <summary>
4646
/// The display orientation on a mobile device.
@@ -123,7 +123,7 @@ protected GameWindow()
123123
/// </summary>
124124
public event EventHandler<EventArgs> ScreenDeviceNameChanged;
125125

126-
#if WINDOWS || DESKTOPGL|| ANGLE
126+
#if WINDOWS || DESKTOPGL|| ANGLE || NATIVE
127127

128128
/// <summary>
129129
/// Use this event to user text input.
@@ -228,7 +228,8 @@ protected void OnScreenDeviceNameChanged ()
228228
EventHelpers.Raise(this, ScreenDeviceNameChanged, EventArgs.Empty);
229229
}
230230

231-
#if WINDOWS || DESKTOPGL || ANGLE
231+
#if WINDOWS || DESKTOPGL || ANGLE || NATIVE
232+
232233
/// <summary>
233234
/// Called when the window receives text input. Raises the <see cref="TextInput"/> event.
234235
/// </summary>

0 commit comments

Comments
 (0)