OSDN Git Service

MetalSurface: set layer.device to a ref of the system default device.
[android-x86/external-swiftshader.git] / CMakeLists.txt
1 # Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #    http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 cmake_minimum_required(VERSION 3.6.3)
16
17 set(CMAKE_CXX_STANDARD 14)
18
19 project(SwiftShader C CXX ASM)
20
21 # On Windows we use custom solution and project files, except for certain third-
22 # party projects which use CMake-generated ones. They are manually (re)generated
23 # and made path relative using build/cmake.sh, so they can be checked into the
24 # repository. Therefore they should not be auto-regenerated and left using
25 # absolute paths by CMake's ZERO_CHECK.
26 if(WIN32)
27     # Disable automatically regenerating project files on CMakeLists.txt changes.
28     set(CMAKE_SUPPRESS_REGENERATION true)
29 endif()
30
31 ###########################################################
32 # Detect system
33 ###########################################################
34
35 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
36     set(LINUX TRUE)
37 elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
38     set(ANDROID TRUE)
39     set(CMAKE_CXX_FLAGS "-DANDROID_NDK_BUILD")
40 elseif(WIN32)
41 elseif(APPLE)
42 else()
43     message(FATAL_ERROR "Platform is not supported")
44 endif()
45
46 if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch")
47     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
48         set(ARCH "aarch64")
49     else()
50         set(ARCH "arm")
51     endif()
52 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips*")
53     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
54         set(ARCH "mips64el")
55     else()
56         set(ARCH "mipsel")
57     endif()
58 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc*")
59     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
60         set(ARCH "ppc64le")
61     else()
62         message(FATAL_ERROR "Architecture is not supported")
63     endif()
64 else()
65     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
66         set(ARCH "x86_64")
67     else()
68         set(ARCH "x86")
69     endif()
70 endif()
71
72 set(CMAKE_MACOSX_RPATH TRUE)
73
74 if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQUAL ""))
75   message(WARNING "Visual Studio generators use the x86 host compiler by "
76                   "default, even for 64-bit targets. This can result in linker "
77                   "instability and out of memory errors. To use the 64-bit "
78                   "host compiler, pass -Thost=x64 on the CMake command line.")
79 endif()
80
81 # Use CCache if available
82 find_program(CCACHE_FOUND ccache)
83 if(CCACHE_FOUND)
84     message(STATUS "Using ccache")
85     set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
86     set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
87 endif()
88
89 ###########################################################
90 # Host libraries
91 ###########################################################
92
93 find_library(X11 X11)
94 find_library(XCB xcb)
95
96 ###########################################################
97 # Options
98 ###########################################################
99
100 if(NOT CMAKE_BUILD_TYPE)
101     set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release MinSizeRel RelWithDebInfo." FORCE)
102 endif()
103 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)
104
105 function (option_if_not_defined name description default)
106     if(NOT DEFINED ${name})
107         option(${name} ${description} ${default})
108     endif()
109 endfunction()
110
111 function (set_if_not_defined name value)
112     if(NOT DEFINED ${name})
113         set(${name} ${value} PARENT_SCOPE)
114     endif()
115 endfunction()
116
117 option_if_not_defined(SWIFTSHADER_BUILD_EGL "Build the EGL library" TRUE)
118 option_if_not_defined(SWIFTSHADER_BUILD_GLESv2 "Build the OpenGL ES 2 library" TRUE)
119 option_if_not_defined(SWIFTSHADER_BUILD_GLES_CM "Build the OpenGL ES 1.1 library" TRUE)
120 option_if_not_defined(SWIFTSHADER_BUILD_VULKAN "Build the Vulkan library" TRUE)
121 option_if_not_defined(SWIFTSHADER_BUILD_PVR "Build the PowerVR examples" TRUE)
122 option_if_not_defined(SWIFTSHADER_GET_PVR "Check out the PowerVR submodule" FALSE)
123
124 option_if_not_defined(SWIFTSHADER_USE_GROUP_SOURCES "Group the source files in a folder tree for Visual Studio" TRUE)
125
126 option_if_not_defined(SWIFTSHADER_BUILD_TESTS "Build unit tests" TRUE)
127 option_if_not_defined(SWIFTSHADER_BUILD_BENCHMARKS "Build benchmarks" FALSE)
128
129 option_if_not_defined(SWIFTSHADER_MSAN "Build with memory sanitizer" FALSE)
130 option_if_not_defined(SWIFTSHADER_ASAN "Build with address sanitizer" FALSE)
131 option_if_not_defined(SWIFTSHADER_TSAN "Build with thread sanitizer" FALSE)
132 option_if_not_defined(SWIFTSHADER_UBSAN "Build with undefined behavior sanitizer" FALSE)
133 option_if_not_defined(SWIFTSHADER_EMIT_COVERAGE "Emit code coverage information" FALSE)
134 option_if_not_defined(SWIFTSHADER_WARNINGS_AS_ERRORS "Treat all warnings as errors" TRUE)
135 option_if_not_defined(SWIFTSHADER_DCHECK_ALWAYS_ON "Check validation macros even in release builds" FALSE)
136 option_if_not_defined(REACTOR_EMIT_DEBUG_INFO "Emit debug info for JIT functions" FALSE)
137 option_if_not_defined(REACTOR_EMIT_PRINT_LOCATION "Emit printing of location info for JIT functions" FALSE)
138 option_if_not_defined(REACTOR_ENABLE_PRINT "Enable RR_PRINT macros" FALSE)
139 option_if_not_defined(REACTOR_VERIFY_LLVM_IR "Check reactor-generated LLVM IR is valid even in release builds" FALSE)
140 option_if_not_defined(SWIFTSHADER_LESS_DEBUG_INFO "Generate less debug info to reduce file size" FALSE)
141 option_if_not_defined(SWIFTSHADER_ENABLE_VULKAN_DEBUGGER "Enable Vulkan debugger support" FALSE)
142 option_if_not_defined(SWIFTSHADER_ENABLE_ASTC "Enable ASTC compressed textures support" TRUE)  # TODO(b/150130101)
143
144 set(BUILD_MARL ${SWIFTSHADER_BUILD_VULKAN})
145
146 if(${SWIFTSHADER_BUILD_VULKAN} AND ${SWIFTSHADER_ENABLE_VULKAN_DEBUGGER})
147     set_if_not_defined(SWIFTSHADER_BUILD_CPPDAP TRUE)
148 else()
149     set_if_not_defined(SWIFTSHADER_BUILD_CPPDAP FALSE)
150 endif()
151
152 set(DEFAULT_REACTOR_BACKEND "LLVM")
153 set(REACTOR_BACKEND ${DEFAULT_REACTOR_BACKEND} CACHE STRING "JIT compiler back-end used by Reactor")
154 set_property(CACHE REACTOR_BACKEND PROPERTY STRINGS LLVM Subzero)
155
156 set(DEFAULT_SWIFTSHADER_LLVM_VERSION "7.0")
157 set(SWIFTSHADER_LLVM_VERSION ${DEFAULT_SWIFTSHADER_LLVM_VERSION} CACHE STRING "LLVM version to use")
158 set_property(CACHE SWIFTSHADER_LLVM_VERSION PROPERTY STRINGS "7.0" "10.0")
159
160 # If defined, overrides the default optimization level of the current reactor backend.
161 # Set to one of the rr::Optimization::Level enum values.
162 set(REACTOR_DEFAULT_OPT_LEVEL "Default" CACHE STRING "Reactor default optimization level")
163 set_property(CACHE REACTOR_DEFAULT_OPT_LEVEL PROPERTY STRINGS "None" "Less" "Default" "Aggressive")
164
165 # LLVM disallows calling cmake . from the main LLVM dir, the reason is that
166 # it builds header files that could overwrite the orignal ones. Here we
167 # want to include LLVM as a subdirectory and even though it wouldn't cause
168 # the problem, if cmake . is called from the main dir, the condition that
169 # LLVM checkes, "CMAKE_CURRENT_SOURCE_DIR == CMAKE_CURRENT_BINARY_DIR" will be true. So we
170 # disallow it ourselves too to. In addition if there are remining CMakeFiles
171 # and CMakeCache in the directory, cmake .. from a subdirectory will still
172 # try to build from the main directory so we instruct users to delete these
173 # files when they get the error.
174 if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
175     message(FATAL_ERROR "In source builds are not allowed by LLVM, please create a build/ directory and build from there. You may have to delete the CMakeCache.txt file and CMakeFiles directory that are next to the CMakeLists.txt.")
176 endif()
177
178 set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)
179
180 ###########################################################
181 # Initialize submodules
182 ###########################################################
183
184 if (SWIFTSHADER_BUILD_TESTS)
185     if (NOT TARGET gtest)
186         if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/.git)
187             message(WARNING "
188         third_party/googletest submodule missing.
189         Running 'git submodule update --init' to download it:
190             ")
191
192             execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest)
193         endif()
194     endif()
195 endif()
196
197 if(SWIFTSHADER_BUILD_BENCHMARKS)
198     if (NOT TARGET benchmark::benchmark)
199         if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/benchmark/.git)
200             message(WARNING "
201         third_party/benchmark submodule missing.
202         Running 'git submodule update --init' to download it:
203             ")
204
205             execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/benchmark)
206         endif()
207     endif()
208 endif(SWIFTSHADER_BUILD_BENCHMARKS)
209
210 if (NOT TARGET libbacktrace)
211     if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace/src/.git)
212         message(WARNING "
213       third_party/libbacktrace/src submodule missing.
214       Running 'git submodule update --init' to download it:
215         ")
216
217         execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace)
218     endif()
219 endif()
220
221 # Boost is downloaded if necessary
222
223 # From https://www.boost.org/users/download/
224 set(BOOST_VER 1.70.0)
225 set(BOOST_HASH_TARGZ "882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9")
226 set(BOOST_HASH_ZIP   "48f379b2e90dd1084429aae87d6bdbde9670139fa7569ee856c8c86dd366039d")
227
228 string(REPLACE "." "_" BOOST_VER_FNAME ${BOOST_VER})
229 set(BOOST_THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/boost_${BOOST_VER_FNAME})
230
231 function(DownloadBoost)
232     if (LINUX)
233         set(BOOST_EXT "tar.gz")
234         set(BOOST_HASH ${BOOST_HASH_TARGZ})
235     else()
236         set(BOOST_EXT "zip")
237         set(BOOST_HASH ${BOOST_HASH_ZIP})
238     endif()
239
240     # Note: bintray.com has rate limiting, so use the sourceforge mirror
241     # set(BOOST_URL https://dl.bintray.com/boostorg/release/${BOOST_VER}/source/boost_${BOOST_VER_FNAME}.${BOOST_EXT})
242     set(BOOST_URL https://iweb.dl.sourceforge.net/project/boost/boost/${BOOST_VER}/boost_${BOOST_VER_FNAME}.${BOOST_EXT})
243
244     if (NOT TARGET Boost::boost)
245         if(NOT EXISTS ${BOOST_THIRD_PARTY_DIR})
246             message(WARNING "
247           third_party/boost is missing.
248           Downloading and extracting boost:
249             ")
250
251             set(BOOST_ARCHIVE ${CMAKE_BINARY_DIR}/temp/boost_archive)
252             message(STATUS "Downloading ${BOOST_URL} to ${BOOST_ARCHIVE}...")
253             file(DOWNLOAD ${BOOST_URL} ${BOOST_ARCHIVE} EXPECTED_HASH SHA256=${BOOST_HASH})
254             message(STATUS "Extracting ${BOOST_ARCHIVE} to ${BOOST_THIRD_PARTY_DIR}...")
255             execute_process(
256                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/third_party
257                 COMMAND cmake -E tar xf ${BOOST_ARCHIVE}
258             )
259         endif()
260     endif()
261 endfunction()
262
263 if(SWIFTSHADER_GET_PVR)
264     if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples/.git)
265         message(WARNING "
266         third_party/PowerVR_Examples submodule missing.
267         Running 'git submodule update --init' to download it:
268         ")
269
270         execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples)
271     endif()
272     set(SWIFTSHADER_GET_PVR FALSE CACHE BOOL "Check out the PowerVR submodule" FORCE)
273 endif()
274 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples/.git)
275     set(HAVE_PVR_SUBMODULE TRUE)
276 endif()
277
278 ###########################################################
279 # Convenience macros
280 ###########################################################
281
282 # Recursively calls source_group on the files of the directory
283 # so that Visual Studio has the files in a folder tree
284 macro(group_all_sources directory)
285     file(GLOB files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${directory} ${CMAKE_CURRENT_SOURCE_DIR}/${directory}/*)
286     foreach(file ${files})
287         if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${directory}/${file})
288             group_all_sources(${directory}/${file})
289         else()
290             string(REPLACE "/" "\\" groupname ${directory})
291             source_group(${groupname} FILES ${CMAKE_CURRENT_SOURCE_DIR}/${directory}/${file})
292         endif()
293     endforeach()
294 endmacro()
295
296 # Takes target library and a directory where the export map is
297 # and add the linker options so that only the API symbols are
298 # exported.
299 macro(set_shared_library_export_map TARGET DIR)
300     if(MSVC)
301         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " /DEF:\"${DIR}/${TARGET}.def\"")
302     elseif(APPLE)
303         # The exported symbols list only exports the API functions and
304         # hides all the others.
305         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS "-exported_symbols_list ${DIR}/${TARGET}.exports")
306         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_DEPENDS "${DIR}/${TARGET}.exports;")
307         # Don't allow undefined symbols, unless it's a Sanitizer build.
308         if(NOT SWIFTSHADER_MSAN AND NOT SWIFTSHADER_ASAN AND NOT SWIFTSHADER_TSAN AND NOT SWIFTSHADER_UBSAN)
309             set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-undefined,error")
310         endif()
311     elseif(LINUX)
312         # The version script only exports the API functions and
313         # hides all the others.
314         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--version-script=${DIR}/${TARGET}.lds")
315         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_DEPENDS "${DIR}/${TARGET}.lds;")
316
317         # -Bsymbolic binds symbol references to their global definitions within
318         # a shared object, thereby preventing symbol preemption.
319         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS "  -Wl,-Bsymbolic")
320
321         if(ARCH STREQUAL "mipsel" OR ARCH STREQUAL "mips64el")
322           # MIPS supports sysv hash-style only.
323           set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--hash-style=sysv")
324         else()
325           # Both hash-style are needed, because we want both gold and
326           # GNU ld to be able to read our libraries.
327           set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--hash-style=both")
328         endif()
329
330         if(NOT ${SWIFTSHADER_EMIT_COVERAGE})
331             # Gc sections is used in combination with each functions being
332             # in its own section, to reduce the binary size.
333             set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--gc-sections")
334         endif()
335
336         # Don't allow undefined symbols, unless it's a Sanitizer build.
337         if(NOT SWIFTSHADER_MSAN AND NOT SWIFTSHADER_ASAN AND NOT SWIFTSHADER_TSAN AND NOT SWIFTSHADER_UBSAN)
338             set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--no-undefined")
339         endif()
340     endif()
341 endmacro()
342
343 if(SWIFTSHADER_USE_GROUP_SOURCES)
344     group_all_sources(src)
345 endif()
346
347 ###########################################################
348 # Directories
349 ###########################################################
350
351 set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
352 set(OPENGL_DIR ${SOURCE_DIR}/OpenGL)
353 set(OPENGL_COMPILER_DIR ${OPENGL_DIR}/compiler)
354 set(VULKAN_DIR ${SOURCE_DIR}/Vulkan)
355 set(THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party)
356 set(ASTC_DIR ${THIRD_PARTY_DIR}/astc-encoder)
357 set(LIBBACKTRACE_DIR ${THIRD_PARTY_DIR}/libbacktrace/src)
358 set(LIBBACKTRACE_CONFIG_DIR ${THIRD_PARTY_DIR}/libbacktrace/config)
359 set(LIBBACKTRACE_INCLUDE_DIR ${THIRD_PARTY_DIR}/libbacktrace/src)
360 set(CPPDAP_DIR ${THIRD_PARTY_DIR}/cppdap)
361 set(CPPDAP_INCLUDE_DIR ${CPPDAP_DIR}/include)
362 set(JSON_INCLUDE_DIR ${THIRD_PARTY_DIR}/json/include)
363 set(SUBZERO_DIR ${THIRD_PARTY_DIR}/subzero)
364 set(SUBZERO_LLVM_DIR ${THIRD_PARTY_DIR}/llvm-subzero)
365 set(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests)
366 set(HELLO2_DIR ${THIRD_PARTY_DIR}/PowerVR_SDK/Examples/Beginner/01_HelloAPI/OGLES2)
367
368 ###########################################################
369 # Compile flags
370 ###########################################################
371
372 # Flags for project code (non 3rd party)
373 set(SWIFTSHADER_COMPILE_OPTIONS "")
374 set(SWIFTSHADER_LINK_FLAGS "")
375 set(SWIFTSHADER_LIBS "")
376
377 macro(set_cpp_flag FLAG)
378     if(${ARGC} GREATER 1)
379         set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${FLAG}")
380     else()
381         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
382     endif()
383 endmacro()
384
385 macro(set_linker_flag FLAG)
386     if(${ARGC} GREATER 1)
387         set(CMAKE_EXE_LINKER_FLAGS ${ARGV1} "${CMAKE_EXE_LINKER_FLAGS ${ARGV1}} ${FLAG}")
388     else()
389         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}")
390     endif()
391 endmacro()
392
393 if(MSVC)
394     set_cpp_flag("/MP")
395     add_definitions(-D_CRT_SECURE_NO_WARNINGS)
396     add_definitions(-D_SCL_SECURE_NO_WARNINGS)
397     add_definitions(-D_SBCS)  # Single Byte Character Set (ASCII)
398     add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)  # Disable MSVC warnings about std::aligned_storage being broken before VS 2017 15.8
399
400     set_cpp_flag("/DEBUG:FASTLINK" DEBUG)
401     set_cpp_flag("/DEBUG:FASTLINK" RELWITHDEBINFO)
402
403     # Disable specific warnings
404     # TODO: Not all of these should be disabled, but for now, we want a warning-free msvc build. Remove these one by one
405     #       and fix the actual warnings in code.
406     list(APPEND SWIFTSHADER_COMPILE_OPTIONS
407         "/wd4005" # 'identifier' : macro redefinition
408         "/wd4018" # 'expression' : signed/unsigned mismatch
409         "/wd4065" # switch statement contains 'default' but no 'case' labels
410         "/wd4141" # 'modifier' : used more than once
411         "/wd4244" # 'conversion' conversion from 'type1' to 'type2', possible loss of data
412         "/wd4267" # 'var' : conversion from 'size_t' to 'type', possible loss of data
413         "/wd4291" # 'void X new(size_t,unsigned int,unsigned int)': no matching operator delete found; memory will not be freed if initialization throws an exception
414         "/wd4309" # 'conversion' : truncation of constant value
415         "/wd4624" # 'derived class' : destructor was implicitly defined as deleted because a base class destructor is inaccessible or deleted
416         "/wd4800" # 'type' : forcing value to bool 'true' or 'false' (performance warning)
417         "/wd4838" # conversion from 'type_1' to 'type_2' requires a narrowing conversion
418         "/wd5030" # attribute 'attribute' is not recognized
419         "/wd5038" # data member 'member1' will be initialized after data member 'member2' data member 'member' will be initialized after base class 'base_class'
420     )
421
422     # Treat specific warnings as errors
423     list(APPEND SWIFTSHADER_COMPILE_OPTIONS
424         "/we4018" # 'expression' : signed/unsigned mismatch
425         "/we4471" # 'enumeration': a forward declaration of an unscoped enumeration must have an underlying type (int assumed)
426         "/we4838" # conversion from 'type_1' to 'type_2' requires a narrowing conversion
427         "/we5038" # data member 'member1' will be initialized after data member 'member2' data member 'member' will be initialized after base class 'base_class'
428     )
429 else()
430     list(APPEND SWIFTSHADER_COMPILE_OPTIONS
431         "-fno-exceptions"
432     )
433
434     # Explicitly enable these warnings.
435     list(APPEND SWIFTSHADER_COMPILE_OPTIONS
436         "-Wall"
437         "-Wreorder"
438         "-Wsign-compare"
439         "-Wmissing-braces"
440     )
441
442     if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
443         list(APPEND SWIFTSHADER_COMPILE_OPTIONS
444             "-Wunused-lambda-capture"
445             "-Wstring-conversion"
446             "-Wextra-semi"
447             "-Wignored-qualifiers"
448         )
449     endif()
450
451     if (SWIFTSHADER_EMIT_COVERAGE)
452         if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
453             list(APPEND SWIFTSHADER_COMPILE_OPTIONS "--coverage")
454             list(APPEND SWIFTSHADER_LIBS "gcov")
455         elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
456             list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-fprofile-instr-generate" "-fcoverage-mapping")
457             list(APPEND SWIFTSHADER_LINK_FLAGS "-fprofile-instr-generate" "-fcoverage-mapping")
458         else()
459             message(FATAL_ERROR "Coverage generation not supported for the ${CMAKE_CXX_COMPILER_ID} toolchain")
460         endif()
461     endif()
462
463     # Disable pedanitc warnings
464     if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
465         list(APPEND SWIFTSHADER_COMPILE_OPTIONS
466             "-Wno-ignored-attributes"   # ignoring attributes on template argument 'X'
467             "-Wno-attributes"           # 'X' attribute ignored
468             "-Wno-strict-aliasing"      # dereferencing type-punned pointer will break strict-aliasing rules
469             "-Wno-comment"              # multi-line comment
470         )
471         if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 9)
472             list(APPEND SWIFTSHADER_COMPILE_OPTIONS
473                 "-Wno-init-list-lifetime"  # assignment from temporary initializer_list does not extend the lifetime of the underlying array
474             )
475         endif()
476     elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
477         list(APPEND SWIFTSHADER_COMPILE_OPTIONS
478             "-Wno-unneeded-internal-declaration"  # function 'X' is not needed and will not be emitted
479             "-Wno-unused-private-field"           # private field 'offset' is not used - TODO: Consider enabling this once Vulkan is further implemented.
480             "-Wno-comment"                        # multi-line comment
481             "-Wno-undefined-var-template"         # instantiation of variable 'X' required here, but no definition is available
482             "-Wno-extra-semi"                     # extra ';' after member function definition
483
484             # Silence errors caused by unknown warnings when building with older
485             # versions of Clang. This demands checking that warnings added above
486             # are spelled correctly and work as intended!
487             "-Wno-unknown-warning-option"
488         )
489     endif()
490
491     # Remove xor, and, or and friends from the list of keywords, they are used
492     # by Reactor
493     list(APPEND SWIFTSHADER_COMPILE_OPTIONS
494         "-fno-operator-names"
495     )
496
497     # LLVM headers requires these flags to be set
498     set_cpp_flag("-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
499
500     if(ARCH STREQUAL "x86")
501         set_cpp_flag("-m32")
502         set_cpp_flag("-msse2")
503         set_cpp_flag("-mfpmath=sse")
504         set_cpp_flag("-march=pentium4")
505         set_cpp_flag("-mtune=generic")
506     endif()
507     if(ARCH STREQUAL "x86_64")
508         set_cpp_flag("-m64")
509         set_cpp_flag("-fPIC")
510         set_cpp_flag("-march=x86-64")
511         set_cpp_flag("-mtune=generic")
512     endif()
513     if(ARCH STREQUAL "mipsel")
514         set_cpp_flag("-EL")
515         set_cpp_flag("-march=mips32r2")
516         set_cpp_flag("-fPIC")
517         set_cpp_flag("-mhard-float")
518         set_cpp_flag("-mfp32")
519         set_cpp_flag("-mxgot")
520     endif()
521     if(ARCH STREQUAL "mips64el")
522         set_cpp_flag("-EL")
523         set_cpp_flag("-march=mips64r2")
524         set_cpp_flag("-mabi=64")
525         set_cpp_flag("-fPIC")
526         set_cpp_flag("-mxgot")
527     endif()
528
529     if(SWIFTSHADER_LESS_DEBUG_INFO)
530         # Use -g1 to be able to get stack traces
531         set_cpp_flag("-g -g1" DEBUG)
532         set_cpp_flag("-g -g1" RELWITHDEBINFO)
533     else()
534         # Use -g3 to have even more debug info
535         set_cpp_flag("-g -g3" DEBUG)
536         set_cpp_flag("-g -g3" RELWITHDEBINFO)
537     endif()
538
539     if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
540         # Treated as an unused argument with clang
541         set_cpp_flag("-s" RELEASE)
542     endif()
543
544     # For distribution it is more important to be slim than super optimized
545     set_cpp_flag("-Os" RELEASE)
546     set_cpp_flag("-Os" RELWITHDEBINFO)
547
548     set_cpp_flag("-DNDEBUG" RELEASE)
549     set_cpp_flag("-DNDEBUG" RELWITHDEBINFO)
550     set_cpp_flag("-DANGLE_DISABLE_TRACE" RELEASE)
551     set_cpp_flag("-DANGLE_DISABLE_TRACE" RELWITHDEBINFO)
552
553     # Put each variable and function in its own section so that when linking
554     # with -gc-sections unused functions and variables are removed.
555     set_cpp_flag("-ffunction-sections" RELEASE)
556     set_cpp_flag("-fdata-sections" RELEASE)
557     set_cpp_flag("-fomit-frame-pointer" RELEASE)
558
559     if(SWIFTSHADER_MSAN)
560         set_cpp_flag("-fsanitize=memory")
561         set_linker_flag("-fsanitize=memory")
562     elseif(SWIFTSHADER_ASAN)
563         set_cpp_flag("-fsanitize=address")
564         set_linker_flag("-fsanitize=address")
565     elseif(SWIFTSHADER_TSAN)
566         set_cpp_flag("-fsanitize=thread")
567         set_linker_flag("-fsanitize=thread")
568     elseif(SWIFTSHADER_UBSAN)
569         set_cpp_flag("-fsanitize=undefined")
570         set_linker_flag("-fsanitize=undefined")
571     endif()
572 endif()
573
574 if(SWIFTSHADER_DCHECK_ALWAYS_ON)
575     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DDCHECK_ALWAYS_ON")
576 endif()
577
578 if(SWIFTSHADER_WARNINGS_AS_ERRORS)
579     if(MSVC)
580         set(WARNINGS_AS_ERRORS "/WX")  # Treat all warnings as errors
581     else()
582         set(WARNINGS_AS_ERRORS "-Werror")  # Treat all warnings as errors
583     endif()
584 endif()
585
586 if(REACTOR_EMIT_PRINT_LOCATION)
587     # This feature depends on REACTOR_EMIT_DEBUG_INFO and REACTOR_ENABLE_PRINT
588     set(REACTOR_EMIT_DEBUG_INFO "On")
589     set(REACTOR_ENABLE_PRINT "On")
590     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_EMIT_PRINT_LOCATION")
591 endif()
592
593 if(REACTOR_EMIT_DEBUG_INFO)
594     message(WARNING "REACTOR_EMIT_DEBUG_INFO is enabled. This will likely affect performance.")
595     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_DEBUG_INFO")
596 endif()
597
598 if(REACTOR_ENABLE_PRINT)
599     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_PRINT")
600 endif()
601
602 if(REACTOR_VERIFY_LLVM_IR)
603     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_LLVM_IR_VERIFICATION")
604 endif()
605
606 if(REACTOR_DEFAULT_OPT_LEVEL)
607     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DREACTOR_DEFAULT_OPT_LEVEL=${REACTOR_DEFAULT_OPT_LEVEL}")
608 endif()
609
610 if(WIN32)
611     add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
612     set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
613 endif()
614
615 # Transform SWIFTSHADER_LINK_FLAGS from semicolon delimited to whitespace
616 # delimited (what is expected by LINK_FLAGS)
617 string(REPLACE ";" " " SWIFTSHADER_LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}")
618
619 ###########################################################
620 # LLVM
621 ###########################################################
622 add_subdirectory(third_party/llvm-${SWIFTSHADER_LLVM_VERSION})
623
624
625 ###########################################################
626 # marl
627 ###########################################################
628 if(BUILD_MARL)
629     set(MARL_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
630     add_subdirectory(third_party/marl)
631 endif()
632
633
634 ###########################################################
635 # cppdap
636 ###########################################################
637 if(SWIFTSHADER_BUILD_CPPDAP)
638     set(CPPDAP_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
639     add_subdirectory(${CPPDAP_DIR})
640 endif()
641
642
643 ###########################################################
644 # Subzero
645 ###########################################################
646
647 set(SUBZERO_LIST
648     ${SUBZERO_DIR}/src/IceAssembler.cpp
649     ${SUBZERO_DIR}/src/IceCfg.cpp
650     ${SUBZERO_DIR}/src/IceCfgNode.cpp
651     ${SUBZERO_DIR}/src/IceClFlags.cpp
652     ${SUBZERO_DIR}/src/IceELFObjectWriter.cpp
653     ${SUBZERO_DIR}/src/IceELFSection.cpp
654     ${SUBZERO_DIR}/src/IceFixups.cpp
655     ${SUBZERO_DIR}/src/IceGlobalContext.cpp
656     ${SUBZERO_DIR}/src/IceGlobalInits.cpp
657     ${SUBZERO_DIR}/src/IceInst.cpp
658     ${SUBZERO_DIR}/src/IceInstrumentation.cpp
659     ${SUBZERO_DIR}/src/IceIntrinsics.cpp
660     ${SUBZERO_DIR}/src/IceLiveness.cpp
661     ${SUBZERO_DIR}/src/IceLoopAnalyzer.cpp
662     ${SUBZERO_DIR}/src/IceMangling.cpp
663     ${SUBZERO_DIR}/src/IceMemory.cpp
664     ${SUBZERO_DIR}/src/IceOperand.cpp
665     ${SUBZERO_DIR}/src/IceRangeSpec.cpp
666     ${SUBZERO_DIR}/src/IceRegAlloc.cpp
667     ${SUBZERO_DIR}/src/IceRevision.cpp
668     ${SUBZERO_DIR}/src/IceRNG.cpp
669     ${SUBZERO_DIR}/src/IceSwitchLowering.cpp
670     ${SUBZERO_DIR}/src/IceTargetLowering.cpp
671     ${SUBZERO_DIR}/src/IceThreading.cpp
672     ${SUBZERO_DIR}/src/IceTimerTree.cpp
673     ${SUBZERO_DIR}/src/IceTypes.cpp
674     ${SUBZERO_DIR}/src/IceVariableSplitting.cpp
675 )
676
677 # FIXME: Shouldn't depend on external source files directly.
678 list(APPEND SUBZERO_LIST
679     ${SOURCE_DIR}/Common/Memory.cpp
680 )
681
682 if(ARCH STREQUAL "x86_64")
683     list(APPEND SUBZERO_LIST
684         ${SUBZERO_DIR}/src/IceTargetLoweringX86.cpp
685         ${SUBZERO_DIR}/src/IceInstX8664.cpp
686         ${SUBZERO_DIR}/src/IceTargetLoweringX8664.cpp
687     )
688     set(SUBZERO_TARGET X8664)
689 elseif(ARCH STREQUAL "x86")
690     list(APPEND SUBZERO_LIST
691         ${SUBZERO_DIR}/src/IceTargetLoweringX86.cpp
692         ${SUBZERO_DIR}/src/IceInstX8632.cpp
693         ${SUBZERO_DIR}/src/IceTargetLoweringX8632.cpp
694     )
695     set(SUBZERO_TARGET X8632)
696 elseif(ARCH STREQUAL "arm")
697     list(APPEND SUBZERO_LIST
698         ${SUBZERO_DIR}/src/IceAssemblerARM32.cpp
699         ${SUBZERO_DIR}/src/IceInstARM32.cpp
700         ${SUBZERO_DIR}/src/IceTargetLoweringARM32.cpp
701     )
702     set(SUBZERO_TARGET ARM32)
703 elseif(ARCH STREQUAL "mipsel")
704     list(APPEND SUBZERO_LIST
705         ${SUBZERO_DIR}/src/IceAssemblerMIPS32.cpp
706         ${SUBZERO_DIR}/src/IceInstMIPS32.cpp
707         ${SUBZERO_DIR}/src/IceTargetLoweringMIPS32.cpp
708     )
709     set(SUBZERO_TARGET MIPS32)
710 else()
711     message(FATAL_ERROR "Architecture '${ARCH}' not supported by Subzero")
712 endif()
713
714 file(GLOB_RECURSE SUBZERO_DEPENDENCIES_LIST
715     ${SUBZERO_LLVM_DIR}/*.cpp
716     ${SUBZERO_LLVM_DIR}/*.c
717     ${SUBZERO_LLVM_DIR}/*.h
718 )
719
720 set(SUBZERO_REACTOR_LIST
721     ${SOURCE_DIR}/Reactor/Debug.cpp
722     ${SOURCE_DIR}/Reactor/Debug.hpp
723     ${SOURCE_DIR}/Reactor/EmulatedReactor.cpp
724     ${SOURCE_DIR}/Reactor/ExecutableMemory.cpp
725     ${SOURCE_DIR}/Reactor/ExecutableMemory.hpp
726     ${SOURCE_DIR}/Reactor/Nucleus.hpp
727     ${SOURCE_DIR}/Reactor/Optimizer.cpp
728     ${SOURCE_DIR}/Reactor/Print.hpp
729     ${SOURCE_DIR}/Reactor/Reactor.cpp
730     ${SOURCE_DIR}/Reactor/Reactor.hpp
731     ${SOURCE_DIR}/Reactor/ReactorDebugInfo.cpp
732     ${SOURCE_DIR}/Reactor/ReactorDebugInfo.hpp
733     ${SOURCE_DIR}/Reactor/Routine.hpp
734     ${SOURCE_DIR}/Reactor/SubzeroReactor.cpp
735 )
736
737 set(SUBZERO_INCLUDE_DIR
738     ${SUBZERO_DIR}/
739     ${SUBZERO_LLVM_DIR}/include/
740     ${SUBZERO_DIR}/pnacl-llvm/include/
741 )
742
743 if(WIN32)
744     list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/Windows/include/)
745 elseif(LINUX)
746     list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/Linux/include/)
747 elseif(APPLE)
748     list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/MacOS/include/)
749 endif()
750
751 if(WIN32)
752     list(APPEND SUBZERO_COMPILE_OPTIONS
753         "/wd4146" # unary minus operator applied to unsigned type, result still unsigned
754         "/wd4334" # ''operator' : result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
755         "/wd4996" # The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new_name.
756     )
757     list(APPEND SUBZERO_DEPENDENCIES_COMPILE_OPTIONS
758         ${SUBZERO_COMPILE_OPTIONS}
759         "/wd4267"  # '=': conversion from 'size_t' to 'sopno', possible loss of data
760         "/wd4244"  # '=': conversion from '__int64' to 'llvm_regoff_t', possible loss of data
761         "/wd4141"  # 'inline': used more than once
762         "/wd4291"  # 'void *operator new(size_t,const `anonymous-namespace'::NamedBufferAlloc &)': no matching operator delete found; memory will not be freed if initialization throws an exception
763     )
764 endif()
765
766 add_library(SubzeroDependencies STATIC EXCLUDE_FROM_ALL
767     ${SUBZERO_DEPENDENCIES_LIST}
768 )
769 set_target_properties(SubzeroDependencies PROPERTIES
770     POSITION_INDEPENDENT_CODE 1
771     INCLUDE_DIRECTORIES "${SUBZERO_INCLUDE_DIR}"
772     COMPILE_OPTIONS "${SUBZERO_DEPENDENCIES_COMPILE_OPTIONS}"
773     FOLDER "Subzero"
774 )
775
776 add_library(ReactorSubzero STATIC EXCLUDE_FROM_ALL
777     ${SUBZERO_LIST}
778     ${SUBZERO_REACTOR_LIST}
779 )
780 set_target_properties(ReactorSubzero PROPERTIES
781     POSITION_INDEPENDENT_CODE 1
782     INCLUDE_DIRECTORIES "${SUBZERO_INCLUDE_DIR}"
783     COMPILE_OPTIONS "${SUBZERO_COMPILE_OPTIONS};${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
784     COMPILE_DEFINITIONS "SZTARGET=${SUBZERO_TARGET}; ALLOW_DUMP=0; ALLOW_TIMERS=0; ALLOW_LLVM_CL=0; ALLOW_LLVM_IR=0; ALLOW_LLVM_IR_AS_INPUT=0; ALLOW_MINIMAL_BUILD=0; ALLOW_WASM=0; ICE_THREAD_LOCAL_HACK=0;"
785     FOLDER "Subzero"
786 )
787 target_link_libraries(ReactorSubzero SubzeroDependencies marl)
788
789 if(WIN32)
790     target_compile_definitions(ReactorSubzero PRIVATE SUBZERO_USE_MICROSOFT_ABI)
791 endif()
792
793 ###########################################################
794 # Include Directories
795 ###########################################################
796
797 set(COMMON_INCLUDE_DIR
798     ${SOURCE_DIR}
799     ${CMAKE_CURRENT_SOURCE_DIR}/include
800     ${LIBBACKTRACE_INCLUDE_DIR}
801 )
802 set(OPENGL_INCLUDE_DIR
803     ${OPENGL_DIR}
804     ${COMMON_INCLUDE_DIR}
805 )
806
807 set(VULKAN_INCLUDE_DIR
808     ${COMMON_INCLUDE_DIR}
809     ${CPPDAP_INCLUDE_DIR}
810 )
811
812 ###########################################################
813 # File Lists
814 ###########################################################
815
816 file(GLOB_RECURSE SWIFTSHADER_LIST
817     ${SOURCE_DIR}/Common/*.cpp
818     ${SOURCE_DIR}/Common/*.h
819     ${SOURCE_DIR}/Common/*.hpp
820     ${SOURCE_DIR}/Renderer/*.cpp
821     ${SOURCE_DIR}/Renderer/*.h
822     ${SOURCE_DIR}/Renderer/*.hpp
823     ${SOURCE_DIR}/Shader/*.cpp
824     ${SOURCE_DIR}/Shader/*.h
825     ${SOURCE_DIR}/Shader/*.hpp
826 )
827 list(APPEND SWIFTSHADER_LIST
828     ${SOURCE_DIR}/Main/Config.cpp
829     ${SOURCE_DIR}/Main/Config.hpp
830     ${SOURCE_DIR}/Main/FrameBuffer.cpp
831     ${SOURCE_DIR}/Main/FrameBuffer.hpp
832     ${SOURCE_DIR}/Main/SwiftConfig.cpp
833     ${SOURCE_DIR}/Main/SwiftConfig.hpp
834 )
835 list(REMOVE_ITEM SWIFTSHADER_LIST
836     ${SOURCE_DIR}/Common/DebugAndroid.cpp
837     ${SOURCE_DIR}/Common/DebugAndroid.hpp
838     ${SOURCE_DIR}/Common/GrallocAndroid.cpp
839     ${SOURCE_DIR}/Common/GrallocAndroid.hpp
840 )
841
842 if(REACTOR_EMIT_DEBUG_INFO)
843     set(LIBBACKTRACE_LIST
844         ${LIBBACKTRACE_DIR}/atomic.c
845         ${LIBBACKTRACE_DIR}/backtrace.c
846         ${LIBBACKTRACE_DIR}/backtrace.h
847         ${LIBBACKTRACE_DIR}/dwarf.c
848         ${LIBBACKTRACE_DIR}/fileline.c
849         ${LIBBACKTRACE_DIR}/filenames.h
850         ${LIBBACKTRACE_DIR}/internal.h
851         ${LIBBACKTRACE_DIR}/mmap.c
852         ${LIBBACKTRACE_DIR}/mmapio.c
853         ${LIBBACKTRACE_DIR}/posix.c
854         ${LIBBACKTRACE_DIR}/print.c
855         ${LIBBACKTRACE_DIR}/simple.c
856         ${LIBBACKTRACE_DIR}/sort.c
857         ${LIBBACKTRACE_DIR}/state.c
858         ${LIBBACKTRACE_INCLUDE_DIR}/backtrace-supported.h
859         ${LIBBACKTRACE_INCLUDE_DIR}/config.h
860     )
861
862     if(WIN32)
863         list(APPEND LIBBACKTRACE_LIST ${LIBBACKTRACE_DIR}/pecoff.c)
864     elseif(LINUX)
865         list(APPEND LIBBACKTRACE_LIST ${LIBBACKTRACE_DIR}/elf.c)
866     elseif(APPLE)
867         message(FATAL_ERROR "libbacktrace does not support mach-o yet")
868     endif()
869 endif(REACTOR_EMIT_DEBUG_INFO)
870
871 set(REACTOR_LLVM_LIST
872     ${SOURCE_DIR}/Reactor/CPUID.cpp
873     ${SOURCE_DIR}/Reactor/CPUID.hpp
874     ${SOURCE_DIR}/Reactor/Debug.cpp
875     ${SOURCE_DIR}/Reactor/Debug.hpp
876     ${SOURCE_DIR}/Reactor/EmulatedReactor.cpp
877     ${SOURCE_DIR}/Reactor/ExecutableMemory.cpp
878     ${SOURCE_DIR}/Reactor/ExecutableMemory.hpp
879     ${SOURCE_DIR}/Reactor/LLVMJIT.cpp
880     ${SOURCE_DIR}/Reactor/LLVMReactor.cpp
881     ${SOURCE_DIR}/Reactor/LLVMReactor.hpp
882     ${SOURCE_DIR}/Reactor/LLVMReactorDebugInfo.cpp
883     ${SOURCE_DIR}/Reactor/LLVMReactorDebugInfo.hpp
884     ${SOURCE_DIR}/Reactor/Nucleus.hpp
885     ${SOURCE_DIR}/Reactor/Print.hpp
886     ${SOURCE_DIR}/Reactor/Reactor.cpp
887     ${SOURCE_DIR}/Reactor/Reactor.hpp
888     ${SOURCE_DIR}/Reactor/ReactorDebugInfo.cpp
889     ${SOURCE_DIR}/Reactor/ReactorDebugInfo.hpp
890     ${SOURCE_DIR}/Reactor/Routine.hpp
891 )
892
893 file(GLOB_RECURSE EGL_LIST
894     ${OPENGL_DIR}/libEGL/*.cpp
895     ${OPENGL_DIR}/libEGL/*.h
896     ${OPENGL_DIR}/libEGL/*.hpp
897     ${OPENGL_DIR}/common/Object.cpp
898     ${OPENGL_DIR}/common/Object.hpp
899     ${OPENGL_DIR}/common/debug.cpp
900     ${OPENGL_DIR}/common/debug.h
901     ${SOURCE_DIR}/Common/SharedLibrary.cpp
902     ${SOURCE_DIR}/Common/SharedLibrary.hpp
903     ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h
904 )
905
906 file(GLOB_RECURSE GLES2_LIST
907     ${OPENGL_DIR}/libGLESv2/*.cpp
908     ${OPENGL_DIR}/libGLESv2/*.h
909     ${OPENGL_DIR}/libGLESv2/*.hpp
910     ${OPENGL_DIR}/common/*.cpp
911     ${OPENGL_DIR}/common/*.h
912     ${OPENGL_DIR}/common/*.hpp
913     ${SOURCE_DIR}/Common/SharedLibrary.cpp
914     ${SOURCE_DIR}/Common/SharedLibrary.hpp
915     ${CMAKE_CURRENT_SOURCE_DIR}/include/KHR/*.h
916     ${CMAKE_CURRENT_SOURCE_DIR}/include/GLES2/*.h
917     ${CMAKE_CURRENT_SOURCE_DIR}/include/GLES3/*.h
918 )
919
920 file(GLOB_RECURSE GLES_CM_LIST
921     ${OPENGL_DIR}/libGLES_CM/*.cpp
922     ${OPENGL_DIR}/libGLES_CM/*.h
923     ${OPENGL_DIR}/libGLES_CM/*.hpp
924     ${OPENGL_DIR}/common/*.cpp
925     ${OPENGL_DIR}/common/*.h
926     ${OPENGL_DIR}/common/*.hpp
927     ${SOURCE_DIR}/Common/SharedLibrary.cpp
928     ${SOURCE_DIR}/Common/SharedLibrary.hpp
929     ${CMAKE_CURRENT_SOURCE_DIR}/include/KHR/*.h
930     ${CMAKE_CURRENT_SOURCE_DIR}/include/GLES/*.h
931 )
932
933 file(GLOB_RECURSE OPENGL_COMPILER_LIST
934     ${OPENGL_COMPILER_DIR}/*.cpp
935     ${OPENGL_COMPILER_DIR}/*.h
936     ${OPENGL_COMPILER_DIR}/*.hpp
937 )
938 file(GLOB_RECURSE OPENGL_COMPILER_OS_SPECIFIC_LIST
939     ${OPENGL_COMPILER_DIR}/ossource*.cpp
940     ${OPENGL_COMPILER_DIR}/ossource*.h
941     ${OPENGL_COMPILER_DIR}/ossource*.hpp
942 )
943 list(REMOVE_ITEM OPENGL_COMPILER_LIST ${OPENGL_COMPILER_OS_SPECIFIC_LIST})
944
945 file(GLOB VULKAN_LIST
946     ${VULKAN_DIR}/*.cpp
947     ${VULKAN_DIR}/*.h
948     ${VULKAN_DIR}/*.hpp
949     ${SOURCE_DIR}/System/Build.cpp
950     ${SOURCE_DIR}/System/Build.hpp
951     ${SOURCE_DIR}/System/CPUID.cpp
952     ${SOURCE_DIR}/System/CPUID.hpp
953     ${SOURCE_DIR}/System/Configurator.cpp
954     ${SOURCE_DIR}/System/Configurator.hpp
955     ${SOURCE_DIR}/System/Debug.cpp
956     ${SOURCE_DIR}/System/Debug.hpp
957     ${SOURCE_DIR}/System/Half.cpp
958     ${SOURCE_DIR}/System/Half.hpp
959     ${SOURCE_DIR}/System/Math.cpp
960     ${SOURCE_DIR}/System/Math.hpp
961     ${SOURCE_DIR}/System/Memory.cpp
962     ${SOURCE_DIR}/System/Memory.hpp
963     ${SOURCE_DIR}/System/Socket.cpp
964     ${SOURCE_DIR}/System/Socket.hpp
965     ${SOURCE_DIR}/System/Synchronization.hpp
966     ${SOURCE_DIR}/System/Timer.cpp
967     ${SOURCE_DIR}/System/Timer.hpp
968     ${SOURCE_DIR}/Device/*.cpp
969     ${SOURCE_DIR}/Device/*.hpp
970     ${SOURCE_DIR}/Pipeline/*.cpp
971     ${SOURCE_DIR}/Pipeline/*.hpp
972     ${SOURCE_DIR}/WSI/VkSurfaceKHR.cpp
973     ${SOURCE_DIR}/WSI/VkSurfaceKHR.hpp
974     ${SOURCE_DIR}/WSI/VkSwapchainKHR.cpp
975     ${SOURCE_DIR}/WSI/VkSwapchainKHR.hpp
976     ${CMAKE_CURRENT_SOURCE_DIR}/include/vulkan/*.h}
977 )
978
979 if(SWIFTSHADER_ENABLE_VULKAN_DEBUGGER)
980     file(GLOB_RECURSE VULKAN_DEBUG_LIST
981         ${VULKAN_DIR}/Debug/*.cpp
982         ${VULKAN_DIR}/Debug/*.h
983         ${VULKAN_DIR}/Debug/*.hpp
984     )
985     list(APPEND VULKAN_LIST ${VULKAN_DEBUG_LIST})
986     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_VK_DEBUGGER")
987 endif()
988
989 if(SWIFTSHADER_ENABLE_ASTC)
990     file(GLOB_RECURSE VULKAN_ASTC_LIST
991         ${ASTC_DIR}/Source/*.cpp
992         ${ASTC_DIR}/Source/*.h
993     )
994     list(APPEND VULKAN_LIST ${VULKAN_ASTC_LIST})
995     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DSWIFTSHADER_ENABLE_ASTC")
996 endif()
997
998 if(LINUX OR ANDROID)
999     list(APPEND VULKAN_LIST
1000         ${SOURCE_DIR}/System/Linux/MemFd.cpp
1001         ${SOURCE_DIR}/System/Linux/MemFd.hpp)
1002 endif()
1003
1004 ###########################################################
1005 # Append OS specific files to lists
1006 ###########################################################
1007
1008 if(WIN32)
1009     list(APPEND SWIFTSHADER_LIST
1010         ${SOURCE_DIR}/Main/FrameBufferDD.cpp
1011         ${SOURCE_DIR}/Main/FrameBufferDD.hpp
1012         ${SOURCE_DIR}/Main/FrameBufferGDI.cpp
1013         ${SOURCE_DIR}/Main/FrameBufferGDI.hpp
1014         ${SOURCE_DIR}/Main/FrameBufferWin.cpp
1015         ${SOURCE_DIR}/Main/FrameBufferWin.hpp
1016     )
1017     list(APPEND OPENGL_COMPILER_LIST ${OPENGL_COMPILER_DIR}/ossource_win.cpp)
1018     list(APPEND EGL_LIST ${OPENGL_DIR}/libEGL/libEGL.rc)
1019     list(APPEND GLES2_LIST ${OPENGL_DIR}/libGLESv2/libGLESv2.rc)
1020     list(APPEND GLES_CM_LIST ${OPENGL_DIR}/libGLES_CM/libGLES_CM.rc)
1021     list(APPEND VULKAN_LIST
1022         ${VULKAN_DIR}/Vulkan.rc
1023         ${SOURCE_DIR}/WSI/Win32SurfaceKHR.cpp
1024         ${SOURCE_DIR}/WSI/Win32SurfaceKHR.hpp
1025     )
1026 elseif(LINUX)
1027     list(APPEND SWIFTSHADER_LIST
1028         ${SOURCE_DIR}/Main/FrameBufferX11.cpp
1029         ${SOURCE_DIR}/Main/FrameBufferX11.hpp
1030         ${SOURCE_DIR}/Common/SharedLibrary.hpp
1031         ${SOURCE_DIR}/Main/libX11.cpp
1032         ${SOURCE_DIR}/Main/libX11.hpp
1033     )
1034     list(APPEND EGL_LIST
1035         ${SOURCE_DIR}/Common/SharedLibrary.hpp
1036         ${SOURCE_DIR}/Main/libX11.cpp
1037         ${SOURCE_DIR}/Main/libX11.hpp
1038     )
1039     list(APPEND OPENGL_COMPILER_LIST
1040         ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
1041     )
1042
1043     if(X11)
1044         list(APPEND VULKAN_LIST
1045             ${SOURCE_DIR}/WSI/XlibSurfaceKHR.cpp
1046             ${SOURCE_DIR}/WSI/XlibSurfaceKHR.hpp
1047             ${SOURCE_DIR}/WSI/libX11.cpp
1048             ${SOURCE_DIR}/WSI/libX11.hpp
1049         )
1050     endif()
1051
1052     if(XCB)
1053         list(APPEND VULKAN_LIST
1054             ${SOURCE_DIR}/WSI/XcbSurfaceKHR.cpp
1055             ${SOURCE_DIR}/WSI/XcbSurfaceKHR.hpp
1056         )
1057     endif()
1058
1059 elseif(APPLE)
1060     list(APPEND SWIFTSHADER_LIST
1061         ${SOURCE_DIR}/Main/FrameBufferOSX.mm
1062         ${SOURCE_DIR}/Main/FrameBufferOSX.hpp
1063     )
1064     list(APPEND EGL_LIST
1065         ${OPENGL_DIR}/libEGL/OSXUtils.mm
1066         ${OPENGL_DIR}/libEGL/OSXUtils.hpp
1067     )
1068     list(APPEND OPENGL_COMPILER_LIST
1069         ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
1070     )
1071
1072     list(APPEND VULKAN_LIST
1073         ${SOURCE_DIR}/WSI/MetalSurface.mm
1074         ${SOURCE_DIR}/WSI/MetalSurface.h
1075     )
1076 elseif(ANDROID)
1077     list(APPEND SWIFTSHADER_LIST
1078         ${SOURCE_DIR}/Main/FrameBufferAndroid.cpp
1079         ${SOURCE_DIR}/Main/FrameBufferAndroid.hpp
1080     )
1081     list(APPEND OPENGL_COMPILER_LIST
1082         ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
1083     )
1084 endif()
1085
1086 if(WIN32)
1087     set(OS_LIBS odbc32 odbccp32 WS2_32 dxguid)
1088 elseif(LINUX)
1089     set(OS_LIBS dl pthread)
1090 elseif(APPLE)
1091     find_library(COCOA_FRAMEWORK Cocoa)
1092     find_library(QUARTZ_FRAMEWORK Quartz)
1093     find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
1094     find_library(IOSURFACE_FRAMEWORK IOSurface)
1095     find_library(METAL_FRAMEWORK Metal)
1096     set(OS_LIBS "${COCOA_FRAMEWORK}" "${QUARTZ_FRAMEWORK}" "${CORE_FOUNDATION_FRAMEWORK}" "${IOSURFACE_FRAMEWORK}" "${METAL_FRAMEWORK}")
1097 endif()
1098
1099 ###########################################################
1100 # SwiftShader Targets
1101 ###########################################################
1102
1103 add_library(SwiftShader STATIC EXCLUDE_FROM_ALL ${SWIFTSHADER_LIST})
1104 set_target_properties(SwiftShader PROPERTIES
1105     INCLUDE_DIRECTORIES "${COMMON_INCLUDE_DIR}"
1106     POSITION_INDEPENDENT_CODE 1
1107     FOLDER "Core"
1108     COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1109     COMPILE_DEFINITIONS "NO_SANITIZE_FUNCTION=;"
1110     LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1111 )
1112 target_link_libraries(SwiftShader ${OS_LIBS} ${SWIFTSHADER_LIBS})
1113
1114 add_library(ReactorLLVM STATIC EXCLUDE_FROM_ALL ${REACTOR_LLVM_LIST})
1115 set_target_properties(ReactorLLVM PROPERTIES
1116     INCLUDE_DIRECTORIES "${COMMON_INCLUDE_DIR}"
1117     POSITION_INDEPENDENT_CODE 1
1118     FOLDER "Core"
1119     COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1120     LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1121 )
1122 target_link_libraries(ReactorLLVM llvm ${OS_LIBS})
1123
1124 if(${REACTOR_BACKEND} STREQUAL "LLVM")
1125     set(Reactor ReactorLLVM)
1126 elseif(${REACTOR_BACKEND} STREQUAL "Subzero")
1127     set(Reactor ReactorSubzero)
1128 else()
1129     message(FATAL_ERROR "REACTOR_BACKEND must be 'LLVM' or 'Subzero'")
1130 endif()
1131
1132 if(REACTOR_EMIT_DEBUG_INFO)
1133     if(WIN32)
1134         # Boost stacktrace uses COM on Windows.
1135         # On Windows, cache COM instances in TLS for performance.
1136         target_compile_definitions(${Reactor} PRIVATE BOOST_STACKTRACE_USE_WINDBG_CACHED)
1137     else()
1138         # Boost stacktrace uses libbacktrace
1139         target_compile_definitions(${Reactor} PRIVATE BOOST_STACKTRACE_USE_BACKTRACE)
1140
1141         # Boost stacktrace uses exceptions, so force enable it
1142         set_cpp_flag("-fexceptions")
1143
1144         add_library(Libbacktrace STATIC EXCLUDE_FROM_ALL ${LIBBACKTRACE_LIST})
1145         set_target_properties(Libbacktrace PROPERTIES
1146             INCLUDE_DIRECTORIES "${LIBBACKTRACE_INCLUDE_DIR}"
1147             POSITION_INDEPENDENT_CODE 1
1148             FOLDER "Core"
1149         )
1150         target_link_libraries(Libbacktrace ${OS_LIBS} ${SWIFTSHADER_LIBS})
1151         target_link_libraries(${Reactor} Libbacktrace)
1152     endif()
1153
1154     # Download boost and use it
1155     DownloadBoost()
1156     set(BOOST_INCLUDEDIR ${BOOST_THIRD_PARTY_DIR})
1157     find_package(Boost REQUIRED)
1158     target_link_libraries(${Reactor} Boost::boost)
1159 endif(REACTOR_EMIT_DEBUG_INFO)
1160
1161 add_library(GLCompiler STATIC EXCLUDE_FROM_ALL ${OPENGL_COMPILER_LIST})
1162 set_target_properties(GLCompiler PROPERTIES
1163     INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
1164     POSITION_INDEPENDENT_CODE 1
1165     FOLDER "OpenGL"
1166     COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1167     LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1168 )
1169 target_link_libraries(GLCompiler ${OS_LIBS} ${SWIFTSHADER_LIBS})
1170
1171 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
1172     set(LIB_PREFIX "lib64")
1173 else()
1174     set(LIB_PREFIX "lib")
1175 endif()
1176
1177 if(SWIFTSHADER_BUILD_EGL)
1178     add_library(libEGL SHARED ${EGL_LIST})
1179     set_target_properties(libEGL PROPERTIES
1180         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
1181         FOLDER "OpenGL"
1182         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1183         COMPILE_DEFINITIONS "EGL_EGLEXT_PROTOTYPES; EGLAPI=; NO_SANITIZE_FUNCTION=;$<$<CONFIG:Debug>:DEBUGGER_WAIT_DIALOG>"
1184         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1185         PREFIX ""
1186     )
1187     if(LINUX)
1188         if(X11)
1189             set_property(TARGET libEGL APPEND PROPERTY COMPILE_DEFINITIONS "USE_X11=1")
1190         endif()
1191     endif()
1192     if (ANDROID)
1193         set_target_properties(libEGL PROPERTIES SUFFIX "_swiftshader.so")
1194     endif ()
1195     set_shared_library_export_map(libEGL ${SOURCE_DIR}/OpenGL/libEGL)
1196     target_link_libraries(libEGL ${OS_LIBS} ${SWIFTSHADER_LIBS})
1197     add_custom_command(
1198         TARGET libEGL
1199         POST_BUILD
1200         COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libEGL>/translator
1201         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libEGL> $<TARGET_FILE_DIR:libEGL>/translator/${LIB_PREFIX}EGL_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
1202         COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
1203         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libEGL> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
1204     )
1205 endif()
1206
1207 if(SWIFTSHADER_BUILD_GLESv2)
1208     add_library(libGLESv2 SHARED ${GLES2_LIST})
1209     set_target_properties(libGLESv2 PROPERTIES
1210         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
1211         FOLDER "OpenGL"
1212         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1213         COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES; GL_API=; GL_APICALL=; GLAPI=; NO_SANITIZE_FUNCTION=;"
1214         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1215         PREFIX ""
1216     )
1217     if (ANDROID)
1218         set_target_properties(libGLESv2 PROPERTIES SUFFIX "_swiftshader.so")
1219     endif ()
1220     set_shared_library_export_map(libGLESv2 ${SOURCE_DIR}/OpenGL/libGLESv2)
1221     target_link_libraries(libGLESv2 SwiftShader ${Reactor} GLCompiler ${OS_LIBS} ${SWIFTSHADER_LIBS})
1222     add_custom_command(
1223         TARGET libGLESv2
1224         POST_BUILD
1225         COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libGLESv2>/translator
1226         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLESv2> $<TARGET_FILE_DIR:libGLESv2>/translator/${LIB_PREFIX}GLES_V2_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
1227         COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
1228         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLESv2> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
1229     )
1230 endif()
1231
1232 if(SWIFTSHADER_BUILD_GLES_CM)
1233     add_library(libGLES_CM SHARED ${GLES_CM_LIST})
1234     set_target_properties(libGLES_CM PROPERTIES
1235         INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
1236         FOLDER "OpenGL"
1237         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1238         COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES; EGLAPI=; GL_API=; GL_APICALL=; GLAPI=;"
1239         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1240         PREFIX ""
1241     )
1242     if (ANDROID)
1243         set_target_properties(libGLES_CM PROPERTIES SUFFIX "_swiftshader.so")
1244     endif ()
1245     set_shared_library_export_map(libGLES_CM ${SOURCE_DIR}/OpenGL/libGLES_CM)
1246     target_link_libraries(libGLES_CM SwiftShader ${Reactor} GLCompiler ${OS_LIBS} ${SWIFTSHADER_LIBS})
1247     add_custom_command(
1248         TARGET libGLES_CM
1249         POST_BUILD
1250         COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:libGLES_CM>/translator
1251         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLES_CM> $<TARGET_FILE_DIR:libGLES_CM>/translator/${LIB_PREFIX}GLES_CM_translator${CMAKE_SHARED_LIBRARY_SUFFIX}
1252     )
1253 endif(SWIFTSHADER_BUILD_GLES_CM)
1254
1255 if(SWIFTSHADER_BUILD_VULKAN)
1256     add_library(vk_swiftshader SHARED ${VULKAN_LIST})
1257
1258     if (NOT TARGET SPIRV-Tools)
1259         # This variable is also used by SPIRV-Tools to locate SPIRV-Headers
1260         set(SPIRV-Headers_SOURCE_DIR "${THIRD_PARTY_DIR}/SPIRV-Headers")
1261         list(APPEND VULKAN_INCLUDE_DIR "${SPIRV-Headers_SOURCE_DIR}/include")
1262
1263         add_subdirectory(third_party/SPIRV-Tools)
1264
1265         set_target_properties(core_tables PROPERTIES FOLDER "SPIRV-Tools build")
1266         set_target_properties(enum_string_mapping PROPERTIES FOLDER "SPIRV-Tools build")
1267         set_target_properties(extinst_tables PROPERTIES FOLDER "SPIRV-Tools build")
1268         set_target_properties(spirv-tools-pkg-config PROPERTIES FOLDER "SPIRV-Tools build")
1269         set_target_properties(spirv-tools-shared-pkg-config PROPERTIES FOLDER "SPIRV-Tools build")
1270     endif()
1271
1272     # Copy the OpenCLDebugInfo100.h header that's generated by SPIRV-Tools
1273     # out to a separate directory that can be added to the include path.
1274     # Ideally, this header would just be pre-built and part of SPIRV-Headers.
1275     # See: https://github.com/KhronosGroup/SPIRV-Headers/issues/137
1276     set(SPIRV_TOOLS_EXT_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/spirv-tools-ext/include)
1277     add_custom_target(spirv_tools_ext_includes
1278         DEPENDS spirv-tools-header-OpenCLDebugInfo100
1279         COMMAND ${CMAKE_COMMAND} -E copy
1280             ${spirv-tools_BINARY_DIR}/OpenCLDebugInfo100.h
1281             ${SPIRV_TOOLS_EXT_INC_DIR}/spirv-tools/ext/OpenCLDebugInfo100.h
1282     )
1283     set_target_properties(spirv_tools_ext_includes PROPERTIES FOLDER "SPIRV-Tools build")
1284     list(APPEND VULKAN_INCLUDE_DIR "${SPIRV_TOOLS_EXT_INC_DIR}")
1285     add_dependencies(vk_swiftshader spirv_tools_ext_includes)
1286
1287     set_target_properties(vk_swiftshader PROPERTIES
1288         INCLUDE_DIRECTORIES "${VULKAN_INCLUDE_DIR}"
1289         FOLDER "Vulkan"
1290         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1291         COMPILE_DEFINITIONS "VK_EXPORT=;NO_SANITIZE_FUNCTION=;$<$<CONFIG:Debug>:DEBUGGER_WAIT_DIALOG>"
1292         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1293     )
1294
1295     if(WIN32)
1296         set(VULKAN_API_LIBRARY_NAME "vulkan-1.dll")
1297         set_property(TARGET vk_swiftshader APPEND
1298                      PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_WIN32_KHR")
1299     elseif(LINUX)
1300         set(VULKAN_API_LIBRARY_NAME "libvulkan.so.1")
1301         if(X11)
1302             set_property(TARGET vk_swiftshader APPEND
1303                         PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_XLIB_KHR")
1304         endif()
1305         if(XCB)
1306             set_property(TARGET vk_swiftshader APPEND
1307                         PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_XCB_KHR")
1308         endif()
1309     elseif(APPLE)
1310         set(VULKAN_API_LIBRARY_NAME "libvulkan.dylib")
1311         set_property(TARGET vk_swiftshader APPEND
1312                      PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_MACOS_MVK")
1313     else()
1314         message(FATAL_ERROR "Platform does not support Vulkan yet")
1315     endif()
1316
1317     set_shared_library_export_map(vk_swiftshader ${SOURCE_DIR}/Vulkan)
1318
1319     set(VK_SWIFTSHADER_LIBS ${Reactor} marl ${OS_LIBS} SPIRV-Tools SPIRV-Tools-opt ${SWIFTSHADER_LIBS})
1320     if(SWIFTSHADER_ENABLE_VULKAN_DEBUGGER)
1321         list(APPEND VK_SWIFTSHADER_LIBS cppdap)
1322     endif()
1323     target_link_libraries(vk_swiftshader ${VK_SWIFTSHADER_LIBS})
1324
1325     add_custom_command(
1326         TARGET vk_swiftshader
1327         POST_BUILD
1328         COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
1329         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
1330         COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/${VULKAN_API_LIBRARY_NAME}
1331     )
1332
1333     # The vk_swiftshader_icd.json manifest file will point to ICD_LIBRARY_PATH.
1334     # Set ICD_LIBRARY_PATH to be a relative path similar to "./libvk_swiftshader.so", so both files can be moved.
1335     # A relative path is relative to the manifest file.
1336     set(ICD_LIBRARY_PATH "${CMAKE_SHARED_LIBRARY_PREFIX}vk_swiftshader${CMAKE_SHARED_LIBRARY_SUFFIX}")
1337     if(WIN32)
1338         # The path is output to a JSON file, which requires backslashes to be escaped.
1339         set(ICD_LIBRARY_PATH ".\\\\${ICD_LIBRARY_PATH}")
1340     else()
1341         set(ICD_LIBRARY_PATH "./${ICD_LIBRARY_PATH}")
1342     endif()
1343     configure_file(
1344         "${VULKAN_DIR}/vk_swiftshader_icd.json.tmpl"
1345         "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/vk_swiftshader_icd.json"
1346     )
1347
1348     if(SWIFTSHADER_EMIT_COVERAGE)
1349         add_executable(turbo-cov ${TESTS_DIR}/regres/cov/turbo-cov/main.cpp)
1350         target_link_libraries(turbo-cov llvm-with-cov)
1351
1352         # Emit a coverage-toolchain.txt file next to the vk_swiftshader_icd.json
1353         # file so that regres can locate the LLVM toolchain used to build the
1354         # .so file. With this, the correct llvm-cov and llvm-profdata tools
1355         # from the same toolchain can be located.
1356         get_filename_component(COMPILER_TOOLCHAIN_DIR ${CMAKE_CXX_COMPILER} DIRECTORY)
1357         file(GENERATE
1358             OUTPUT "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/coverage-toolchain.txt"
1359             CONTENT "{\"llvm\": \"${COMPILER_TOOLCHAIN_DIR}\", \"turbo-cov\": \"$<TARGET_FILE:turbo-cov>\"}"
1360         )
1361     endif()
1362
1363 endif()
1364
1365 ###########################################################
1366 # Sample programs and tests
1367 ###########################################################
1368
1369 if(SWIFTSHADER_BUILD_TESTS)
1370     set(REACTOR_UNIT_TESTS_LIST
1371         ${SOURCE_DIR}/Reactor/ReactorUnitTests.cpp
1372         ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
1373     )
1374
1375     set(REACTOR_UNIT_TESTS_INCLUDE_DIR
1376         ${THIRD_PARTY_DIR}/googletest/googletest/include
1377         ${THIRD_PARTY_DIR}/googletest/googletest/
1378     )
1379
1380     add_executable(ReactorUnitTests ${REACTOR_UNIT_TESTS_LIST})
1381     set_target_properties(ReactorUnitTests PROPERTIES
1382         INCLUDE_DIRECTORIES "${REACTOR_UNIT_TESTS_INCLUDE_DIR}"
1383         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1384         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1385         FOLDER "Tests"
1386     )
1387
1388     if(NOT WIN32 AND ${REACTOR_BACKEND} STREQUAL "Subzero")
1389         target_link_libraries(ReactorUnitTests ${Reactor} pthread dl)
1390     else()
1391         target_link_libraries(ReactorUnitTests ${Reactor})
1392     endif()
1393
1394     set(GLES_UNITTESTS_LIST
1395         ${TESTS_DIR}/GLESUnitTests/main.cpp
1396         ${TESTS_DIR}/GLESUnitTests/unittests.cpp
1397         ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
1398     )
1399
1400     set(GLES_UNITTESTS_INCLUDE_DIR
1401         ${THIRD_PARTY_DIR}/googletest/googletest/include/
1402         ${THIRD_PARTY_DIR}/googletest/googlemock/include/
1403         ${THIRD_PARTY_DIR}/googletest/googletest/
1404         ${CMAKE_CURRENT_SOURCE_DIR}/include/
1405     )
1406
1407     add_executable(gles-unittests ${GLES_UNITTESTS_LIST})
1408     set_target_properties(gles-unittests PROPERTIES
1409         INCLUDE_DIRECTORIES "${GLES_UNITTESTS_INCLUDE_DIR}"
1410         FOLDER "Tests"
1411         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1412         COMPILE_DEFINITIONS "STANDALONE"
1413         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1414     )
1415
1416     target_link_libraries(gles-unittests libEGL libGLESv2 ${OS_LIBS} ${SWIFTSHADER_LIBS})
1417     if(ANDROID)
1418         target_link_libraries(gles-unittests -landroid)
1419     endif()
1420
1421     # Math unit tests
1422     set(MATH_UNITTESTS_LIST
1423         ${TESTS_DIR}/MathUnitTests/main.cpp
1424         ${TESTS_DIR}/MathUnitTests/unittests.cpp
1425         ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
1426     )
1427
1428     set(MATH_UNITTESTS_INCLUDE_DIR
1429         ${THIRD_PARTY_DIR}/googletest/googletest/include/
1430         ${THIRD_PARTY_DIR}/googletest/googlemock/include/
1431         ${THIRD_PARTY_DIR}/googletest/googletest/
1432         ${CMAKE_CURRENT_SOURCE_DIR}/src/
1433     )
1434
1435     add_executable(math-unittests ${MATH_UNITTESTS_LIST})
1436     set_target_properties(math-unittests PROPERTIES
1437         INCLUDE_DIRECTORIES "${MATH_UNITTESTS_INCLUDE_DIR}"
1438         FOLDER "Tests"
1439         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1440         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1441     )
1442
1443     if(NOT WIN32)
1444         target_link_libraries(math-unittests pthread ${SWIFTSHADER_LIBS})
1445     endif()
1446 endif(SWIFTSHADER_BUILD_TESTS)
1447
1448 if(SWIFTSHADER_BUILD_BENCHMARKS)
1449     if (NOT TARGET benchmark::benchmark)
1450         set(BENCHMARK_ENABLE_TESTING FALSE CACHE BOOL FALSE FORCE)
1451         add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/benchmark)
1452     endif()
1453
1454     set(REACTOR_BENCHMARK_LIST
1455         ${SOURCE_DIR}/Reactor/ReactorBenchmarks.cpp
1456     )
1457
1458     add_executable(ReactorBenchmarks ${REACTOR_BENCHMARK_LIST})
1459     target_link_libraries(ReactorBenchmarks benchmark::benchmark marl ${Reactor})
1460
1461     set_target_properties(ReactorBenchmarks PROPERTIES
1462         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1463         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1464         FOLDER "Benchmarks"
1465     )
1466 endif(SWIFTSHADER_BUILD_BENCHMARKS)
1467
1468 if(SWIFTSHADER_BUILD_TESTS AND SWIFTSHADER_BUILD_VULKAN)
1469     set(VK_UNITTESTS_LIST
1470         ${TESTS_DIR}/VulkanUnitTests/Device.cpp
1471         ${TESTS_DIR}/VulkanUnitTests/Driver.cpp
1472         ${TESTS_DIR}/VulkanUnitTests/main.cpp
1473         ${TESTS_DIR}/VulkanUnitTests/unittests.cpp
1474         ${THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc
1475     )
1476
1477     set(VK_UNITTESTS_INCLUDE_DIR
1478         ${THIRD_PARTY_DIR}/googletest/googletest/include/
1479         ${THIRD_PARTY_DIR}/googletest/googlemock/include/
1480         ${THIRD_PARTY_DIR}/googletest/googletest/
1481         ${THIRD_PARTY_DIR}/SPIRV-Tools/include
1482         ${CMAKE_CURRENT_SOURCE_DIR}/include/
1483     )
1484
1485     add_executable(vk-unittests ${VK_UNITTESTS_LIST})
1486     add_dependencies(vk-unittests vk_swiftshader)
1487
1488     set_target_properties(vk-unittests PROPERTIES
1489         INCLUDE_DIRECTORIES "${VK_UNITTESTS_INCLUDE_DIR}"
1490         FOLDER "Tests"
1491         COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1492         COMPILE_DEFINITIONS "STANDALONE"
1493         LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1494     )
1495
1496     target_link_libraries(vk-unittests ${OS_LIBS} SPIRV-Tools ${SWIFTSHADER_LIBS})
1497 endif(SWIFTSHADER_BUILD_TESTS AND SWIFTSHADER_BUILD_VULKAN)
1498
1499 if(HAVE_PVR_SUBMODULE AND SWIFTSHADER_BUILD_PVR)
1500     if(UNIX AND NOT APPLE)
1501         set(PVR_WINDOW_SYSTEM XCB)
1502
1503         # Set the RPATH of the next defined build targets to $ORIGIN,
1504         # allowing them to load shared libraries from the execution directory.
1505         set(CMAKE_BUILD_RPATH "$ORIGIN")
1506     endif()
1507
1508     set(PVR_BUILD_EXAMPLES TRUE CACHE BOOL "Build the PowerVR SDK Examples" FORCE)
1509     add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples)
1510
1511     if(NOT APPLE)
1512         # Copy the 'loader' library to the bin/ directory
1513         # where the PowerVR executables are placed.
1514         add_custom_command(
1515             TARGET vk_swiftshader
1516             POST_BUILD
1517             COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/bin/${VULKAN_API_LIBRARY_NAME}
1518         )
1519         add_custom_command(
1520             TARGET libGLESv2
1521             POST_BUILD
1522             COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLESv2> ${CMAKE_BINARY_DIR}/bin/$<TARGET_FILE_NAME:libGLESv2>
1523         )
1524         add_custom_command(
1525             TARGET libEGL
1526             POST_BUILD
1527             COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libEGL> ${CMAKE_BINARY_DIR}/bin/$<TARGET_FILE_NAME:libEGL>
1528         )
1529     endif()
1530
1531     # Samples known to work well
1532     set(PVR_VULKAN_TARGET_GOOD
1533         VulkanBumpmap
1534         VulkanExampleUI
1535         VulkanGaussianBlur
1536         VulkanGlass
1537         VulkanGnomeHorde
1538         VulkanHelloAPI
1539         VulkanImageBasedLighting
1540         VulkanIntroducingPVRUtils
1541         VulkanMultiSampling
1542         VulkanNavigation2D
1543         VulkanParticleSystem
1544         VulkanSkinning
1545     )
1546
1547     set(PVR_GLES_TARGET_GOOD
1548         OpenGLESHelloAPI
1549         OpenGLESIntroducingPVRUtils
1550         OpenGLESNavigation2D
1551     )
1552
1553     set(PVR_VULKAN_TARGET_OTHER
1554         VulkanDeferredShading
1555         VulkanDeferredShadingPFX
1556         VulkanGameOfLife
1557         VulkanIBLMapsGenerator
1558         VulkanIMGTextureFilterCubic
1559         VulkanIntroducingPVRShell
1560         VulkanIntroducingPVRVk
1561         VulkanIntroducingUIRenderer
1562         VulkanMultithreading
1563         VulkanNavigation3D
1564         VulkanPostProcessing
1565         VulkanPVRScopeExample
1566         VulkanPVRScopeRemote
1567     )
1568
1569     set(PVR_GLES_TARGET_OTHER
1570         OpenGLESDeferredShading
1571         OpenGLESGaussianBlur
1572         OpenGLESImageBasedLighting
1573         OpenGLESIMGFramebufferDownsample
1574         OpenGLESIMGTextureFilterCubic
1575         OpenGLESIntroducingPVRCamera
1576         OpenGLESIntroducingPVRShell
1577         OpenGLESIntroducingUIRenderer
1578         OpenGLESMultiviewVR
1579         OpenGLESNavigation3D
1580         OpenGLESOpenCLExample
1581         OpenGLESParticleSystem
1582         OpenGLESPostProcessing
1583         OpenGLESPVRScopeExample
1584         OpenGLESPVRScopeRemote
1585         OpenGLESSkinning
1586     )
1587
1588     set(PVR_TARGET_OTHER
1589         glslang
1590         glslangValidator
1591         glslang-default-resource-limits
1592         OGLCompiler
1593         OSDependent
1594         OpenCLMatrixMultiplication
1595         pugixml
1596         PVRAssets
1597         PVRCamera
1598         PVRCore
1599         PVRPfx
1600         PVRShell
1601         PVRUtilsGles
1602         PVRUtilsVk
1603         PVRVk
1604         SPIRV
1605         spirv-remap
1606         SPVRemapper
1607         uninstall
1608     )
1609
1610     set(PVR_VULKAN_TARGET
1611         ${PVR_VULKAN_TARGET_GOOD}
1612         ${PVR_VULKAN_TARGET_OTHER}
1613     )
1614
1615     set(PVR_GLES_TARGET
1616         ${PVR_GLES_TARGET_GOOD}
1617         ${PVR_GLES_TARGET_OTHER}
1618     )
1619
1620     foreach(pvr_target ${PVR_VULKAN_TARGET})
1621         add_dependencies(${pvr_target} vk_swiftshader)
1622     endforeach()
1623
1624     foreach(pvr_target ${PVR_GLES_TARGET})
1625         add_dependencies(${pvr_target} libGLESv2)
1626         add_dependencies(${pvr_target} libEGL)
1627     endforeach()
1628
1629     foreach(pvr_target ${PVR_VULKAN_TARGET_GOOD} ${PVR_GLES_TARGET_GOOD})
1630         set_target_properties(${pvr_target} PROPERTIES FOLDER Samples)
1631     endforeach()
1632
1633     foreach(pvr_target ${PVR_TARGET_OTHER} ${PVR_VULKAN_TARGET_OTHER} ${PVR_GLES_TARGET_OTHER})
1634         set_target_properties(${pvr_target} PROPERTIES FOLDER Samples/PowerVR-Build)
1635     endforeach()
1636 endif()