Frame sync: new "Sync flip to game frames" toggle in the Video mirror panel (Hooked source only -- WGC frames are delivered by the compositor at monitor refresh and don't carry the game's true present cadence, so it's disabled there). When on, the main loop waits for the hook's next published frame (its generation bump) before rendering and presents with sync interval 0, so the tool flips in lockstep with the game instead of vsync. The wait pumps messages to stay responsive and times out after 200 ms so a paused/stalled game can't hang the overlay. timeBeginPeriod(1) keeps the wait's Sleep(1) granular; links winmm. render_frame() gained a sync_interval parameter (default 1 = vsync). Perf graphs: the old graphs drew the tool's frametime and FPS as single same-color lines. Replaced with a custom multi-series plotter (ImDrawList polylines) that overlays Tool (blue), Game present (green), and Hook publish (orange) -- or Tool + WGC capture in WGC mode -- in distinct colors with a colored legend, for both an FPS (0-144) and a frametime (0-33 ms) view. Game/hook rates come from an EdgeRate tracker that measures the instantaneous rate the moment each counter advances, so the lines have real per-frame resolution rather than 0.5 s stair-steps. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
92 lines
3.7 KiB
CMake
92 lines
3.7 KiB
CMake
add_executable(coop_host WIN32
|
|
src/main.cpp
|
|
src/d3d11_window.cpp
|
|
src/imgui_layer.cpp
|
|
src/controllers_panel.cpp
|
|
src/injection_panel.cpp
|
|
src/capture_panel.cpp
|
|
src/audio_panel.cpp
|
|
src/log_panel.cpp
|
|
src/ui/app_chrome.cpp
|
|
src/input/xinput_source.cpp
|
|
src/inject/process_list.cpp
|
|
src/inject/window_list.cpp
|
|
src/inject/injector.cpp
|
|
src/inject/mkb_forward.cpp
|
|
src/ipc/ipc_server.cpp
|
|
src/capture/frame_renderer.cpp
|
|
src/capture/window_capture.cpp
|
|
src/capture/shared_texture.cpp
|
|
src/audio/audio_loopback.cpp
|
|
src/audio/process_loopback_capture.cpp)
|
|
|
|
target_include_directories(coop_host PRIVATE src)
|
|
|
|
# Process-loopback capture (AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK) needs the
|
|
# Windows 10 20H1 (NTDDI_WIN10_CO) headers; raise the target SDK version for it.
|
|
target_compile_definitions(coop_host PRIVATE NTDDI_VERSION=0x0A00000B)
|
|
|
|
target_link_libraries(coop_host PRIVATE
|
|
coop_common
|
|
imgui
|
|
d3d11
|
|
dxgi
|
|
dwmapi
|
|
d3dcompiler
|
|
windowsapp
|
|
xinput
|
|
mmdevapi
|
|
winmm
|
|
ole32)
|
|
|
|
set_target_properties(coop_host PROPERTIES OUTPUT_NAME "coop_host")
|
|
|
|
# Optional Steam Input: enabled automatically when the Steamworks SDK is vendored
|
|
# under third_party/steamworks_sdk (it isn't redistributable, so it's gitignored
|
|
# and never committed). Without it, the host builds XInput-only.
|
|
set(COOP_STEAM_SDK_DIR "${CMAKE_SOURCE_DIR}/third_party/steamworks_sdk/sdk")
|
|
if(EXISTS "${COOP_STEAM_SDK_DIR}/public/steam/steam_api.h")
|
|
message(STATUS "Steamworks SDK found -> Steam Input enabled")
|
|
target_sources(coop_host PRIVATE src/input/steam_input_source.cpp)
|
|
target_compile_definitions(coop_host PRIVATE COOP_WITH_STEAM)
|
|
target_include_directories(coop_host SYSTEM PRIVATE "${COOP_STEAM_SDK_DIR}/public")
|
|
# The SDK headers trip /W4 (strncpy, non-UTF-8 bytes); silence for this TU only.
|
|
set_source_files_properties(src/input/steam_input_source.cpp PROPERTIES
|
|
COMPILE_OPTIONS "/wd4996;/wd4828")
|
|
target_link_libraries(coop_host PRIVATE
|
|
"${COOP_STEAM_SDK_DIR}/redistributable_bin/win64/steam_api64.lib")
|
|
# Stage steam_api64.dll + the action manifest next to coop_host.exe.
|
|
add_custom_command(TARGET coop_host POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${COOP_STEAM_SDK_DIR}/redistributable_bin/win64/steam_api64.dll"
|
|
"$<TARGET_FILE_DIR:coop_host>/steam_api64.dll"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/assets/steam_input_actions.vdf"
|
|
"$<TARGET_FILE_DIR:coop_host>/steam_input_actions.vdf"
|
|
VERBATIM)
|
|
|
|
# Console smoke test for Steam Input (reuses the shipping source). Not a ctest
|
|
# (needs Steam running + an appid); run manually from bin/<config>/.
|
|
add_executable(coop_steam_input_probe
|
|
${CMAKE_SOURCE_DIR}/tools/steam_input_probe/main.cpp
|
|
src/input/steam_input_source.cpp
|
|
src/input/xinput_source.cpp)
|
|
target_include_directories(coop_steam_input_probe PRIVATE src)
|
|
target_include_directories(coop_steam_input_probe SYSTEM PRIVATE "${COOP_STEAM_SDK_DIR}/public")
|
|
target_compile_definitions(coop_steam_input_probe PRIVATE COOP_WITH_STEAM)
|
|
set_source_files_properties(src/input/steam_input_source.cpp PROPERTIES COMPILE_OPTIONS "/wd4996;/wd4828")
|
|
target_link_libraries(coop_steam_input_probe PRIVATE
|
|
coop_common
|
|
xinput
|
|
"${COOP_STEAM_SDK_DIR}/redistributable_bin/win64/steam_api64.lib")
|
|
# Dev tool -> bin/<config>/tools/ (its steam_api64.dll copy follows via TARGET_FILE_DIR).
|
|
coop_output_subdir(tools coop_steam_input_probe)
|
|
add_custom_command(TARGET coop_steam_input_probe POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${COOP_STEAM_SDK_DIR}/redistributable_bin/win64/steam_api64.dll"
|
|
"$<TARGET_FILE_DIR:coop_steam_input_probe>/steam_api64.dll"
|
|
VERBATIM)
|
|
else()
|
|
message(STATUS "Steamworks SDK not found -> Steam Input disabled (XInput only)")
|
|
endif()
|