Skip to content

Commit 77f702f

Browse files
Drop SingleThread CI matrix entry and document threading lock-in
- ci.yml: matrix.threadingMode reduced to ['MultiThreaded']. SingleThread is no longer a user-reachable mode (force-overridden in OsuGameBase), so testing under it just races the override and burns CI for an unsupported configuration. - README.md: drop the stale "Threading mode" row from the renderer options table; add a stability bullet documenting the MultiThreaded lock-in and the Android Vulkan-surface root cause. - No changes to runtime/src/test code beyond the previous PR; no optimizations are *unlocked* purely by the lock-in (Update / Draw / Audio / Input threads were already separate in MultiThreaded), so nothing else is touched. Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/89c57795-45d9-40ed-a99e-dd17caa8767d Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
1 parent 854648d commit 77f702f

2 files changed

Lines changed: 2 additions & 2 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ jobs:
8686
# macOS runner performance has gotten unbearably slow so let's turn them off temporarily.
8787
# - { prettyname: macOS, fullname: macos-latest }
8888
- { prettyname: Linux, fullname: ubuntu-latest }
89-
threadingMode: ['SingleThread', 'MultiThreaded']
89+
threadingMode: ['MultiThreaded']
9090
timeout-minutes: 120
9191
steps:
9292
- name: Checkout

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ Settings → Graphics → Renderer now exposes the full set of fork-added option
160160
| **Renderer** | Picks the GPU backend. On Windows you get Metal / Vulkan / D3D11 / **D3D12 (new)** / OpenGL plus their `Deferred_*` experimental variants. On Android you get Vulkan (if supported) and OpenGL ES. |
161161
| **Frame limiter** | VSync, **VSync Unbuffered (new)** — ideal for G-Sync / FreeSync / VRR displays, 2×/4×/8× refresh, Unlimited, or **Custom (new)**. |
162162
| **Custom draw rate limit** | Slider 0–1000 Hz, only visible when the frame limiter is set to Custom. `0` = unlimited draw thread. Useful for benchmarking or VRR-specific tuning. |
163-
| **Threading mode** | Single / MultiThreaded / MultiThreadedDrawing. |
164163
| **Low latency** | `Off` / `On` / `Boost` — drives the fork's generic `ILowLatencyProvider` (NVIDIA Reflex / LatencyFlex-ready on D3D11 & D3D12; no-op on other backends until a provider plugin is supplied). `Boost` also sleeps at the start of each update frame for lower input-to-photon latency. |
165164

166165
---
@@ -184,6 +183,7 @@ Settings → Graphics → Renderer now exposes the full set of fork-added option
184183

185184
This fork includes several hardening fixes on top of upstream:
186185

186+
- **Multi-threaded execution lock-in (v145+)** — the framework's `ExecutionMode = SingleThread` is force-set to `MultiThreaded` on every startup and the threading-mode toggle is removed from Settings → Graphics → Renderer. SingleThread on Android collapsed the SDL/Vulkan thread onto the same thread that delivers the `SurfaceHolder.Callback`, so `VeldridDevice`'s 5-second `SurfaceHandle` poll deadlocked and Vulkan device creation crashed on a null function pointer (`SDLThread` `SI_TKILL` ~5 s into launch). The same risk applies to iOS Metal drawable attach; on desktop SingleThread is strictly slower with no UX benefit, so the lock-in is unconditional across all platforms.
187187
- **Sentry-safe init** — the app gracefully handles a missing/placeholder Sentry DSN instead of failing on startup
188188
- **Graceful native library loading** — if the Oboe or Vulkan native libraries are missing, the app continues without them
189189
- **JNI surface safety** — proper lifecycle management with atomic swaps and timeouts to prevent race conditions between Android surface creation and destruction

0 commit comments

Comments
 (0)