-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
167 lines (131 loc) · 5.44 KB
/
Copy pathCMakeLists.txt
File metadata and controls
167 lines (131 loc) · 5.44 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
cmake_minimum_required(VERSION 3.16)
project(pathfinder
VERSION 0.1
LANGUAGES C CXX)
# Set binary output directory.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
# Options.
option(PATHFINDER_BACKEND_OPENGL "Enable OpenGL backend" ON)
option(PATHFINDER_BACKEND_VULKAN "Enable Vulkan backend" ON)
option(PATHFINDER_BACKEND_METAL "Enable Metal backend" OFF)
option(PATHFINDER_BUILD_DEMO "Build demo" OFF)
option(PATHFINDER_ENABLE_COMPUTE "Enable COMPUTE render mode" ON)
option(PATHFINDER_RUNTIME_SHADER_COMPLICATION "Compile shaders at runtime using SPV" OFF)
option(PATHFINDER_BUILD_SHADER_GENERATOR "Shader generator" OFF)
# Identify Linux.
if (UNIX AND NOT APPLE AND NOT ANDROID)
set(LINUX ON)
endif ()
# Should handle EMSCRIPTEN before other platforms.
if (EMSCRIPTEN)
message("[Pathfinder] Build for Web")
set(PATHFINDER_BACKEND_OPENGL ON)
# No Vulkan support for web.
set(PATHFINDER_BACKEND_VULKAN OFF)
# No compute shader for web.
set(PATHFINDER_ENABLE_COMPUTE OFF)
elseif (APPLE)
# No GL support for Mac.
set(PATHFINDER_BACKEND_OPENGL OFF)
set(PATHFINDER_BACKEND_VULKAN OFF)
set(PATHFINDER_BACKEND_METAL ON)
enable_language(OBJC OBJCXX)
endif ()
add_subdirectory(pathfinder)
target_compile_features(pathfinder PUBLIC cxx_std_14)
if (EMSCRIPTEN)
# Do nothing
elseif (APPLE)
elseif (LINUX)
target_compile_definitions(pathfinder PUBLIC PATHFINDER_ENABLE_SIMD)
if (NOT CMAKE_SYSTEM_PROCESSOR MATCHES "arm|aarch64")
target_compile_options(pathfinder PUBLIC -msse4.1)
endif ()
else ()
if (NOT CMAKE_SYSTEM_PROCESSOR MATCHES "ARM|ARM64|aarch64")
target_compile_definitions(pathfinder PUBLIC PATHFINDER_ENABLE_SIMD)
endif ()
endif ()
if (PATHFINDER_ENABLE_COMPUTE)
target_compile_definitions(pathfinder PUBLIC PATHFINDER_ENABLE_COMPUTE)
endif ()
if (PATHFINDER_BACKEND_VULKAN)
message("[Pathfinder] Enabled Vulkan backend")
# Load Vulkan dll
# find_package(Vulkan REQUIRED)
#
# target_link_libraries(pathfinder PUBLIC Vulkan::Vulkan)
#
# # This is to please GitHub Actions.
# target_include_directories(pathfinder PUBLIC "${Vulkan_INCLUDE_DIRS}")
#
# Load Vulkan dynamically
if (ANDROID)
# Prevent crash at vkCreateAndroidSurfaceKHR.
set(VOLK_STATIC_DEFINES VK_USE_PLATFORM_ANDROID_KHR)
endif ()
add_subdirectory("third_party/volk")
target_link_libraries(pathfinder PUBLIC volk)
target_compile_definitions(pathfinder PRIVATE PATHFINDER_USE_VULKAN)
# Enable this for Vulkan 1.3 and higher on macOS.
if (APPLE)
target_compile_definitions(pathfinder PRIVATE PATHFINDER_VKB_ENABLE_PORTABILITY)
endif ()
else ()
message("[Pathfinder] Disabled Vulkan backend")
endif ()
if (PATHFINDER_BACKEND_OPENGL)
message("[Pathfinder] Enabled OpenGL backend")
# Don't use add_compile_definitions, which doesn't propagate to parent projects.
target_compile_definitions(pathfinder PRIVATE PATHFINDER_USE_OPENGL)
else ()
message("[Pathfinder] Disabled OpenGL backend")
endif ()
if (PATHFINDER_BACKEND_METAL)
message("[Pathfinder] Enabled Metal backend")
target_compile_definitions(pathfinder PRIVATE PATHFINDER_USE_METAL)
# Config ARC.
target_compile_options(pathfinder PRIVATE
$<$<COMPILE_LANGUAGE:OBJC,OBJCXX>:-fobjc-arc>
)
set_target_properties(pathfinder PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "YES")
target_link_libraries(pathfinder PUBLIC "-framework Metal" "-framework Cocoa" "-framework QuartzCore" "-framework MetalKit")
else ()
message("[Pathfinder] Disabled Metal backend")
endif ()
# Include third_party headers.
target_include_directories(pathfinder PUBLIC "third_party" "third_party/glad/include")
# We don't need GLFW on Android, and Emscripten has its own version of GLFW.
if ((WIN32 OR LINUX OR APPLE) AND NOT (EMSCRIPTEN OR ANDROID))
add_subdirectory("third_party/glfw")
target_include_directories(pathfinder PUBLIC "third_party/glfw/include")
target_link_libraries(pathfinder PUBLIC glfw)
endif ()
if (PATHFINDER_RUNTIME_SHADER_COMPLICATION)
add_subdirectory("third_party/spirv-cross")
add_subdirectory("third_party/glslang")
target_link_libraries(pathfinder PUBLIC spirv-cross glslang)
target_compile_definitions(pathfinder PRIVATE PATHFINDER_USE_GLSLANG)
endif ()
if (PATHFINDER_BUILD_DEMO)
message("[Pathfinder] Build demo")
file(COPY assets DESTINATION ${CMAKE_BINARY_DIR})
# Demo common library.
add_subdirectory(demo/common)
if ((WIN32 OR LINUX OR APPLE) AND NOT (EMSCRIPTEN OR ANDROID))
add_subdirectory(demo/native)
elseif (EMSCRIPTEN)
# Set output directory to the web demo, so we don't have to copy output files manually.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/demo/web")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_GLFW=3 -s USE_WEBGL2=1 -s FULL_ES3=1")
# For debugging. Enable this to obtain detailed call stack.
# Note: this will affect performance.
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gsource-map -s ASSERTIONS=2 -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=1 -s NO_DISABLE_EXCEPTION_CATCHING --source-map-base http://127.0.0.1:8000/")
add_subdirectory(demo/web)
endif ()
endif ()
if (PATHFINDER_BUILD_SHADER_GENERATOR)
add_subdirectory("third_party/spirv-cross")
add_subdirectory("third_party/glslang")
add_subdirectory(shader_generator)
endif ()