Adopt winnerspiros forks v2026.421.1, sync ppy/osu, document ANGLE on Android - #223
Conversation
….Veldrid 4.9.111 is not available) Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/9ae527b9-d18a-4228-8dbb-db9a3256bcba Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
…6.0 (ppy.Veldrid 4.9.111 is not available)" This reverts commit 8bae626. Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Similar implementation to `BundledBeatmapDownloader`. The notification should not be cancellable, but there's no easy way to do that right now other than hiding the notification altogether. The beatmap availability status visible on the corner pieces is probably a little too small/hides importance, but that will be addressed later to make up for this.
- Updates ppy.osu.Framework/Android/iOS from 2026.420.3 → 2026.421.1 (latest winnerspiros fork release with D3D12 backend, new BackendInfo APIs for D3D11/D3D12/Metal/OpenGL/Vulkan, Low-Latency infrastructure hooks, raw keyboard / async key handling, and the FrameSync.UVSync + FrameSync.Custom frame-limiter additions). - New `CustomDrawLimit` (0–1000 Hz) bindable from the fork is exposed as a slider in Settings → Graphics → Renderer, shown only when the frame limiter is set to Custom, to match the upstream PR ppy#6725 UX. - `RendererType.Direct3D12` / `Deferred_Direct3D12` and `LatencyMode` continue to flow automatically through the existing enum dropdowns. Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/b4d1b445-45fd-4076-9286-bc15ad8d0886 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
… + ANGLE doc - Merged ppy/osu master (ranked-play fixes ppy#37439 disable-discord-invites and ppy#37444 hide-beatmap-download-notification). - Overhauled the "osu-framework fork changes" and "Veldrid fork changes" sections of README.md to reflect v2026.421.1 reality: D3D12 backend, public BackendInfo* APIs, ILowLatencyProvider + LatencyMode, FrameSync UVSync/Custom + CustomDrawLimit slider, raw keyboard + async keys, API 33 min, 16 KB page alignment, Android stability guards. - Replaced the stale "Framework as submodule" docs with the current NuGet consumption flow and updated the Clone/Build instructions accordingly. - Added a new "Rendering tuning" table covering all fork-added Settings → Graphics → Renderer options exposed to users. - Added an "ANGLE on Android (advanced / experimental)" section with step -by-step Developer-Options and ADB instructions, noting why a first-class renderer-dropdown entry belongs upstream in osu-framework (new RendererType + bundled ANGLE libs). Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/b4d1b445-45fd-4076-9286-bc15ad8d0886 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
`ppy.osu.Framework 2026.421.1` declares a dependency on `ppy.Veldrid.SPIRV (>= 1.0.15-gb268bf39ea)`, which is a winnerspiros fork build that was never published to any NuGet feed. NuGet correctly resolves to the nearest available version (`1.0.15-gb66ebf81d2` on nuget.org) and emits warning NU1603. The Code Quality and Test CI jobs use `-warnaserror`, so the warning becomes 22–66 build errors per job. Fix: add an explicit `<PackageReference>` for `ppy.Veldrid.SPIRV` at a published version in `osu.Game.csproj`. This makes the resolution deterministic, silences NU1603, and flows transitively to every other project in the solution. The pinned version is binary-compatible with what the framework expects. Android/iOS build-only jobs were unaffected because they don't use `-warnaserror`. Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/1d1c5bf8-4c9c-40e3-8d0f-34b9cde1a32c Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
The previous pin to `1.0.15-gb66ebf81d2` was the ppy.org build, whose `runtimes/android-arm64/native/libveldrid-spirv.so` is 4 KB-aligned and triggers the "Android 16 will require 16 KB page sizes" warning when packaging the APK. The winnerspiros fork build `1.0.15-gb268bf39ea` (the version ppy.osu.Framework 2026.421.1 was originally compiled against) is properly 16 KB-aligned, but it lives only as a release asset on `winnerspiros/veldrid-spirv` (release `1.0`) — it is not on nuget.org or GitHub Packages, so NuGet was silently falling back to the ppy build. Vendor the correct nupkg under `local-packages/` (with a `.gitignore` exception so it's tracked despite the root `*.nupkg` rule) and re-add the `local-packages` source to `NuGet.Config`. Re-pin the SPIRV reference in `osu.Game.csproj` to the fork version. The pin flows transitively to every project via existing ProjectReferences. Verified: ELF PT_LOAD segments in the vendored .so are aligned to 0x4000 (16 KB). Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/dd5477f1-781f-483e-a69a-835fd8edac93 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Updates this fork to consume the latest winnerspiros framework packages (v2026.421.1), vendors a 16KB-page-aligned ppy.Veldrid.SPIRV build for Android, and updates in-game/UI/docs to reflect new rendering and matchmaking-related APIs.
Changes:
- Bump
ppy.osu.Framework(incl. Android/iOS) to2026.421.1and pin vendoredppy.Veldrid.SPIRV1.0.15-gb268bf39eavialocal-packages/. - Add a “Custom draw rate limit” setting (UI + localisation) and wire visibility to
FrameSync.Custom. - Adjust online/multiplayer logic and docs (matchmaking type check, ANGLE-on-Android documentation, NuGet source configuration).
Reviewed changes
Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| osu.iOS.props | Bumps iOS framework package to 2026.421.1. |
| osu.Android.props | Bumps Android framework package to 2026.421.1. |
| osu.Game/osu.Game.csproj | Bumps framework, pins vendored ppy.Veldrid.SPIRV, adds explanatory comment. |
| osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/RankedPlayBeatmapAvailabilityTracker.cs | Introduces custom DI wiring for BeatmapModelDownloader. |
| osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs | Adds “Custom draw rate limit” slider and conditional visibility binding. |
| osu.Game/Localisation/GraphicsSettingsStrings.cs | Adds localisation string for custom draw limit caption. |
| osu.Desktop/DiscordRichPresence.cs | Uses MatchType.IsMatchmakingType() for matchmaking checks. |
| local-packages/README.md | Documents vendored NuGet workflow and package rationale. |
| local-packages/.gitignore | Allows committing .nupkg files under local-packages/. |
| README.md | Documents ANGLE on Android and updated fork/framework details. |
| NuGet.Config | Adds local-packages as a NuGet package source. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| pages (required by Android 16+). It lives only as a release asset on | ||
| <https://github.com/winnerspiros/veldrid-spirv/releases/tag/1.0> and is vendored | ||
| under `local-packages/` (see `local-packages/README.md`). Without this pin NuGet | ||
| would silently fall back to the 4 KB-aligned nuget.org build and emit NU1903. |
There was a problem hiding this comment.
The comment says NuGet would “emit NU1903” if it falls back to the nuget.org build. NU1903 is a vulnerability warning already being suppressed for AutoMapper above, and it’s unrelated to the Android ELF page-size alignment issue described here. Please update this comment to reference the actual warning/behavior being avoided (or keep it generic) so readers aren’t misled about what NU1903 means/where it comes from.
| would silently fall back to the 4 KB-aligned nuget.org build and emit NU1903. | |
| would silently fall back to the 4 KB-aligned nuget.org build instead. |
| protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) | ||
| { | ||
| var dependencies = new DependencyContainer(base.CreateChildDependencies(parent)); | ||
| dependencies.CacheAs(beatmapDownloader = new BeatmapModelDownloader(parent.Get<BeatmapManager>(), parent.Get<IAPIProvider>())); |
There was a problem hiding this comment.
CreateChildDependencies() builds BeatmapModelDownloader using parent.Get<…>(). This bypasses any overrides/caches added by base.CreateChildDependencies(parent) (for example, tests can cache a dummy IAPIProvider in the child container). It can also lead to BeatmapModelDownloader using a different BeatmapManager/IAPIProvider than the ones resolved into this drawable. Use the base child container (or the new dependencies container) to resolve BeatmapManager/IAPIProvider instead of parent when constructing the downloader.
| dependencies.CacheAs(beatmapDownloader = new BeatmapModelDownloader(parent.Get<BeatmapManager>(), parent.Get<IAPIProvider>())); | |
| dependencies.CacheAs(beatmapDownloader = new BeatmapModelDownloader(dependencies.Get<BeatmapManager>(), dependencies.Get<IAPIProvider>())); |
What changed in this commit
ppy.Veldrid.SPIRV.1.0.15-gb268bf39ea.nupkg(the winnerspiros 16 KB-aligned fork build) underlocal-packages/and pinned it inosu.Game.csproj. Verified ELFPT_LOADalignment =0x4000. Re-addedlocal-packagessource inNuGet.Configwith alocal-packages/README.mdexplaining the workflow.1.0.15-gb66ebf81d2was the ppy.org build with 4 KB pages — that is what was triggering the warning the user flagged).Diagnosis of the other two issues (no code change)
.github/workflows/); it runsfind . -name "*.csproj" | head -20thendotnet restoreon each. The first hit alphabetically isosu.Game.Rulesets.Taiko.Tests.iOS.csproj, which needs thewasm-toolsworkload that the auto-injected runner never installs → fails with NETSDK1147 every time, on every commit, long before this PR. Recommended fix (not code): repo Settings → Code security & analysis → Dependency graph → toggle off Automatic dependency submission. Adding our own scoped workflow was considered but I'd rather verify the action's options on a separate PR than risk a new red check.Teststep inci.ymlhascontinue-on-error: trueand only the job hastimeout-minutes: 120; no per-step timeout. So whenever something insidedotnet testhangs (or just runs slowly on the slower Windows runners), the step sits until the 2-h job-level cap. Linux SingleThread genuinely took ~52 min in the same run, so any per-step cap below 60 min would create false negatives. Recommended fix (not code): if Windows test slowness keeps recurring, raise/redo the test job with--blame-hang-timeoutto get a dump of the hung test, then size a per-steptimeout-minutesaccordingly. Out of scope for this PR.Other CI work in this PR (already merged in earlier commits)
-warnaserrorbuild failures inCode Qualityand all 4Testjobsppy.osu.Framework/.Android/.iOSto v2026.421.1ppy/osumaster (Disable discord invites for ranked play ppy/osu#37439, Hide beatmap download notification in ranked play ppy/osu#37444)Next
parallel_validationafter CI shows the new commit is green (or at least the page-size warning is gone)