diff --git a/README.md b/README.md index e26621b..df4f224 100644 --- a/README.md +++ b/README.md @@ -122,10 +122,13 @@ the game's sync mode** — it passes the swapchain's present mode through untouc 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 that faster stress **exposed and fixed a -hook-removal use-after-free** (the inline-hook removal now disables → drains → destroys, and the -shared drain settles before concluding, so a backend presenting at thousands/s survives the -hook/unhook storm). DX12's higher capture cost was traced to the inherent D3D11On12 bridge (not +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