diff --git a/osu-framework.iOS.slnf b/osu-framework.iOS.slnf
index 30287a2443..4826b8adf2 100644
--- a/osu-framework.iOS.slnf
+++ b/osu-framework.iOS.slnf
@@ -16,4 +16,4 @@
"SampleGame\\SampleGame.csproj"
]
}
-}
+}
\ No newline at end of file
diff --git a/osu-framework.sln b/osu-framework.sln
index 3a3d02ae48..155884055c 100644
--- a/osu-framework.sln
+++ b/osu-framework.sln
@@ -80,297 +80,113 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
- Debug|iPhone = Debug|iPhone
- Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|Any CPU = Release|Any CPU
- Release|iPhone = Release|iPhone
- Release|iPhoneSimulator = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|iPhone.Build.0 = Debug|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|Any CPU.Build.0 = Release|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|iPhone.ActiveCfg = Release|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|iPhone.Build.0 = Release|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|iPhone.Build.0 = Debug|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|Any CPU.Build.0 = Release|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|iPhone.ActiveCfg = Release|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|iPhone.Build.0 = Release|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{79803407-6F50-484F-93F5-641911EABD8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79803407-6F50-484F-93F5-641911EABD8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Debug|iPhone.Build.0 = Debug|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{79803407-6F50-484F-93F5-641911EABD8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79803407-6F50-484F-93F5-641911EABD8A}.Release|Any CPU.Build.0 = Release|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Release|iPhone.ActiveCfg = Release|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Release|iPhone.Build.0 = Release|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {79803407-6F50-484F-93F5-641911EABD8A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Debug|iPhone.Build.0 = Debug|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Release|Any CPU.Build.0 = Release|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Release|iPhone.ActiveCfg = Release|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Release|iPhone.Build.0 = Release|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {2AD6EA6F-CD5A-4348-86F1-5E228B11617D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Debug|iPhone.Build.0 = Debug|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Release|Any CPU.Build.0 = Release|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Release|iPhone.ActiveCfg = Release|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Release|iPhone.Build.0 = Release|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {F853B4BB-CB83-4169-8FD2-72EEB4A88C32}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Debug|iPhone.Build.0 = Debug|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Release|Any CPU.Build.0 = Release|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Release|iPhone.ActiveCfg = Release|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Release|iPhone.Build.0 = Release|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {BBC0D18F-8595-43A6-AE61-5BF36A072CCE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|iPhone.Build.0 = Debug|iPhone
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|iPhone.ActiveCfg = Release|iPhone
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|iPhone.Build.0 = Release|iPhone
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|iPhone.Build.0 = Debug|iPhone
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|iPhone.ActiveCfg = Release|iPhone
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|iPhone.Build.0 = Release|iPhone
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {529D5E2E-774A-4831-9C9E-59E3E8DFF155}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D972753E-45FC-4B82-B017-34BDE485F1BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D972753E-45FC-4B82-B017-34BDE485F1BB}.Release|Any CPU.Build.0 = Release|Any CPU
{4D112E30-462B-4264-B44D-53B61ABB185E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D112E30-462B-4264-B44D-53B61ABB185E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Debug|iPhone.Build.0 = Debug|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{4D112E30-462B-4264-B44D-53B61ABB185E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D112E30-462B-4264-B44D-53B61ABB185E}.Release|Any CPU.Build.0 = Release|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Release|iPhone.ActiveCfg = Release|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Release|iPhone.Build.0 = Release|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {4D112E30-462B-4264-B44D-53B61ABB185E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{5A378BB7-11D6-4008-980E-A67507CD9969}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5A378BB7-11D6-4008-980E-A67507CD9969}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5A378BB7-11D6-4008-980E-A67507CD9969}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {5A378BB7-11D6-4008-980E-A67507CD9969}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {5A378BB7-11D6-4008-980E-A67507CD9969}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{5A378BB7-11D6-4008-980E-A67507CD9969}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5A378BB7-11D6-4008-980E-A67507CD9969}.Release|Any CPU.Build.0 = Release|Any CPU
{5A378BB7-11D6-4008-980E-A67507CD9969}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {5A378BB7-11D6-4008-980E-A67507CD9969}.Release|iPhone.ActiveCfg = Release|Any CPU
- {5A378BB7-11D6-4008-980E-A67507CD9969}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Release|Any CPU.Build.0 = Release|Any CPU
{320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Release|iPhone.ActiveCfg = Release|Any CPU
- {320089C6-A141-4D3E-BD5F-C4A6CE9E567B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{F294C804-8AE2-4020-841A-AF0D97FBE80C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F294C804-8AE2-4020-841A-AF0D97FBE80C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Debug|iPhone.Build.0 = Debug|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{F294C804-8AE2-4020-841A-AF0D97FBE80C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F294C804-8AE2-4020-841A-AF0D97FBE80C}.Release|Any CPU.Build.0 = Release|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Release|iPhone.ActiveCfg = Release|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Release|iPhone.Build.0 = Release|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {F294C804-8AE2-4020-841A-AF0D97FBE80C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{A95175BB-95D0-44B4-8B82-EABD166943DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A95175BB-95D0-44B4-8B82-EABD166943DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A95175BB-95D0-44B4-8B82-EABD166943DA}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {A95175BB-95D0-44B4-8B82-EABD166943DA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{A95175BB-95D0-44B4-8B82-EABD166943DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A95175BB-95D0-44B4-8B82-EABD166943DA}.Release|Any CPU.Build.0 = Release|Any CPU
- {A95175BB-95D0-44B4-8B82-EABD166943DA}.Release|iPhone.ActiveCfg = Release|Any CPU
- {A95175BB-95D0-44B4-8B82-EABD166943DA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|iPhone.Build.0 = Debug|iPhone
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|iPhone.ActiveCfg = Release|iPhone
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|iPhone.Build.0 = Release|iPhone
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|iPhone.Build.0 = Debug|iPhone
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|iPhone.ActiveCfg = Release|iPhone
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|iPhone.Build.0 = Release|iPhone
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7AA1DB5D-78DB-4693-AE50-D6078F5A0CAB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {48783186-230D-4048-A97A-E4F1DF43BF5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {48783186-230D-4048-A97A-E4F1DF43BF5C}.Release|Any CPU.Build.0 = Release|Any CPU
{6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Debug|iPhone.Build.0 = Debug|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Release|Any CPU.Build.0 = Release|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Release|iPhone.ActiveCfg = Release|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Release|iPhone.Build.0 = Release|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {6BEB95A6-0673-4AF5-892E-9146FF8B0948}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Debug|iPhone.Build.0 = Debug|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Release|Any CPU.Build.0 = Release|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Release|iPhone.ActiveCfg = Release|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Release|iPhone.Build.0 = Release|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {6E3EBF71-8664-49D7-BD0D-2B21B3EEC540}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{55AB973D-ECA0-422B-B367-24BC47DA081B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55AB973D-ECA0-422B-B367-24BC47DA081B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Debug|iPhone.Build.0 = Debug|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{55AB973D-ECA0-422B-B367-24BC47DA081B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55AB973D-ECA0-422B-B367-24BC47DA081B}.Release|Any CPU.Build.0 = Release|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Release|iPhone.ActiveCfg = Release|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Release|iPhone.Build.0 = Release|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {55AB973D-ECA0-422B-B367-24BC47DA081B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Debug|iPhone.Build.0 = Debug|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Release|Any CPU.Build.0 = Release|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Release|iPhone.ActiveCfg = Release|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Release|iPhone.Build.0 = Release|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {FC0A9040-7BAF-4524-B398-8C7A1C7DDEE9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{7809CB42-8FED-4BB7-8C68-7638357B94A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7809CB42-8FED-4BB7-8C68-7638357B94A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Debug|iPhone.Build.0 = Debug|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{7809CB42-8FED-4BB7-8C68-7638357B94A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7809CB42-8FED-4BB7-8C68-7638357B94A6}.Release|Any CPU.Build.0 = Release|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Release|iPhone.ActiveCfg = Release|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Release|iPhone.Build.0 = Release|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {7809CB42-8FED-4BB7-8C68-7638357B94A6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Debug|iPhone.Build.0 = Debug|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Release|Any CPU.Build.0 = Release|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Release|iPhone.ActiveCfg = Release|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Release|iPhone.Build.0 = Release|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {4C728441-4C3D-4AE4-9C0F-EA91E2C70965}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{0309CF11-621A-4F23-8FBA-A583303A8531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0309CF11-621A-4F23-8FBA-A583303A8531}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Debug|iPhone.Build.0 = Debug|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{0309CF11-621A-4F23-8FBA-A583303A8531}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0309CF11-621A-4F23-8FBA-A583303A8531}.Release|Any CPU.Build.0 = Release|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Release|iPhone.ActiveCfg = Release|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Release|iPhone.Build.0 = Release|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {0309CF11-621A-4F23-8FBA-A583303A8531}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Debug|iPhone.Build.0 = Debug|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Release|Any CPU.Build.0 = Release|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Release|iPhone.ActiveCfg = Release|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Release|iPhone.Build.0 = Release|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {9E4B69EE-34E6-47CF-8346-2A66D1714FCD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Debug|iPhone.Build.0 = Debug|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Release|Any CPU.Build.0 = Release|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Release|iPhone.ActiveCfg = Release|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Release|iPhone.Build.0 = Release|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {BCFABDF9-AC1B-41B6-959E-04676F0C20F8}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Debug|iPhone.Build.0 = Debug|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Release|Any CPU.Build.0 = Release|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Release|iPhone.ActiveCfg = Release|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Release|iPhone.Build.0 = Release|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {A0DDCF0A-A352-4CC6-8E6E-0E16CAA50CDD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/osu.Framework.Android/AndroidGameActivity.cs b/osu.Framework.Android/AndroidGameActivity.cs
index 79cdde600e..b500a20944 100644
--- a/osu.Framework.Android/AndroidGameActivity.cs
+++ b/osu.Framework.Android/AndroidGameActivity.cs
@@ -7,7 +7,6 @@
using Android.Content.PM;
using Android.OS;
using Android.Views;
-using Java.Lang;
using ManagedBass;
using Org.Libsdl.App;
using osu.Framework.Extensions.ObjectExtensions;
@@ -39,14 +38,11 @@ public abstract class AndroidGameActivity : SDLActivity
protected override SDLSurface CreateSDLSurface(Context? context) => new AndroidGameSurface(this, context);
- protected override IRunnable CreateSDLMainRunnable() => new Runnable(() =>
+ protected override void Main()
{
var host = new AndroidGameHost(this);
host.Run(CreateGame());
-
- if (!IsFinishing)
- Finish();
- });
+ }
protected override void OnCreate(Bundle? savedInstanceState)
{
diff --git a/osu.Framework.Android/osu.Framework.Android.csproj b/osu.Framework.Android/osu.Framework.Android.csproj
index 352be30811..ed4a93339a 100644
--- a/osu.Framework.Android/osu.Framework.Android.csproj
+++ b/osu.Framework.Android/osu.Framework.Android.csproj
@@ -18,7 +18,7 @@
-
+
diff --git a/osu.Framework.Benchmarks/BenchmarkBindableList.cs b/osu.Framework.Benchmarks/BenchmarkBindableList.cs
index 9cb5cb6f6a..fb0d9650c6 100644
--- a/osu.Framework.Benchmarks/BenchmarkBindableList.cs
+++ b/osu.Framework.Benchmarks/BenchmarkBindableList.cs
@@ -19,6 +19,13 @@ public void GlobalSetup()
list.Add(i);
}
+ [Benchmark]
+ public void Add()
+ {
+ for (int i = 0; i < 10; i++)
+ list.Add(i);
+ }
+
[Benchmark]
public int Enumerate()
{
diff --git a/osu.Framework.Templates/templates/template-empty/TemplateGame.iOS/TemplateGame.iOS.csproj b/osu.Framework.Templates/templates/template-empty/TemplateGame.iOS/TemplateGame.iOS.csproj
index 2cca8636a2..dc86d4e4d3 100644
--- a/osu.Framework.Templates/templates/template-empty/TemplateGame.iOS/TemplateGame.iOS.csproj
+++ b/osu.Framework.Templates/templates/template-empty/TemplateGame.iOS/TemplateGame.iOS.csproj
@@ -10,12 +10,6 @@
so there's nothing to be worried about. -->
MT7091
-
- ios-arm64
-
-
- iossimulator-x64
-
diff --git a/osu.Framework.Templates/templates/template-flappy/FlappyDon.iOS/FlappyDon.iOS.csproj b/osu.Framework.Templates/templates/template-flappy/FlappyDon.iOS/FlappyDon.iOS.csproj
index a53d5b0248..ff0034760a 100644
--- a/osu.Framework.Templates/templates/template-flappy/FlappyDon.iOS/FlappyDon.iOS.csproj
+++ b/osu.Framework.Templates/templates/template-flappy/FlappyDon.iOS/FlappyDon.iOS.csproj
@@ -10,12 +10,6 @@
so there's nothing to be worried about. -->
MT7091
-
- ios-arm64
-
-
- iossimulator-x64
-
diff --git a/osu.Framework.Tests/Graphics/RendererTest.cs b/osu.Framework.Tests/Graphics/RendererTest.cs
new file mode 100644
index 0000000000..1f77e8e1cb
--- /dev/null
+++ b/osu.Framework.Tests/Graphics/RendererTest.cs
@@ -0,0 +1,30 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Framework.Graphics.Rendering.Dummy;
+using osu.Framework.Graphics.Textures;
+
+namespace osu.Framework.Tests.Graphics
+{
+ public class RendererTest
+ {
+ [Test]
+ public void TestWhitePixelReuseUpdatesTextureWrapping()
+ {
+ DummyRenderer renderer = new DummyRenderer();
+
+ renderer.BindTexture(renderer.WhitePixel, 0, WrapMode.None, WrapMode.None);
+ Assert.That(renderer.CurrentWrapModeS, Is.EqualTo(WrapMode.None));
+ Assert.That(renderer.CurrentWrapModeS, Is.EqualTo(WrapMode.None));
+
+ renderer.BindTexture(renderer.WhitePixel, 0, WrapMode.ClampToEdge, WrapMode.ClampToEdge);
+ Assert.That(renderer.CurrentWrapModeS, Is.EqualTo(WrapMode.ClampToEdge));
+ Assert.That(renderer.CurrentWrapModeS, Is.EqualTo(WrapMode.ClampToEdge));
+
+ renderer.BindTexture(renderer.WhitePixel, 0, WrapMode.None, WrapMode.None);
+ Assert.That(renderer.CurrentWrapModeS, Is.EqualTo(WrapMode.None));
+ Assert.That(renderer.CurrentWrapModeS, Is.EqualTo(WrapMode.None));
+ }
+ }
+}
diff --git a/osu.Framework.Tests/Graphics/ShaderStorageBufferObjectStackTest.cs b/osu.Framework.Tests/Graphics/ShaderStorageBufferObjectStackTest.cs
index a8561e3cc7..545dc7c8c2 100644
--- a/osu.Framework.Tests/Graphics/ShaderStorageBufferObjectStackTest.cs
+++ b/osu.Framework.Tests/Graphics/ShaderStorageBufferObjectStackTest.cs
@@ -2,9 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Runtime.InteropServices;
using NUnit.Framework;
using osu.Framework.Graphics.Rendering;
using osu.Framework.Graphics.Rendering.Dummy;
+using osu.Framework.Graphics.Shaders.Types;
namespace osu.Framework.Tests.Graphics
{
@@ -12,21 +14,21 @@ public class ShaderStorageBufferObjectStackTest
{
private const int size = 10;
- private ShaderStorageBufferObjectStack stack = null!;
+ private ShaderStorageBufferObjectStack stack = null!;
[SetUp]
public void Setup()
{
- stack = new ShaderStorageBufferObjectStack(new DummyRenderer(), 2, size);
+ stack = new ShaderStorageBufferObjectStack(new DummyRenderer(), 2, size);
}
[Test]
public void TestBufferMustBeAtLeast2Elements()
{
- Assert.Throws(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 1, 100));
- Assert.Throws(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 100, 1));
- Assert.DoesNotThrow(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 2, 100));
- Assert.DoesNotThrow(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 100, 2));
+ Assert.Throws(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 1, 100));
+ Assert.Throws(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 100, 1));
+ Assert.DoesNotThrow(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 2, 100));
+ Assert.DoesNotThrow(() => _ = new ShaderStorageBufferObjectStack(new DummyRenderer(), 100, 2));
}
[Test]
@@ -34,7 +36,7 @@ public void TestInitialState()
{
Assert.That(stack.CurrentOffset, Is.Zero);
Assert.That(stack.CurrentBuffer, Is.Not.Null);
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(0));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(0));
}
[Test]
@@ -48,11 +50,11 @@ public void TestAddInitialItem()
{
var firstBuffer = stack.CurrentBuffer;
- stack.Push(1);
+ stack.Push(new TestUniformData { Int = 1 });
Assert.That(stack.CurrentOffset, Is.Zero);
Assert.That(stack.CurrentBuffer, Is.EqualTo(firstBuffer));
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(1));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(1));
}
[Test]
@@ -63,10 +65,10 @@ public void TestPushToFillOneBuffer()
for (int i = 0; i < size; i++)
{
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
Assert.That(stack.CurrentOffset, Is.EqualTo(expectedIndex++));
Assert.That(stack.CurrentBuffer, Is.EqualTo(firstBuffer));
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(i));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(i));
}
}
@@ -74,7 +76,7 @@ public void TestPushToFillOneBuffer()
public void TestPopEntireBuffer()
{
for (int i = 0; i < size; i++)
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
var firstBuffer = stack.CurrentBuffer;
@@ -82,7 +84,7 @@ public void TestPopEntireBuffer()
{
Assert.That(stack.CurrentOffset, Is.EqualTo(i));
Assert.That(stack.CurrentBuffer, Is.EqualTo(firstBuffer));
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(i));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(i));
stack.Pop();
}
}
@@ -91,47 +93,47 @@ public void TestPopEntireBuffer()
public void TestTransitionToBufferOnPush()
{
for (int i = 0; i < size; i++)
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
var firstBuffer = stack.CurrentBuffer;
- int copiedItem = stack.CurrentBuffer[stack.CurrentOffset];
+ int copiedItem = stack.CurrentBuffer[stack.CurrentOffset].Int.Value;
// Transition to a new buffer...
- stack.Push(size);
+ stack.Push(new TestUniformData { Int = size });
Assert.That(stack.CurrentBuffer, Is.Not.EqualTo(firstBuffer));
// ... where the "hack" employed by the queue means that after a transition, the new item is added at index 1...
Assert.That(stack.CurrentOffset, Is.EqualTo(1));
- Assert.That(stack.CurrentBuffer[1], Is.EqualTo(size));
+ Assert.That(stack.CurrentBuffer[1].Int.Value, Is.EqualTo(size));
// ... and the first item in the new buffer is a copy of the last referenced item before the push.
- Assert.That(stack.CurrentBuffer[0], Is.EqualTo(copiedItem));
+ Assert.That(stack.CurrentBuffer[0].Int.Value, Is.EqualTo(copiedItem));
}
[Test]
public void TestTransitionToBufferOnPop()
{
for (int i = 0; i < size; i++)
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
var firstBuffer = stack.CurrentBuffer;
- int copiedItem = stack.CurrentBuffer[stack.CurrentOffset];
+ int copiedItem = stack.CurrentBuffer[stack.CurrentOffset].Int.Value;
// Transition to the new buffer.
- stack.Push(size);
+ stack.Push(new TestUniformData { Int = size });
// The "hack" employed means that on the first pop, the index moves to the 0th index in the new buffer.
stack.Pop();
Assert.That(stack.CurrentBuffer, Is.Not.EqualTo(firstBuffer));
Assert.That(stack.CurrentOffset, Is.Zero);
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(copiedItem));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(copiedItem));
// After a subsequent pop, we transition to the previous buffer and move to the index prior to the copied item.
// We've already seen the copied item in the new buffer with the above pop, so we should not see it again here.
stack.Pop();
Assert.That(stack.CurrentBuffer, Is.EqualTo(firstBuffer));
Assert.That(stack.CurrentOffset, Is.EqualTo(copiedItem - 1));
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(copiedItem - 1));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(copiedItem - 1));
// Popping once again should move the index further backwards.
stack.Pop();
@@ -143,7 +145,7 @@ public void TestTransitionToBufferOnPop()
public void TestTransitionToAndFromNewBufferFromMiddle()
{
for (int i = 0; i < size; i++)
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
// Move to the middle of the current buffer (it can not take up any new items at this point).
stack.Pop();
@@ -153,13 +155,13 @@ public void TestTransitionToAndFromNewBufferFromMiddle()
int copiedItem = stack.CurrentOffset;
// Transition to the new buffer...
- stack.Push(size);
+ stack.Push(new TestUniformData { Int = size });
// ... and as above, we arrive at index 1 in the new buffer.
Assert.That(stack.CurrentBuffer, Is.Not.EqualTo(firstBuffer));
Assert.That(stack.CurrentOffset, Is.EqualTo(1));
- Assert.That(stack.CurrentBuffer[1], Is.EqualTo(size));
- Assert.That(stack.CurrentBuffer[0], Is.EqualTo(copiedItem));
+ Assert.That(stack.CurrentBuffer[1].Int.Value, Is.EqualTo(size));
+ Assert.That(stack.CurrentBuffer[0].Int.Value, Is.EqualTo(copiedItem));
// Transition to the previous buffer...
stack.Pop();
@@ -168,7 +170,7 @@ public void TestTransitionToAndFromNewBufferFromMiddle()
// ... noting that this is the same as the above "normal" pop case, except that item arrived at is in the middle of the previous buffer.
Assert.That(stack.CurrentBuffer, Is.EqualTo(firstBuffer));
Assert.That(stack.CurrentOffset, Is.EqualTo(copiedItem - 1));
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(copiedItem - 1));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(copiedItem - 1));
// Popping once again from this state should move further backwards.
stack.Pop();
@@ -180,19 +182,19 @@ public void TestTransitionToAndFromNewBufferFromMiddle()
public void TestMoveToAndFromMiddleOfNewBuffer()
{
for (int i = 0; i < size; i++)
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
var lastBuffer = stack.CurrentBuffer;
- int copiedItem1 = stack.CurrentBuffer[stack.CurrentOffset];
+ int copiedItem1 = stack.CurrentBuffer[stack.CurrentOffset].Int.Value;
// Transition to the middle of the new buffer.
- stack.Push(size);
- stack.Push(size + 1);
+ stack.Push(new TestUniformData { Int = size });
+ stack.Push(new TestUniformData { Int = size + 1 });
Assert.That(stack.CurrentBuffer, Is.Not.EqualTo(lastBuffer));
Assert.That(stack.CurrentOffset, Is.EqualTo(2));
- Assert.That(stack.CurrentBuffer[2], Is.EqualTo(size + 1));
- Assert.That(stack.CurrentBuffer[1], Is.EqualTo(size));
- Assert.That(stack.CurrentBuffer[0], Is.EqualTo(copiedItem1));
+ Assert.That(stack.CurrentBuffer[2].Int.Value, Is.EqualTo(size + 1));
+ Assert.That(stack.CurrentBuffer[1].Int.Value, Is.EqualTo(size));
+ Assert.That(stack.CurrentBuffer[0].Int.Value, Is.EqualTo(copiedItem1));
// Transition to the previous buffer.
stack.Pop();
@@ -201,23 +203,23 @@ public void TestMoveToAndFromMiddleOfNewBuffer()
Assert.That(stack.CurrentBuffer, Is.EqualTo(lastBuffer));
// The item that will be copied into the new buffer.
- int copiedItem2 = stack.CurrentBuffer[stack.CurrentOffset];
+ int copiedItem2 = stack.CurrentBuffer[stack.CurrentOffset].Int.Value;
// Transition to the new buffer...
- stack.Push(size + 2);
+ stack.Push(new TestUniformData { Int = size + 2 });
Assert.That(stack.CurrentBuffer, Is.Not.EqualTo(lastBuffer));
// ... noting that this is the same as the normal case of transitioning to a new buffer, except arriving in the middle of it...
Assert.That(stack.CurrentOffset, Is.EqualTo(4));
- Assert.That(stack.CurrentBuffer[4], Is.EqualTo(size + 2));
+ Assert.That(stack.CurrentBuffer[4].Int.Value, Is.EqualTo(size + 2));
// ... where this is the copied item as a result of the immediate push...
- Assert.That(stack.CurrentBuffer[3], Is.EqualTo(copiedItem2));
+ Assert.That(stack.CurrentBuffer[3].Int.Value, Is.EqualTo(copiedItem2));
// ... and these are the same items from the first pushes above.
- Assert.That(stack.CurrentBuffer[2], Is.EqualTo(size + 1));
- Assert.That(stack.CurrentBuffer[1], Is.EqualTo(size));
- Assert.That(stack.CurrentBuffer[0], Is.EqualTo(copiedItem1));
+ Assert.That(stack.CurrentBuffer[2].Int.Value, Is.EqualTo(size + 1));
+ Assert.That(stack.CurrentBuffer[1].Int.Value, Is.EqualTo(size));
+ Assert.That(stack.CurrentBuffer[0].Int.Value, Is.EqualTo(copiedItem1));
// Transition to the previous buffer...
stack.Pop();
@@ -230,7 +232,7 @@ public void TestMoveToAndFromMiddleOfNewBuffer()
// 3. From index N-2 -> transition to new buffer.
// 4. Transition to old buffer, arrive at index N-3 (N-2 was copied into the new buffer).
Assert.That(stack.CurrentOffset, Is.EqualTo(size - 3));
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(size - 3));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(size - 3));
}
[Test]
@@ -241,18 +243,25 @@ public void TestTransitionFromEmptyStack()
var lastBuffer = stack.CurrentBuffer;
// Push one item.
- stack.Push(i);
+ stack.Push(new TestUniformData { Int = i });
// On a buffer transition, test that the item at the 0-th index of the first buffer was correct copied to the new buffer.
if (stack.CurrentBuffer != lastBuffer)
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset - 1], Is.EqualTo(0));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset - 1].Int.Value, Is.EqualTo(0));
// Test that the item was correctly placed in the new buffer
- Assert.That(stack.CurrentBuffer[stack.CurrentOffset], Is.EqualTo(i));
+ Assert.That(stack.CurrentBuffer[stack.CurrentOffset].Int.Value, Is.EqualTo(i));
// Return to an empty stack.
stack.Pop();
}
}
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ private record struct TestUniformData
+ {
+ public UniformInt Int;
+ private UniformPadding12 pad;
+ }
}
}
diff --git a/osu.Framework.Tests/Visual/Graphics/TestSceneVertexBatching.cs b/osu.Framework.Tests/Visual/Graphics/TestSceneVertexBatching.cs
index 9e1b03b309..13767014d7 100644
--- a/osu.Framework.Tests/Visual/Graphics/TestSceneVertexBatching.cs
+++ b/osu.Framework.Tests/Visual/Graphics/TestSceneVertexBatching.cs
@@ -3,13 +3,11 @@
using System.Linq;
using NUnit.Framework;
-using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Rendering;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Platform;
using osu.Framework.Utils;
using osuTK;
using osuTK.Graphics;
@@ -18,8 +16,10 @@ namespace osu.Framework.Tests.Visual.Graphics
{
public partial class TestSceneVertexBatching : FrameworkTestScene
{
- [Resolved]
- private GameHost host { get; set; } = null!;
+ ///
+ /// Max number of quads per batch in the default quad batch (Renderer.defaultQuadBatch).
+ ///
+ private const int max_boxes_per_batch = 100;
[Test]
public void TestBatchUntilOverflow()
@@ -28,8 +28,6 @@ public void TestBatchUntilOverflow()
{
Clear();
- int boxesPerBatch = host.Renderer.DefaultQuadBatch.Size;
-
Add(new FillFlowContainer
{
Anchor = Anchor.Centre,
@@ -37,7 +35,7 @@ public void TestBatchUntilOverflow()
RelativeSizeAxes = Axes.Both,
Margin = new MarginPadding(25f),
Spacing = new Vector2(10f),
- ChildrenEnumerable = Enumerable.Range(0, boxesPerBatch * 2).Select(i => new Box
+ ChildrenEnumerable = Enumerable.Range(0, max_boxes_per_batch * 2).Select(i => new Box
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
@@ -55,8 +53,6 @@ public void TestBatchWithFlushes()
{
Clear();
- int boxesPerBatch = host.Renderer.DefaultQuadBatch.Size;
-
Add(new FillFlowContainer
{
Anchor = Anchor.Centre,
@@ -64,7 +60,7 @@ public void TestBatchWithFlushes()
RelativeSizeAxes = Axes.Both,
Margin = new MarginPadding(25f),
Spacing = new Vector2(10f),
- ChildrenEnumerable = Enumerable.Range(0, boxesPerBatch * 2).Select(i => new BoxWithFlush
+ ChildrenEnumerable = Enumerable.Range(0, max_boxes_per_batch * 2).Select(i => new BoxWithFlush
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
diff --git a/osu.Framework.Tests/Visual/Input/TestScenePassThroughInputManager.cs b/osu.Framework.Tests/Visual/Input/TestScenePassThroughInputManager.cs
index a6bf4f748a..7de2f5014d 100644
--- a/osu.Framework.Tests/Visual/Input/TestScenePassThroughInputManager.cs
+++ b/osu.Framework.Tests/Visual/Input/TestScenePassThroughInputManager.cs
@@ -132,6 +132,25 @@ public void TestPressKeyThenReleaseWhileDisabled()
AddStep("UseParentInput = true", () => testInputManager.UseParentInput = true);
AddStep("release key", () => InputManager.ReleaseKey(Key.A));
AddAssert("key released", () => !testInputManager.CurrentState.Keyboard.Keys.HasAnyButtonPressed);
+
+ AddStep("press key", () => InputManager.PressKey(Key.A));
+ AddStep("UseParentInput = false", () => testInputManager.UseParentInput = false);
+
+ AddStep("add blocking layer", () => Add(new HandlingBox
+ {
+ RelativeSizeAxes = Axes.Both,
+ OnHandle = _ => true,
+ }));
+
+ // with a blocking layer existing, the next key press will not be seen by PassThroughInputManager...
+ AddStep("release key", () => InputManager.ReleaseKey(Key.A));
+ AddStep("press key again", () => InputManager.PressKey(Key.A));
+
+ AddStep("UseParentInput = true", () => testInputManager.UseParentInput = true);
+
+ // ...but ensure it'll still release the key regardless of not seeing the corresponding press event (it does that by syncing releases every frame).
+ AddStep("release key", () => InputManager.ReleaseKey(Key.A));
+ AddAssert("key released", () => !testInputManager.CurrentState.Keyboard.Keys.HasAnyButtonPressed);
}
[Test]
diff --git a/osu.Framework.iOS.props b/osu.Framework.iOS.props
index d80894430a..502cfb3184 100644
--- a/osu.Framework.iOS.props
+++ b/osu.Framework.iOS.props
@@ -15,12 +15,6 @@
false
-
- ios-arm64
-
-
- iossimulator-x64
-
diff --git a/osu.Framework.iOS/IOSWindow.cs b/osu.Framework.iOS/IOSWindow.cs
index 674156ec76..c0ec669c76 100644
--- a/osu.Framework.iOS/IOSWindow.cs
+++ b/osu.Framework.iOS/IOSWindow.cs
@@ -12,6 +12,7 @@
using osu.Framework.Platform;
using osu.Framework.Platform.SDL3;
using SDL;
+using static SDL.SDL3;
using UIKit;
namespace osu.Framework.iOS
@@ -55,8 +56,9 @@ protected override unsafe void RunMainLoop()
// iOS may be a good forward direction if this ever comes up, as a user may see a potentially higher
// frame rate with multi-threaded mode turned on, but it is going to give them worse input latency
// and higher power usage.
- SDL3.SDL_iOSSetEventPump(SDL_bool.SDL_FALSE);
- SDL3.SDL_iOSSetAnimationCallback(SDLWindowHandle, 1, &runFrame, ObjectHandle.Handle);
+
+ SDL_SetiOSEventPump(SDL_bool.SDL_FALSE);
+ SDL_SetiOSAnimationCallback(SDLWindowHandle, 1, &runFrame, ObjectHandle.Handle);
}
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })]
diff --git a/osu.Framework/Bindables/BindableList.cs b/osu.Framework/Bindables/BindableList.cs
index 2877cf2527..7483b18596 100644
--- a/osu.Framework/Bindables/BindableList.cs
+++ b/osu.Framework/Bindables/BindableList.cs
@@ -57,7 +57,7 @@ public BindableList(IEnumerable items = null)
public T this[int index]
{
get => collection[index];
- set => setIndex(index, value, new HashSet>());
+ set => setIndex(index, value, getRecursionList());
}
private void setIndex(int index, T item, HashSet> appliedInstances)
@@ -85,7 +85,7 @@ private void setIndex(int index, T item, HashSet> appliedInstanc
/// The item to be added.
/// Thrown when this is .
public void Add(T item)
- => add(item, new HashSet>());
+ => add(item, getRecursionList());
private void add(T item, HashSet> appliedInstances)
{
@@ -118,7 +118,7 @@ private void add(T item, HashSet> appliedInstances)
/// The item to insert.
/// Thrown when this is .
public void Insert(int index, T item)
- => insert(index, item, new HashSet>());
+ => insert(index, item, getRecursionList());
private void insert(int index, T item, HashSet> appliedInstances)
{
@@ -142,7 +142,7 @@ private void insert(int index, T item, HashSet> appliedInstances
///
/// Thrown when this is .
public void Clear()
- => clear(new HashSet>());
+ => clear(getRecursionList());
private void clear(HashSet> appliedInstances)
{
@@ -182,7 +182,7 @@ public bool Contains(T item)
/// true
if the removal was successful.
/// Thrown if this is .
public bool Remove(T item)
- => remove(item, new HashSet>());
+ => remove(item, getRecursionList());
private bool remove(T item, HashSet> appliedInstances)
{
@@ -224,7 +224,7 @@ private bool remove(T item, HashSet> appliedInstances)
/// The count of items to be removed.
public void RemoveRange(int index, int count)
{
- removeRange(index, count, new HashSet>());
+ removeRange(index, count, getRecursionList());
}
private void removeRange(int index, int count, HashSet> appliedInstances)
@@ -259,7 +259,7 @@ private void removeRange(int index, int count, HashSet> appliedI
/// The index of the item to remove.
/// Thrown if this is .
public void RemoveAt(int index)
- => removeAt(index, new HashSet>());
+ => removeAt(index, getRecursionList());
private void removeAt(int index, HashSet> appliedInstances)
{
@@ -285,7 +285,7 @@ private void removeAt(int index, HashSet> appliedInstances)
///
/// The predicate.
public int RemoveAll(Predicate match)
- => removeAll(match, new HashSet>());
+ => removeAll(match, getRecursionList());
private int removeAll(Predicate match, HashSet> appliedInstances)
{
@@ -319,7 +319,7 @@ private int removeAll(Predicate match, HashSet> appliedInstan
/// The count of items to be removed.
/// The items to replace the removed items with.
public void ReplaceRange(int index, int count, IEnumerable newItems)
- => replaceRange(index, count, newItems as IList ?? newItems.ToArray(), new HashSet>());
+ => replaceRange(index, count, newItems as IList ?? newItems.ToArray(), getRecursionList());
private void replaceRange(int index, int count, IList newItems, HashSet> appliedInstances)
{
@@ -542,7 +542,7 @@ public virtual void UnbindFrom(IUnbindable them)
/// The collection whose items should be added to this collection.
/// Thrown if this collection is
public void AddRange(IEnumerable items)
- => addRange(items as IList ?? items.ToArray(), new HashSet>());
+ => addRange(items as IList ?? items.ToArray(), getRecursionList());
private void addRange(IList items, HashSet> appliedInstances)
{
@@ -567,7 +567,7 @@ private void addRange(IList items, HashSet> appliedInstances)
/// The index of the item to move.
/// The index specifying the new location of the item.
public void Move(int oldIndex, int newIndex)
- => move(oldIndex, newIndex, new HashSet>());
+ => move(oldIndex, newIndex, getRecursionList());
private void move(int oldIndex, int newIndex, HashSet> appliedInstances)
{
@@ -691,5 +691,15 @@ private void ensureMutationAllowed()
public bool IsDefault => Count == 0;
string IFormattable.ToString(string format, IFormatProvider formatProvider) => ((FormattableString)$"{GetType().ReadableName()}({nameof(Count)}={Count})").ToString(formatProvider);
+
+ [ThreadStatic]
+ private static HashSet> recursionList;
+
+ private static HashSet> getRecursionList()
+ {
+ recursionList ??= new HashSet>();
+ recursionList.Clear();
+ return recursionList;
+ }
}
}
diff --git a/osu.Framework/Graphics/OpenGL/Buffers/GLShaderStorageBufferObject.cs b/osu.Framework/Graphics/OpenGL/Buffers/GLShaderStorageBufferObject.cs
index 4dff9b5314..ee4e3d88c9 100644
--- a/osu.Framework/Graphics/OpenGL/Buffers/GLShaderStorageBufferObject.cs
+++ b/osu.Framework/Graphics/OpenGL/Buffers/GLShaderStorageBufferObject.cs
@@ -2,7 +2,9 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Diagnostics;
using System.Runtime.InteropServices;
+using osu.Framework.Development;
using osu.Framework.Graphics.Rendering;
using osuTK.Graphics.ES30;
@@ -20,6 +22,8 @@ internal class GLShaderStorageBufferObject : IShaderStorageBufferObject : IUniformBuffer, IGLUniformBuffer
public GLUniformBuffer(GLRenderer renderer)
{
+ Trace.Assert(ThreadSafety.IsDrawThread);
+
this.renderer = renderer;
size = Marshal.SizeOf(default(TData));
diff --git a/osu.Framework/Graphics/Rendering/Deferred/DeferredShaderStorageBufferObject.cs b/osu.Framework/Graphics/Rendering/Deferred/DeferredShaderStorageBufferObject.cs
index 929f232656..c0628ae22d 100644
--- a/osu.Framework/Graphics/Rendering/Deferred/DeferredShaderStorageBufferObject.cs
+++ b/osu.Framework/Graphics/Rendering/Deferred/DeferredShaderStorageBufferObject.cs
@@ -2,7 +2,9 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Diagnostics;
using System.Runtime.CompilerServices;
+using osu.Framework.Development;
using osu.Framework.Graphics.Rendering.Deferred.Allocation;
using osu.Framework.Graphics.Rendering.Deferred.Events;
using osu.Framework.Graphics.Veldrid.Buffers;
@@ -22,6 +24,8 @@ internal class DeferredShaderStorageBufferObject : IShaderStorageBufferOb
public DeferredShaderStorageBufferObject(DeferredRenderer renderer, int ssboSize)
{
+ Trace.Assert(ThreadSafety.IsDrawThread);
+
this.renderer = renderer;
elementSize = Unsafe.SizeOf();
diff --git a/osu.Framework/Graphics/Rendering/Deferred/DeferredUniformBuffer.cs b/osu.Framework/Graphics/Rendering/Deferred/DeferredUniformBuffer.cs
index a8373115b4..194c688616 100644
--- a/osu.Framework/Graphics/Rendering/Deferred/DeferredUniformBuffer.cs
+++ b/osu.Framework/Graphics/Rendering/Deferred/DeferredUniformBuffer.cs
@@ -3,6 +3,8 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
+using osu.Framework.Development;
using osu.Framework.Graphics.Rendering.Deferred.Allocation;
using osu.Framework.Graphics.Rendering.Deferred.Events;
using osu.Framework.Graphics.Veldrid.Buffers;
@@ -24,6 +26,8 @@ internal class DeferredUniformBuffer : IUniformBuffer, IDeferredUn
public DeferredUniformBuffer(DeferredRenderer renderer)
{
+ Trace.Assert(ThreadSafety.IsDrawThread);
+
this.renderer = renderer;
}
diff --git a/osu.Framework/Graphics/Rendering/Dummy/DummyFrameBuffer.cs b/osu.Framework/Graphics/Rendering/Dummy/DummyFrameBuffer.cs
index 519893bf8b..f4a1d18a1e 100644
--- a/osu.Framework/Graphics/Rendering/Dummy/DummyFrameBuffer.cs
+++ b/osu.Framework/Graphics/Rendering/Dummy/DummyFrameBuffer.cs
@@ -26,7 +26,7 @@ public Vector2 Size
public DummyFrameBuffer(IRenderer renderer)
{
- Texture = new Texture(new DummyNativeTexture(renderer), WrapMode.None, WrapMode.None);
+ Texture = new Texture(new DummyNativeTexture(renderer, 1, 1), WrapMode.None, WrapMode.None);
}
public void Bind()
diff --git a/osu.Framework/Graphics/Rendering/Dummy/DummyNativeTexture.cs b/osu.Framework/Graphics/Rendering/Dummy/DummyNativeTexture.cs
index 36f07a96ea..c014cc44b9 100644
--- a/osu.Framework/Graphics/Rendering/Dummy/DummyNativeTexture.cs
+++ b/osu.Framework/Graphics/Rendering/Dummy/DummyNativeTexture.cs
@@ -14,8 +14,8 @@ internal class DummyNativeTexture : INativeTexture
public string Identifier => string.Empty;
public int MaxSize => 4096; // Sane default for testing purposes.
- public int Width { get; set; } = 1;
- public int Height { get; set; } = 1;
+ public int Width { get; set; }
+ public int Height { get; set; }
public int? MipLevel { get; set; }
public bool Available => true;
public bool BypassTextureUploadQueueing { get; set; }
@@ -23,9 +23,11 @@ internal class DummyNativeTexture : INativeTexture
public bool IsQueuedForUpload { get; set; }
ulong INativeTexture.TotalBindCount { get; set; }
- public DummyNativeTexture(IRenderer renderer)
+ public DummyNativeTexture(IRenderer renderer, int width, int height)
{
Renderer = renderer;
+ Width = width;
+ Height = height;
}
public void FlushUploads()
diff --git a/osu.Framework/Graphics/Rendering/Dummy/DummyRenderer.cs b/osu.Framework/Graphics/Rendering/Dummy/DummyRenderer.cs
index 04783126cb..0dff42beb4 100644
--- a/osu.Framework/Graphics/Rendering/Dummy/DummyRenderer.cs
+++ b/osu.Framework/Graphics/Rendering/Dummy/DummyRenderer.cs
@@ -1,245 +1,142 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using System;
using osu.Framework.Graphics.Primitives;
-using osu.Framework.Graphics.Rendering.Vertices;
using osu.Framework.Graphics.Shaders;
using osu.Framework.Graphics.Textures;
using osu.Framework.Platform;
-using osu.Framework.Threading;
-using osuTK;
using osuTK.Graphics;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
-using RectangleF = osu.Framework.Graphics.Primitives.RectangleF;
namespace osu.Framework.Graphics.Rendering.Dummy
{
///
/// An that does nothing. May be used for tests that don't have a visual output.
///
- public sealed class DummyRenderer : IRenderer
+ public sealed class DummyRenderer : Renderer
{
- public int MaxTextureSize => int.MaxValue;
- public int MaxTexturesUploadedPerFrame { get; set; } = int.MaxValue;
- public int MaxPixelsUploadedPerFrame { get; set; } = int.MaxValue;
+ protected internal override bool VerticalSync { get; set; } = true;
+ protected internal override bool AllowTearing { get; set; }
+ public override bool IsDepthRangeZeroToOne => true;
+ public override bool IsUvOriginTopLeft => true;
+ public override bool IsClipSpaceYInverted => true;
- public bool IsDepthRangeZeroToOne => true;
- public bool IsUvOriginTopLeft => true;
- public bool IsClipSpaceYInverted => true;
- public ref readonly MaskingInfo CurrentMaskingInfo => ref maskingInfo;
- private readonly MaskingInfo maskingInfo;
+ protected internal override Image TakeScreenshot()
+ => new Image(1, 1);
- public RectangleI Viewport => RectangleI.Empty;
- public RectangleF Ortho => RectangleF.Empty;
- public RectangleI Scissor => RectangleI.Empty;
- public Vector2I ScissorOffset => Vector2I.Zero;
- public Matrix4 ProjectionMatrix => Matrix4.Identity;
- public DepthInfo CurrentDepthInfo => DepthInfo.Default;
- public StencilInfo CurrentStencilInfo => StencilInfo.Default;
- public WrapMode CurrentWrapModeS => WrapMode.None;
- public WrapMode CurrentWrapModeT => WrapMode.None;
- public bool IsMaskingActive => false;
- public bool UsingBackbuffer => false;
- public Texture WhitePixel { get; }
- DepthValue IRenderer.BackbufferDepth { get; } = new DepthValue();
-
- public bool IsInitialised { get; private set; }
-
- public DummyRenderer()
- {
- maskingInfo = default;
- WhitePixel = new TextureWhitePixel(new Texture(new DummyNativeTexture(this), WrapMode.None, WrapMode.None));
- }
-
- public ulong FrameIndex { get; private set; }
-
- bool IRenderer.VerticalSync { get; set; } = true;
-
- bool IRenderer.AllowTearing { get; set; }
-
- Storage? IRenderer.CacheStorage { set { } }
+ protected override IShaderPart CreateShaderPart(IShaderStore store, string name, byte[]? rawData, ShaderPartType partType)
+ => new DummyShaderPart();
- void IRenderer.Initialise(IGraphicsSurface graphicsSurface)
- {
- IsInitialised = true;
- }
+ protected override IShader CreateShader(string name, IShaderPart[] parts, ShaderCompilationStore compilationStore)
+ => new DummyShader(this);
- void IRenderer.BeginFrame(Vector2 windowSize)
- {
- FrameIndex++;
- }
+ protected override IVertexBatch CreateLinearBatch(int size, int maxBuffers, PrimitiveTopology topology)
+ => new DummyVertexBatch();
- void IRenderer.FinishFrame()
- {
- }
+ protected override IVertexBatch CreateQuadBatch(int size, int maxBuffers)
+ => new DummyVertexBatch();
- void IRenderer.FlushCurrentBatch(FlushBatchSource? source)
- {
- }
+ protected override IUniformBuffer CreateUniformBuffer()
+ => new DummyUniformBuffer();
- void IRenderer.SwapBuffers()
- {
- }
+ protected override IShaderStorageBufferObject CreateShaderStorageBufferObject(int uboSize, int ssboSize)
+ => new DummyShaderStorageBufferObject(ssboSize);
- void IRenderer.WaitUntilIdle()
- {
- }
+ public Texture CreateTexture(int width, int height, bool manualMipmaps = false, TextureFilteringMode filteringMode = TextureFilteringMode.Linear, WrapMode wrapModeS = WrapMode.None)
+ => base.CreateTexture(width, height, manualMipmaps, filteringMode, wrapModeS, wrapModeS, null);
- void IRenderer.WaitUntilNextFrameReady()
- {
- }
+ protected override INativeTexture CreateNativeTexture(int width, int height, bool manualMipmaps = false, TextureFilteringMode filteringMode = TextureFilteringMode.Linear,
+ Color4? initialisationColour = null)
+ => new DummyNativeTexture(this, width, height);
- void IRenderer.MakeCurrent()
- {
- }
+ protected override INativeTexture CreateNativeVideoTexture(int width, int height)
+ => new DummyNativeTexture(this, width, height);
- void IRenderer.ClearCurrent()
+ protected override void Initialise(IGraphicsSurface graphicsSurface)
{
}
- public bool BindTexture(Texture texture, int unit = 0, WrapMode? wrapModeS = null, WrapMode? wrapModeT = null)
- => true;
-
- public void UseProgram(IShader? shader)
+ protected internal override void SwapBuffers()
{
}
- public void Clear(ClearInfo clearInfo)
+ protected internal override void WaitUntilIdle()
{
}
- public void PushScissorState(bool enabled)
+ protected internal override void WaitUntilNextFrameReady()
{
}
- public void PopScissorState()
+ protected internal override void MakeCurrent()
{
}
- public void SetBlend(BlendingParameters blendingParameters)
+ protected internal override void ClearCurrent()
{
}
- public void SetBlendMask(BlendingMask blendingMask)
+ protected override void ClearImplementation(ClearInfo clearInfo)
{
}
- public void PushViewport(RectangleI viewport)
+ protected override void SetBlendImplementation(BlendingParameters blendingParameters)
{
}
- public void PopViewport()
+ protected override void SetBlendMaskImplementation(BlendingMask blendingMask)
{
}
- public void PushScissor(RectangleI scissor)
+ protected override void SetViewportImplementation(RectangleI viewport)
{
}
- public void PopScissor()
+ protected override void SetScissorImplementation(RectangleI scissor)
{
}
- public void PushScissorOffset(Vector2I offset)
+ protected override void SetScissorStateImplementation(bool enabled)
{
}
- public void PopScissorOffset()
+ protected override void SetDepthInfoImplementation(DepthInfo depthInfo)
{
}
- public void PushProjectionMatrix(Matrix4 matrix)
+ protected override void SetStencilInfoImplementation(StencilInfo stencilInfo)
{
}
- public void PopProjectionMatrix()
- {
- }
+ protected override bool SetTextureImplementation(INativeTexture? texture, int unit)
+ => true;
- public void PushMaskingInfo(in MaskingInfo maskingInfo, bool overwritePreviousScissor = false)
+ protected override void SetFrameBufferImplementation(IFrameBuffer? frameBuffer)
{
}
- public void PopMaskingInfo()
+ protected override void DeleteFrameBufferImplementation(IFrameBuffer frameBuffer)
{
}
- public void PushDepthInfo(DepthInfo depthInfo)
+ public override void DrawVerticesImplementation(PrimitiveTopology topology, int vertexStart, int verticesCount)
{
}
- public void PopDepthInfo()
+ protected override void SetShaderImplementation(IShader shader)
{
}
- public void PushStencilInfo(StencilInfo stencilInfo)
+ protected override void SetUniformImplementation(IUniformWithValue uniform)
{
}
- public void PopStencilInfo()
+ protected override void SetUniformBufferImplementation(string blockName, IUniformBuffer buffer)
{
}
- public void ScheduleExpensiveOperation(ScheduledDelegate operation) => operation.RunTask();
-
- public void ScheduleDisposal(Action disposalAction, T target) => disposalAction(target);
-
- Image IRenderer.TakeScreenshot() => new Image(1366, 768);
-
- IShaderPart IRenderer.CreateShaderPart(IShaderStore manager, string name, byte[]? rawData, ShaderPartType partType)
- => new DummyShaderPart();
-
- IShader IRenderer.CreateShader(string name, IShaderPart[] parts)
- => new DummyShader(this);
-
- public IFrameBuffer CreateFrameBuffer(RenderBufferFormat[]? renderBufferFormats = null, TextureFilteringMode filteringMode = TextureFilteringMode.Linear)
+ public override IFrameBuffer CreateFrameBuffer(RenderBufferFormat[]? renderBufferFormats = null, TextureFilteringMode filteringMode = TextureFilteringMode.Linear)
=> new DummyFrameBuffer(this);
-
- public Texture CreateTexture(int width, int height, bool manualMipmaps = false, TextureFilteringMode filteringMode = TextureFilteringMode.Linear, WrapMode wrapModeS = WrapMode.None,
- WrapMode wrapModeT = WrapMode.None, Color4? initialisationColour = null)
- => new Texture(new DummyNativeTexture(this) { Width = width, Height = height }, wrapModeS, wrapModeT);
-
- public Texture CreateVideoTexture(int width, int height)
- => CreateTexture(width, height);
-
- public IVertexBatch CreateLinearBatch(int size, int maxBuffers, PrimitiveTopology topology) where TVertex : unmanaged, IEquatable, IVertex
- => new DummyVertexBatch();
-
- public IVertexBatch CreateQuadBatch(int size, int maxBuffers) where TVertex : unmanaged, IEquatable, IVertex
- => new DummyVertexBatch();
-
- public IUniformBuffer CreateUniformBuffer() where TData : unmanaged, IEquatable
- => new DummyUniformBuffer();
-
- public IShaderStorageBufferObject CreateShaderStorageBufferObject(int uboSize, int ssboSize) where TData : unmanaged, IEquatable
- => new DummyShaderStorageBufferObject(ssboSize);
-
- void IRenderer.SetUniform(IUniformWithValue uniform)
- {
- }
-
- IVertexBatch IRenderer.DefaultQuadBatch => new DummyVertexBatch();
-
- void IRenderer.PushQuadBatch(IVertexBatch quadBatch)
- {
- }
-
- void IRenderer.PopQuadBatch()
- {
- }
-
- event Action? IRenderer.TextureCreated
- {
- add
- {
- }
- remove
- {
- }
- }
-
- Texture[] IRenderer.GetAllTextures() => Array.Empty();
}
}
diff --git a/osu.Framework/Graphics/Rendering/Renderer.cs b/osu.Framework/Graphics/Rendering/Renderer.cs
index cf8a4d43ea..8066d379ed 100644
--- a/osu.Framework/Graphics/Rendering/Renderer.cs
+++ b/osu.Framework/Graphics/Rendering/Renderer.cs
@@ -793,6 +793,8 @@ public bool BindTexture(Texture texture, int unit, WrapMode? wrapModeS, WrapMode
if (texture is TextureWhitePixel && lastBoundTextureIsAtlas[unit])
{
+ setWrapMode(wrapModeS ?? texture.WrapModeS, wrapModeT ?? texture.WrapModeT);
+
// We can use the special white space from any atlas texture.
return true;
}
@@ -823,26 +825,35 @@ public bool BindTexture(INativeTexture texture, int unit = 0, WrapMode wrapModeS
if (!SetTextureImplementation(texture, unit))
return false;
+ setWrapMode(wrapModeS, wrapModeT);
+
+ lastBoundTexture[unit] = texture;
+ lastBoundTextureIsAtlas[unit] = false;
+ lastActiveTextureUnit = unit;
+
+ FrameStatistics.Increment(StatisticsCounterType.TextureBinds);
+ texture.TotalBindCount++;
+
+ return true;
+ }
+
+ private void setWrapMode(WrapMode wrapModeS, WrapMode wrapModeT)
+ {
if (wrapModeS != CurrentWrapModeS)
{
+ FlushCurrentBatch(FlushBatchSource.BindTexture);
+
CurrentWrapModeS = wrapModeS;
globalUniformsChanged = true;
}
if (wrapModeT != CurrentWrapModeT)
{
+ FlushCurrentBatch(FlushBatchSource.BindTexture);
+
CurrentWrapModeT = wrapModeT;
globalUniformsChanged = true;
}
-
- lastBoundTexture[unit] = texture;
- lastBoundTextureIsAtlas[unit] = false;
- lastActiveTextureUnit = unit;
-
- FrameStatistics.Increment(StatisticsCounterType.TextureBinds);
- texture.TotalBindCount++;
-
- return true;
}
///
@@ -1252,8 +1263,6 @@ IShaderStorageBufferObject IRenderer.CreateShaderStorageBufferObject()
{
- Trace.Assert(ThreadSafety.IsDrawThread);
-
if (validUboTypes.Contains(typeof(TData)))
return;
diff --git a/osu.Framework/Graphics/Veldrid/Buffers/VeldridShaderStorageBufferObject.cs b/osu.Framework/Graphics/Veldrid/Buffers/VeldridShaderStorageBufferObject.cs
index 8f5949ce11..25caaa4474 100644
--- a/osu.Framework/Graphics/Veldrid/Buffers/VeldridShaderStorageBufferObject.cs
+++ b/osu.Framework/Graphics/Veldrid/Buffers/VeldridShaderStorageBufferObject.cs
@@ -2,7 +2,9 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Diagnostics;
using System.Runtime.InteropServices;
+using osu.Framework.Development;
using osu.Framework.Graphics.Rendering;
using Veldrid;
@@ -20,6 +22,8 @@ internal class VeldridShaderStorageBufferObject : IShaderStorageBufferObj
public VeldridShaderStorageBufferObject(VeldridRenderer renderer, int uboSize, int ssboSize)
{
+ Trace.Assert(ThreadSafety.IsDrawThread);
+
this.renderer = renderer;
elementSize = (uint)Marshal.SizeOf(default(TData));
diff --git a/osu.Framework/Graphics/Veldrid/Buffers/VeldridUniformBuffer.cs b/osu.Framework/Graphics/Veldrid/Buffers/VeldridUniformBuffer.cs
index 2bd4cccf7f..2d72dd26b5 100644
--- a/osu.Framework/Graphics/Veldrid/Buffers/VeldridUniformBuffer.cs
+++ b/osu.Framework/Graphics/Veldrid/Buffers/VeldridUniformBuffer.cs
@@ -3,6 +3,8 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
+using osu.Framework.Development;
using osu.Framework.Graphics.Rendering;
using osu.Framework.Statistics;
using Veldrid;
@@ -37,6 +39,8 @@ internal class VeldridUniformBuffer : IUniformBuffer, IVeldridUnif
public VeldridUniformBuffer(VeldridRenderer renderer)
{
+ Trace.Assert(ThreadSafety.IsDrawThread);
+
this.renderer = renderer;
storages.Add(new VeldridUniformBufferStorage(this.renderer));
}
diff --git a/osu.Framework/Input/PassThroughInputManager.cs b/osu.Framework/Input/PassThroughInputManager.cs
index 587993ad9a..82cce921ea 100644
--- a/osu.Framework/Input/PassThroughInputManager.cs
+++ b/osu.Framework/Input/PassThroughInputManager.cs
@@ -173,6 +173,18 @@ protected override bool Handle(UIEvent e)
return false;
}
+ protected override void Update()
+ {
+ base.Update();
+
+ // There are scenarios wherein we cannot receive the release events of pressed inputs. For simplicity, sync every frame.
+ if (UseParentInput)
+ {
+ syncReleasedInputs();
+ syncJoystickAxes();
+ }
+ }
+
///
/// Updates state of any buttons that have been released by parent while was disabled.
///
diff --git a/osu.Framework/Platform/MacOS/SDL3MacOSWindow.cs b/osu.Framework/Platform/MacOS/SDL3MacOSWindow.cs
index a316eaf640..d3f8f2a619 100644
--- a/osu.Framework/Platform/MacOS/SDL3MacOSWindow.cs
+++ b/osu.Framework/Platform/MacOS/SDL3MacOSWindow.cs
@@ -35,7 +35,7 @@ public override void Create()
base.Create();
// replace [SDLView scrollWheel:(NSEvent *)] with our own version
- IntPtr viewClass = Class.Get("SDLView");
+ IntPtr viewClass = Class.Get("SDL3View");
scrollWheelHandler = scrollWheel;
originalScrollWheel = Class.SwizzleMethod(viewClass, "scrollWheel:", "v@:@", scrollWheelHandler);
}
diff --git a/osu.Framework/Platform/SDL3/SDL3GraphicsSurface.cs b/osu.Framework/Platform/SDL3/SDL3GraphicsSurface.cs
index e7ff451d17..590c79b504 100644
--- a/osu.Framework/Platform/SDL3/SDL3GraphicsSurface.cs
+++ b/osu.Framework/Platform/SDL3/SDL3GraphicsSurface.cs
@@ -224,7 +224,7 @@ bool IOpenGLGraphicsSurface.VerticalSync
#region Android-specific implementation
[SupportedOSPlatform("android")]
- IntPtr IAndroidGraphicsSurface.JniEnvHandle => SDL_AndroidGetJNIEnv();
+ IntPtr IAndroidGraphicsSurface.JniEnvHandle => SDL_GetAndroidJNIEnv();
[SupportedOSPlatform("android")]
IntPtr IAndroidGraphicsSurface.SurfaceHandle => window.SurfaceHandle;
diff --git a/osu.Framework/Platform/SDL3/SDL3ReadableKeyCombinationProvider.cs b/osu.Framework/Platform/SDL3/SDL3ReadableKeyCombinationProvider.cs
index 231ff18c4c..b2e431a6ba 100644
--- a/osu.Framework/Platform/SDL3/SDL3ReadableKeyCombinationProvider.cs
+++ b/osu.Framework/Platform/SDL3/SDL3ReadableKeyCombinationProvider.cs
@@ -14,7 +14,7 @@ public class SDL3ReadableKeyCombinationProvider : ReadableKeyCombinationProvider
private static SDL_Keycode getKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate)
{
if (FrameworkEnvironment.UseSDL3)
- return SDL_GetKeyFromScancode(scancode, modstate);
+ return SDL_GetKeyFromScancode(scancode, modstate, SDL_FALSE); // third parameter is not useful unless SDL_HINT_KEYCODE_OPTIONS is set
return (SDL_Keycode)global::SDL2.SDL.SDL_GetKeyFromScancode((global::SDL2.SDL.SDL_Scancode)scancode);
}
diff --git a/osu.Framework/Platform/SDL3/SDL3Window.cs b/osu.Framework/Platform/SDL3/SDL3Window.cs
index 184ca2e916..b525030365 100644
--- a/osu.Framework/Platform/SDL3/SDL3Window.cs
+++ b/osu.Framework/Platform/SDL3/SDL3Window.cs
@@ -93,11 +93,11 @@ public IntPtr WindowHandle
switch (RuntimeInfo.OS)
{
case RuntimeInfo.Platform.Windows:
- return SDL_GetProperty(props, SDL_PROP_WINDOW_WIN32_HWND_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WIN32_HWND_POINTER, IntPtr.Zero);
case RuntimeInfo.Platform.Linux:
if (IsWayland)
- return SDL_GetProperty(props, SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, IntPtr.Zero);
if (SDL_GetCurrentVideoDriver() == "x11")
return new IntPtr(SDL_GetNumberProperty(props, SDL_PROP_WINDOW_X11_WINDOW_NUMBER, 0));
@@ -105,13 +105,13 @@ public IntPtr WindowHandle
return IntPtr.Zero;
case RuntimeInfo.Platform.macOS:
- return SDL_GetProperty(props, SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, IntPtr.Zero);
case RuntimeInfo.Platform.iOS:
- return SDL_GetProperty(props, SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER, IntPtr.Zero);
case RuntimeInfo.Platform.Android:
- return SDL_GetProperty(props, SDL_PROP_WINDOW_ANDROID_WINDOW_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_ANDROID_WINDOW_POINTER, IntPtr.Zero);
default:
throw new ArgumentOutOfRangeException();
@@ -130,10 +130,10 @@ public IntPtr DisplayHandle
var props = SDL_GetWindowProperties(SDLWindowHandle);
if (IsWayland)
- return SDL_GetProperty(props, SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, IntPtr.Zero);
if (SDL_GetCurrentVideoDriver() == "x11")
- return SDL_GetProperty(props, SDL_PROP_WINDOW_X11_DISPLAY_POINTER, IntPtr.Zero);
+ return SDL_GetPointerProperty(props, SDL_PROP_WINDOW_X11_DISPLAY_POINTER, IntPtr.Zero);
return IntPtr.Zero;
}
diff --git a/osu.Framework/Platform/SDL3/SDL3Window_Windowing.cs b/osu.Framework/Platform/SDL3/SDL3Window_Windowing.cs
index 56aef6b4a4..4b4c0ba954 100644
--- a/osu.Framework/Platform/SDL3/SDL3Window_Windowing.cs
+++ b/osu.Framework/Platform/SDL3/SDL3Window_Windowing.cs
@@ -872,32 +872,32 @@ private static unsafe SDL_DisplayMode getClosestDisplayMode(SDL_Window* windowHa
if (size.Width == 9999 && size.Height == 9999)
size = display.Bounds.Size;
- var mode = SDL_GetClosestFullscreenDisplayMode(displayID, size.Width, size.Height, requestedMode.RefreshRate, SDL_bool.SDL_TRUE);
- if (mode != null)
- return *mode;
+ SDL_DisplayMode mode;
+
+ if (SDL_GetClosestFullscreenDisplayMode(displayID, size.Width, size.Height, requestedMode.RefreshRate, SDL_bool.SDL_TRUE, &mode) == 0)
+ return mode;
Logger.Log(
$"Unable to get preferred display mode (try #1/2). Target display: {display.Index}, mode: {size.Width}x{size.Height}@{requestedMode.RefreshRate}. SDL error: {SDL3Extensions.GetAndClearError()}");
// fallback to current display's native bounds
- mode = SDL_GetClosestFullscreenDisplayMode(displayID, display.Bounds.Width, display.Bounds.Height, 0f, SDL_bool.SDL_TRUE);
- if (mode != null)
- return *mode;
+ if (SDL_GetClosestFullscreenDisplayMode(displayID, display.Bounds.Width, display.Bounds.Height, 0f, SDL_bool.SDL_TRUE, &mode) != 0)
+ return mode;
Logger.Log(
$"Unable to get preferred display mode (try #2/2). Target display: {display.Index}, mode: {display.Bounds.Width}x{display.Bounds.Height}@default. SDL error: {SDL3Extensions.GetAndClearError()}");
// try the display's native display mode.
- mode = SDL_GetDesktopDisplayMode(displayID);
- if (mode != null)
- return *mode;
+ var modePtr = SDL_GetDesktopDisplayMode(displayID);
+ if (modePtr != null)
+ return *modePtr;
Logger.Log($"Failed to get desktop display mode (try #1/1). Target display: {display.Index}. SDL error: {SDL3Extensions.GetAndClearError()}", level: LogLevel.Error);
// finally return the current mode if everything else fails.
- mode = SDL_GetWindowFullscreenMode(windowHandle);
- if (mode != null)
- return *mode;
+ modePtr = SDL_GetWindowFullscreenMode(windowHandle);
+ if (modePtr != null)
+ return *modePtr;
Logger.Log($"Failed to get window display mode. SDL error: {SDL3Extensions.GetAndClearError()}", level: LogLevel.Error);
diff --git a/osu.Framework/osu.Framework.csproj b/osu.Framework/osu.Framework.csproj
index fdea6c4c03..3bc71f301b 100644
--- a/osu.Framework/osu.Framework.csproj
+++ b/osu.Framework/osu.Framework.csproj
@@ -29,7 +29,7 @@
-
+
@@ -40,7 +40,7 @@
-
+