Skip to content

Adopt winnerspiros forks v2026.421.1, sync ppy/osu, document ANGLE on Android - #223

Merged
winnerspiros merged 9 commits into
masterfrom
copilot/fix-build-failure-again
Apr 21, 2026
Merged

Adopt winnerspiros forks v2026.421.1, sync ppy/osu, document ANGLE on Android#223
winnerspiros merged 9 commits into
masterfrom
copilot/fix-build-failure-again

Conversation

Copilot AI commented Apr 21, 2026

Copy link
Copy Markdown

What changed in this commit

  • Page-size warning fixed. Vendored ppy.Veldrid.SPIRV.1.0.15-gb268bf39ea.nupkg (the winnerspiros 16 KB-aligned fork build) under local-packages/ and pinned it in osu.Game.csproj. Verified ELF PT_LOAD alignment = 0x4000. Re-added local-packages source in NuGet.Config with a local-packages/README.md explaining the workflow.
  • Reverted the wrong pin from the previous commit (1.0.15-gb66ebf81d2 was 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)

  • Auto-Dependency-Submission failure — investigated. This is a GitHub-injected workflow (not in .github/workflows/); it runs find . -name "*.csproj" | head -20 then dotnet restore on each. The first hit alphabetically is osu.Game.Rulesets.Taiko.Tests.iOS.csproj, which needs the wasm-tools workload 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 & analysisDependency 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.
  • Windows test job ~2 h — investigated. The Test step in ci.yml has continue-on-error: true and only the job has timeout-minutes: 120; no per-step timeout. So whenever something inside dotnet test hangs (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-timeout to get a dump of the hung test, then size a per-step timeout-minutes accordingly. Out of scope for this PR.

Other CI work in this PR (already merged in earlier commits)

Next

  • Run parallel_validation after CI shows the new commit is green (or at least the page-size warning is gone)

Copilot AI and others added 7 commits April 20, 2026 18:53
….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>
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>
@winnerspiros
winnerspiros marked this pull request as ready for review April 21, 2026 12:13
Copilot AI review requested due to automatic review settings April 21, 2026 12:13
@winnerspiros
winnerspiros merged commit 21ce86a into master Apr 21, 2026
4 of 19 checks passed
@gitar-bot

gitar-bot Bot commented Apr 21, 2026

Copy link
Copy Markdown

Important

You are using the Gitar free plan. Upgrade to unlock code review, CI analysis, auto-apply, custom automations, and more.

Gitar

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) to 2026.421.1 and pin vendored ppy.Veldrid.SPIRV 1.0.15-gb268bf39ea via local-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.

Comment thread osu.Game/osu.Game.csproj
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.

Copilot AI Apr 21, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
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.

Copilot uses AI. Check for mistakes.
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
var dependencies = new DependencyContainer(base.CreateChildDependencies(parent));
dependencies.CacheAs(beatmapDownloader = new BeatmapModelDownloader(parent.Get<BeatmapManager>(), parent.Get<IAPIProvider>()));

Copilot AI Apr 21, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
dependencies.CacheAs(beatmapDownloader = new BeatmapModelDownloader(parent.Get<BeatmapManager>(), parent.Get<IAPIProvider>()));
dependencies.CacheAs(beatmapDownloader = new BeatmapModelDownloader(dependencies.Get<BeatmapManager>(), dependencies.Get<IAPIProvider>()));

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants