diff --git a/README.md b/README.md index 39162e7..fee84de 100644 --- a/README.md +++ b/README.md @@ -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