Phase 2: Present-hook video path (shared-texture mirror)
Add an injected IDXGISwapChain::Present / Present1 hook as a lower-latency, border-free alternative to WGC. The hook copies the swapchain backbuffer into a shared keyed-mutex texture (coop_video_<pid>); the host opens it by name and samples it. New opt-in HookSubsys_Video (protocol v6 -> v7); the Video mirror panel gains a WGC vs Hooked source toggle that installs/removes the subsystem. Verified by present_hook_test (drives a real D3D11 swapchain end-to-end and reads the rendered pixels back through the shared texture) and against Phantom Brave (D3D9: hook installs cleanly and stays idle, WGC fallback). All 5 tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -169,6 +169,31 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// --- Present-hook video channel ----------------------------------------
|
||||
|
||||
// Record that the game's Present() ran (diagnostic counter, hook is sole writer).
|
||||
void note_present()
|
||||
{
|
||||
if (block_ != nullptr)
|
||||
{
|
||||
block_->video.present_calls += 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Publish that a fresh backbuffer copy is in the shared texture (named
|
||||
// coop_video_<pid>) with these dimensions/format; bumps the generation the host
|
||||
// polls. The texture itself is shared out-of-band by name, not through here.
|
||||
void publish_video_frame(std::uint32_t width, std::uint32_t height, std::uint32_t format)
|
||||
{
|
||||
if (block_ != nullptr)
|
||||
{
|
||||
block_->video.width = width;
|
||||
block_->video.height = height;
|
||||
block_->video.format = format;
|
||||
block_->video.generation.fetch_add(1, std::memory_order_release);
|
||||
}
|
||||
}
|
||||
|
||||
// --- Hook registry -----------------------------------------------------
|
||||
|
||||
// Publish the installed-hooks table (name / subsystem / installed / calls).
|
||||
|
||||
Reference in New Issue
Block a user