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 @@ - +