Add OpenGL capture path for the hooked video mirror
The Present hook never fired in Phantom Brave because it's an OpenGL game (OPENGL32.dll loaded, IDXGISwapChain::Present calls=0), so the hooked video source showed no image. Add an OpenGL producer under the video subsystem: inline-hook gdi32!SwapBuffers + opengl32!wglSwapBuffers (with a re-entrancy guard, since SwapBuffers calls wglSwapBuffers), glReadPixels the backbuffer, flip it, and upload it into the same shared keyed-mutex texture the host already samples -- so the host is unchanged. DXGI games still hit the Present hook; both producers are installed and whichever the game uses fills the texture. Validated by opengl_hook_test (real GL context, clears to a known color, reads the exact pixels back through the shared texture) and against Phantom Brave (SwapBuffers ~75/s, present=0, shared texture 1920x1080, generation advancing). Vulkan (vkQueuePresentKHR) still needs WGC -- documented. All 7 tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -85,3 +85,25 @@ target_link_libraries(present_hook_test PRIVATE
|
||||
dxgi)
|
||||
|
||||
add_test(NAME present_hook_test COMMAND present_hook_test)
|
||||
|
||||
# In-process self-test for the OpenGL capture path. Reuses the shipping
|
||||
# opengl_hook.cpp and drives a real OpenGL context in the same process, so it
|
||||
# exercises the SwapBuffers hook, the glReadPixels readback, and the upload into
|
||||
# the shared texture (opened by name + read back). Skips without GL / D3D11.
|
||||
add_executable(opengl_hook_test
|
||||
opengl_hook_test.cpp
|
||||
${CMAKE_SOURCE_DIR}/hook/src/opengl_hook.cpp
|
||||
${CMAKE_SOURCE_DIR}/hook/src/debug_log.cpp
|
||||
${CMAKE_SOURCE_DIR}/hook/src/hook_registry.cpp)
|
||||
|
||||
target_include_directories(opengl_hook_test PRIVATE ${CMAKE_SOURCE_DIR}/hook/src)
|
||||
|
||||
target_link_libraries(opengl_hook_test PRIVATE
|
||||
coop_common
|
||||
safetyhook::safetyhook
|
||||
d3d11
|
||||
dxgi
|
||||
opengl32
|
||||
gdi32)
|
||||
|
||||
add_test(NAME opengl_hook_test COMMAND opengl_hook_test)
|
||||
|
||||
Reference in New Issue
Block a user