Trim completed work from the roadmap

The Roadmap section had grown into a recap of finished tasks (Vulkan perf fix,
inline-hook path, uncapped mock, hook-race family, etc.). Per the rule that done
work leaves the roadmap, drop the completed narrative -- it already lives in
Lessons learned and the test suite -- and keep only the open directions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 13:30:50 +02:00
parent 51e2c4f4cd
commit 0b017428b5

View File

@@ -108,31 +108,16 @@ default** and covers anything the hooked path doesn't.
## Roadmap
The near-term tracked tasks are complete: injection hardening (the cross-backend safe-unhook drain),
two-path audio-format correlation (rate + channels/bit-depth recovery), mouse + keyboard forwarding
for DirectInput and Raw Input games, real-game Vulkan validation (`coop_vk_validate` against Sphere
Spectacle), the **Vulkan capture performance fix** — the read-back that dropped a 144 FPS game to ~3
FPS now runs off the present thread (shared `coop::hook::VkCapture`), so the game keeps its frame
rate while mirroring (guarded by `vk_capture_perf_test`; every GPU backend's hook test also asserts a
present-thread overhead bound) — and the **inline-hook (suspended-inject) Vulkan path**, which now
captures Sphere Spectacle correctly once the harness launches the exe with the right working
directory and `vk_hook` intercepts present/swapchain resolved via `vkGetInstanceProcAddr` (not just
`vkGetDeviceProcAddr`). Both Vulkan paths are verified on the real game. The capture also **preserves
the game's sync mode** — it passes the swapchain's present mode through untouched and no longer
throttles the mirror (vsync paces it): Sphere Spectacle requests `FIFO` and holds a steady 144 Hz
with the layer attached. The **mock game now drives every backend uncapped** (DX9/10/11/12 + OpenGL +
Vulkan, thousands of fps — the slow vsync'd cadence was masking bugs), `mock_game_test` asserts each
keeps a healthy present rate while capturing, and (now also polling the input/focus/MKB APIs) that
faster stress **exposed and fixed a family of hook install/remove races** — inline hooks are now
*persistent* (created once, enable/disable, never freeing the trampoline during the session),
installed via `install_inline` (populate the global before patching the bytes), drained with a
settle-before-zero-check, plus focus-specific ordering fixes — so spamming a subsystem on/off is
always safe (see **Lessons learned**). DX12's higher capture cost was traced to the inherent
D3D11On12 bridge (not
`CreateWrappedResource`) and documented; a native-D3D12 copy path is the remaining (deferred)
improvement. See **Lessons learned** and the test suite for each. Open directions: per-game profiles,
multi-guest virtual-pad mapping, continuous raw-mouse *movement* forwarding (the MKB event stream is
position-based today), and the native-D3D12 capture path.
Open tasks (completed work lives in **Lessons learned** + the test suite, not here):
- **Per-game profiles** — persist each game's subsystem / capture-mode / audio choices and re-apply
them on attach.
- **Multi-guest virtual-pad mapping** — map multiple Remote Play guests onto distinct synthesized
pads in the XInput hook.
- **Continuous raw-mouse *movement* forwarding** — the MKB event stream is position-based today; also
forward relative motion for games that read raw deltas.
- **Native-D3D12 capture path** — DX12's higher capture cost is the inherent D3D11On12 bridge
(documented in **Lessons learned**); a native D3D12 copy would avoid it.
## Building