-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
217 lines (190 loc) · 6.85 KB
/
CMakeLists.txt
File metadata and controls
217 lines (190 loc) · 6.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
cmake_minimum_required(VERSION 3.25)
project(TrueMotionFidelityEngine LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
include(FetchContent)
FetchContent_Declare(
imgui
GIT_REPOSITORY https://github.com/ocornut/imgui.git
GIT_TAG v1.90.4
)
FetchContent_MakeAvailable(imgui)
# Graphics hook DLL (injected into game process)
add_library(graphics_hook SHARED
src/graphics_hook/graphics_hook.cpp
src/graphics_hook_info.h
)
target_compile_definitions(graphics_hook PRIVATE
NOMINMAX
_UNICODE
UNICODE
)
target_link_libraries(graphics_hook PRIVATE
d3d11
dxgi
)
# Set output name based on architecture
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set_target_properties(graphics_hook PROPERTIES OUTPUT_NAME "graphics_hook64_v2")
else()
set_target_properties(graphics_hook PROPERTIES OUTPUT_NAME "graphics_hook32_v2")
endif()
# Copy hook DLL to main executable directory
add_custom_command(TARGET graphics_hook POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"$<TARGET_FILE:graphics_hook>"
"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/"
)
# --- Vulkan SDK (optional) ---
option(USE_VULKAN "Enable Vulkan backend (requires Vulkan SDK)" ON)
set(VULKAN_SDK_ROOT "" CACHE PATH "Vulkan SDK root directory")
if(USE_VULKAN)
# Try to find Vulkan SDK
if(VULKAN_SDK_ROOT)
set(ENV{VULKAN_SDK} "${VULKAN_SDK_ROOT}")
endif()
find_package(Vulkan QUIET)
if(NOT Vulkan_FOUND)
# Try common install paths
file(GLOB VULKAN_SDK_DIRS "C:/VulkanSDK/*")
list(SORT VULKAN_SDK_DIRS ORDER DESCENDING)
foreach(SDK_DIR ${VULKAN_SDK_DIRS})
if(EXISTS "${SDK_DIR}/Include/vulkan/vulkan.h")
set(Vulkan_INCLUDE_DIR "${SDK_DIR}/Include")
set(Vulkan_LIBRARY "${SDK_DIR}/Lib/vulkan-1.lib")
set(Vulkan_FOUND TRUE)
set(GLSLANG_EXECUTABLE "${SDK_DIR}/Bin/glslangValidator.exe")
break()
endif()
endforeach()
endif()
if(Vulkan_FOUND)
message(STATUS "Vulkan SDK found: ${Vulkan_INCLUDE_DIR}")
# Find glslangValidator for SPIR-V compilation
if(NOT GLSLANG_EXECUTABLE)
find_program(GLSLANG_EXECUTABLE glslangValidator
PATHS "$ENV{VULKAN_SDK}/Bin" "$ENV{VULKAN_SDK}/bin")
endif()
else()
message(WARNING "Vulkan SDK not found - Vulkan backend disabled")
set(USE_VULKAN OFF)
endif()
endif()
# Main application
add_executable(TrueMotionFidelityEngine WIN32
src/app.cpp
src/app.h
src/capture_frame.h
src/d3d11_device.cpp
src/d3d11_device.h
src/render_device.cpp
src/render_device.h
src/dll_injector.cpp
src/dll_injector.h
src/dup_capture.cpp
src/dup_capture.h
src/game_capture.cpp
src/game_capture.h
src/graphics_hook_info.h
src/interpolator.cpp
src/interpolator.h
src/main.cpp
src/shader_utils.cpp
src/shader_utils.h
src/ui.cpp
src/ui.h
src/wgc_capture.cpp
src/wgc_capture.h
src/window_list.cpp
src/window_list.h
src/resources.rc
${imgui_SOURCE_DIR}/imgui.cpp
${imgui_SOURCE_DIR}/imgui_draw.cpp
${imgui_SOURCE_DIR}/imgui_tables.cpp
${imgui_SOURCE_DIR}/imgui_widgets.cpp
${imgui_SOURCE_DIR}/backends/imgui_impl_win32.cpp
${imgui_SOURCE_DIR}/backends/imgui_impl_dx11.cpp
)
target_include_directories(TrueMotionFidelityEngine PRIVATE
src
${imgui_SOURCE_DIR}
${imgui_SOURCE_DIR}/backends
)
target_link_libraries(TrueMotionFidelityEngine PRIVATE
d3d11
dxgi
d3dcompiler
dwmapi
windowsapp
winmm
shcore
shlwapi
)
set_target_properties(TrueMotionFidelityEngine PROPERTIES OUTPUT_NAME "True Motion Fidelity Engine")
# Make FrameGen depend on graphics_hook so hook is built first
add_dependencies(TrueMotionFidelityEngine graphics_hook)
target_compile_definitions(TrueMotionFidelityEngine PRIVATE
WINRT_NO_COROUTINES
NOMINMAX
)
# Vulkan support
if(USE_VULKAN)
target_compile_definitions(TrueMotionFidelityEngine PRIVATE USE_VULKAN VK_USE_PLATFORM_WIN32_KHR)
target_include_directories(TrueMotionFidelityEngine PRIVATE ${Vulkan_INCLUDE_DIR})
target_link_libraries(TrueMotionFidelityEngine PRIVATE ${Vulkan_LIBRARY})
endif()
# Find Windows SDK fxc.exe shader compiler
find_program(FXC_EXECUTABLE fxc
PATHS
"$ENV{WindowsSdkDir}/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64"
"$ENV{WindowsSdkDir}/bin/x64"
"C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64"
"C:/Program Files (x86)/Windows Kits/10/bin/10.0.22000.0/x64"
"C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x64"
)
set(SHADER_OUTPUT_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/shaders")
# Create shader output directory and copy source files
add_custom_command(TARGET TrueMotionFidelityEngine POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${SHADER_OUTPUT_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/src/shaders" "${SHADER_OUTPUT_DIR}"
COMMENT "Copying shader source files"
)
if(FXC_EXECUTABLE)
message(STATUS "Found fxc: ${FXC_EXECUTABLE} - shaders will be pre-compiled")
# Compile each shader at build time
# Use /O1 (less aggressive optimization) to avoid timeouts on complex shaders
set(SHADER_NAMES CopyScale DebugView DownsampleLuma DownsampleLumaR Interpolate MotionEst MotionRefine MotionSmooth MotionTemporal)
foreach(SHADER_NAME ${SHADER_NAMES})
add_custom_command(TARGET TrueMotionFidelityEngine POST_BUILD
COMMAND ${FXC_EXECUTABLE} /T cs_5_0 /E CSMain /O1 /nologo /Fo "${SHADER_OUTPUT_DIR}/${SHADER_NAME}.cso" "${CMAKE_SOURCE_DIR}/src/shaders/${SHADER_NAME}.hlsl" || echo "Warning: ${SHADER_NAME} compilation failed, will use runtime compilation"
COMMENT "Compiling ${SHADER_NAME}.hlsl"
)
endforeach()
else()
message(WARNING "fxc.exe not found - shaders will be compiled at runtime (slower startup)")
endif()
# Compile Vulkan SPIR-V shaders
if(USE_VULKAN AND GLSLANG_EXECUTABLE)
message(STATUS "Found glslangValidator: ${GLSLANG_EXECUTABLE}")
set(VK_SHADER_OUTPUT_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>/shaders/vulkan")
add_custom_command(TARGET TrueMotionFidelityEngine POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${VK_SHADER_OUTPUT_DIR}"
COMMENT "Creating Vulkan shader output directory"
)
set(VK_SHADER_NAMES feature_pyramid cost_volume flow_decoder interpolate downsample)
foreach(VK_SHADER ${VK_SHADER_NAMES})
add_custom_command(TARGET TrueMotionFidelityEngine POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_SOURCE_DIR}/src/shaders/vulkan/${VK_SHADER}.comp"
"${VK_SHADER_OUTPUT_DIR}/${VK_SHADER}.comp"
COMMAND ${GLSLANG_EXECUTABLE} -V
"${CMAKE_SOURCE_DIR}/src/shaders/vulkan/${VK_SHADER}.comp"
-o "${VK_SHADER_OUTPUT_DIR}/${VK_SHADER}.spv"
--target-env vulkan1.2 || echo "Warning: ${VK_SHADER} SPIR-V compilation failed"
COMMENT "Compiling ${VK_SHADER}.comp to SPIR-V"
)
endforeach()
elseif(USE_VULKAN)
message(WARNING "glslangValidator not found - Vulkan shaders will not be compiled")
endif()