Files
CoopAllTheThings/host/CMakeLists.txt
BlackMark 4121ad4373 Move input polling to its own thread; fixed-width fast-changing UI numbers
Input thread: controller polling, pad publishing, and rumble forwarding were
driven by the render loop, so a low/synced frame rate throttled how often guest
input reached the game. New InputWorker owns the InputSource and runs poll +
IPC publish + rumble on a dedicated ~1 kHz thread, independent of rendering. The
UI thread reads a copy-safe InputSnapshot for the Controllers panel and relays the
Steam-Input request/active/failed state to/from the worker (Steam init/shutdown now
happen on the worker thread). IpcServer gained a mutex so the worker's publish() /
hook_status() can't race the UI thread starting/stopping the shared-memory channel
(use-after-unmap); InjectionPanel::test_input_ is now atomic. ControllersPanel::draw
takes an InputSnapshot instead of the live InputSource.

Fixed-width numbers: fast-changing readouts (menu-bar FPS/ms, Video pipeline rates +
latency + graph legend, controller poll rates + round-trip sticks, audio buffered ms
+ frames/s) printed with %.0f etc., so they shifted/blurred as values crossed digit
thresholds (99 -> 100) each frame. Padded them to fixed field widths so they stay put.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 12:51:00 +02:00

93 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/input/input_worker.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()