1 # Copyright 2020 The SwiftShader Authors. All Rights Reserved.
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
15 cmake_minimum_required(VERSION 3.6.3)
17 set(CMAKE_CXX_STANDARD 14)
19 project(SwiftShader C CXX ASM)
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.
27 # Disable automatically regenerating project files on CMakeLists.txt changes.
28 set(CMAKE_SUPPRESS_REGENERATION true)
31 ###########################################################
33 ###########################################################
35 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
37 elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
39 set(CMAKE_CXX_FLAGS "-DANDROID_NDK_BUILD")
43 message(FATAL_ERROR "Platform is not supported")
46 if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch")
47 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
52 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips*")
53 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
58 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc*")
59 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
62 message(FATAL_ERROR "Architecture is not supported")
65 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
72 set(CMAKE_MACOSX_RPATH TRUE)
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.")
81 # Use CCache if available
82 find_program(CCACHE_FOUND ccache)
84 message(STATUS "Using ccache")
85 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
86 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
89 ###########################################################
91 ###########################################################
96 ###########################################################
98 ###########################################################
100 if(NOT CMAKE_BUILD_TYPE)
101 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release MinSizeRel RelWithDebInfo." FORCE)
103 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo)
105 function (option_if_not_defined name description default)
106 if(NOT DEFINED ${name})
107 option(${name} ${description} ${default})
111 function (set_if_not_defined name value)
112 if(NOT DEFINED ${name})
113 set(${name} ${value} PARENT_SCOPE)
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)
124 option_if_not_defined(SWIFTSHADER_USE_GROUP_SOURCES "Group the source files in a folder tree for Visual Studio" TRUE)
126 option_if_not_defined(SWIFTSHADER_BUILD_TESTS "Build unit tests" TRUE)
127 option_if_not_defined(SWIFTSHADER_BUILD_BENCHMARKS "Build benchmarks" FALSE)
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)
144 set(BUILD_MARL ${SWIFTSHADER_BUILD_VULKAN})
146 if(${SWIFTSHADER_BUILD_VULKAN} AND ${SWIFTSHADER_ENABLE_VULKAN_DEBUGGER})
147 set_if_not_defined(SWIFTSHADER_BUILD_CPPDAP TRUE)
149 set_if_not_defined(SWIFTSHADER_BUILD_CPPDAP FALSE)
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)
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")
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")
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.")
178 set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)
180 ###########################################################
181 # Initialize submodules
182 ###########################################################
184 if (SWIFTSHADER_BUILD_TESTS)
185 if (NOT TARGET gtest)
186 if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/.git)
188 third_party/googletest submodule missing.
189 Running 'git submodule update --init' to download it:
192 execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest)
197 if(SWIFTSHADER_BUILD_BENCHMARKS)
198 if (NOT TARGET benchmark::benchmark)
199 if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/benchmark/.git)
201 third_party/benchmark submodule missing.
202 Running 'git submodule update --init' to download it:
205 execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/benchmark)
208 endif(SWIFTSHADER_BUILD_BENCHMARKS)
210 if (NOT TARGET libbacktrace)
211 if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace/src/.git)
213 third_party/libbacktrace/src submodule missing.
214 Running 'git submodule update --init' to download it:
217 execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libbacktrace)
221 # Boost is downloaded if necessary
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")
228 string(REPLACE "." "_" BOOST_VER_FNAME ${BOOST_VER})
229 set(BOOST_THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/boost_${BOOST_VER_FNAME})
231 function(DownloadBoost)
233 set(BOOST_EXT "tar.gz")
234 set(BOOST_HASH ${BOOST_HASH_TARGZ})
237 set(BOOST_HASH ${BOOST_HASH_ZIP})
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})
244 if (NOT TARGET Boost::boost)
245 if(NOT EXISTS ${BOOST_THIRD_PARTY_DIR})
247 third_party/boost is missing.
248 Downloading and extracting boost:
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}...")
256 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/third_party
257 COMMAND cmake -E tar xf ${BOOST_ARCHIVE}
263 if(SWIFTSHADER_GET_PVR)
264 if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples/.git)
266 third_party/PowerVR_Examples submodule missing.
267 Running 'git submodule update --init' to download it:
270 execute_process(COMMAND git submodule update --init ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples)
272 set(SWIFTSHADER_GET_PVR FALSE CACHE BOOL "Check out the PowerVR submodule" FORCE)
274 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/PowerVR_Examples/.git)
275 set(HAVE_PVR_SUBMODULE TRUE)
278 ###########################################################
280 ###########################################################
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})
290 string(REPLACE "/" "\\" groupname ${directory})
291 source_group(${groupname} FILES ${CMAKE_CURRENT_SOURCE_DIR}/${directory}/${file})
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
299 macro(set_shared_library_export_map TARGET DIR)
301 set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " /DEF:\"${DIR}/${TARGET}.def\"")
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")
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;")
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")
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")
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")
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")
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")
343 if(SWIFTSHADER_USE_GROUP_SOURCES)
344 group_all_sources(src)
347 ###########################################################
349 ###########################################################
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)
368 ###########################################################
370 ###########################################################
372 # Flags for project code (non 3rd party)
373 set(SWIFTSHADER_COMPILE_OPTIONS "")
374 set(SWIFTSHADER_LINK_FLAGS "")
375 set(SWIFTSHADER_LIBS "")
377 macro(set_cpp_flag FLAG)
378 if(${ARGC} GREATER 1)
379 set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${FLAG}")
381 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
385 macro(set_linker_flag FLAG)
386 if(${ARGC} GREATER 1)
387 set(CMAKE_EXE_LINKER_FLAGS ${ARGV1} "${CMAKE_EXE_LINKER_FLAGS ${ARGV1}} ${FLAG}")
389 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}")
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
400 set_cpp_flag("/DEBUG:FASTLINK" DEBUG)
401 set_cpp_flag("/DEBUG:FASTLINK" RELWITHDEBINFO)
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'
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'
430 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
434 # Explicitly enable these warnings.
435 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
442 if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
443 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
444 "-Wunused-lambda-capture"
445 "-Wstring-conversion"
447 "-Wignored-qualifiers"
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")
459 message(FATAL_ERROR "Coverage generation not supported for the ${CMAKE_CXX_COMPILER_ID} toolchain")
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
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
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
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"
491 # Remove xor, and, or and friends from the list of keywords, they are used
493 list(APPEND SWIFTSHADER_COMPILE_OPTIONS
494 "-fno-operator-names"
497 # LLVM headers requires these flags to be set
498 set_cpp_flag("-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
500 if(ARCH STREQUAL "x86")
502 set_cpp_flag("-msse2")
503 set_cpp_flag("-mfpmath=sse")
504 set_cpp_flag("-march=pentium4")
505 set_cpp_flag("-mtune=generic")
507 if(ARCH STREQUAL "x86_64")
509 set_cpp_flag("-fPIC")
510 set_cpp_flag("-march=x86-64")
511 set_cpp_flag("-mtune=generic")
513 if(ARCH STREQUAL "mipsel")
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")
521 if(ARCH STREQUAL "mips64el")
523 set_cpp_flag("-march=mips64r2")
524 set_cpp_flag("-mabi=64")
525 set_cpp_flag("-fPIC")
526 set_cpp_flag("-mxgot")
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)
534 # Use -g3 to have even more debug info
535 set_cpp_flag("-g -g3" DEBUG)
536 set_cpp_flag("-g -g3" RELWITHDEBINFO)
539 if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
540 # Treated as an unused argument with clang
541 set_cpp_flag("-s" RELEASE)
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)
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)
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)
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")
574 if(SWIFTSHADER_DCHECK_ALWAYS_ON)
575 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DDCHECK_ALWAYS_ON")
578 if(SWIFTSHADER_WARNINGS_AS_ERRORS)
580 set(WARNINGS_AS_ERRORS "/WX") # Treat all warnings as errors
582 set(WARNINGS_AS_ERRORS "-Werror") # Treat all warnings as errors
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")
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")
598 if(REACTOR_ENABLE_PRINT)
599 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_PRINT")
602 if(REACTOR_VERIFY_LLVM_IR)
603 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_LLVM_IR_VERIFICATION")
606 if(REACTOR_DEFAULT_OPT_LEVEL)
607 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DREACTOR_DEFAULT_OPT_LEVEL=${REACTOR_DEFAULT_OPT_LEVEL}")
611 add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
612 set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
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}")
619 ###########################################################
621 ###########################################################
622 add_subdirectory(third_party/llvm-${SWIFTSHADER_LLVM_VERSION})
625 ###########################################################
627 ###########################################################
629 set(MARL_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
630 add_subdirectory(third_party/marl)
634 ###########################################################
636 ###########################################################
637 if(SWIFTSHADER_BUILD_CPPDAP)
638 set(CPPDAP_THIRD_PARTY_DIR ${THIRD_PARTY_DIR})
639 add_subdirectory(${CPPDAP_DIR})
643 ###########################################################
645 ###########################################################
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
677 # FIXME: Shouldn't depend on external source files directly.
678 list(APPEND SUBZERO_LIST
679 ${SOURCE_DIR}/Common/Memory.cpp
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
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
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
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
709 set(SUBZERO_TARGET MIPS32)
711 message(FATAL_ERROR "Architecture '${ARCH}' not supported by Subzero")
714 file(GLOB_RECURSE SUBZERO_DEPENDENCIES_LIST
715 ${SUBZERO_LLVM_DIR}/*.cpp
716 ${SUBZERO_LLVM_DIR}/*.c
717 ${SUBZERO_LLVM_DIR}/*.h
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
737 set(SUBZERO_INCLUDE_DIR
739 ${SUBZERO_LLVM_DIR}/include/
740 ${SUBZERO_DIR}/pnacl-llvm/include/
744 list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/Windows/include/)
746 list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/Linux/include/)
748 list(APPEND SUBZERO_INCLUDE_DIR ${SUBZERO_LLVM_DIR}/build/MacOS/include/)
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.
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
766 add_library(SubzeroDependencies STATIC EXCLUDE_FROM_ALL
767 ${SUBZERO_DEPENDENCIES_LIST}
769 set_target_properties(SubzeroDependencies PROPERTIES
770 POSITION_INDEPENDENT_CODE 1
771 INCLUDE_DIRECTORIES "${SUBZERO_INCLUDE_DIR}"
772 COMPILE_OPTIONS "${SUBZERO_DEPENDENCIES_COMPILE_OPTIONS}"
776 add_library(ReactorSubzero STATIC EXCLUDE_FROM_ALL
778 ${SUBZERO_REACTOR_LIST}
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;"
787 target_link_libraries(ReactorSubzero SubzeroDependencies marl)
790 target_compile_definitions(ReactorSubzero PRIVATE SUBZERO_USE_MICROSOFT_ABI)
793 ###########################################################
794 # Include Directories
795 ###########################################################
797 set(COMMON_INCLUDE_DIR
799 ${CMAKE_CURRENT_SOURCE_DIR}/include
800 ${LIBBACKTRACE_INCLUDE_DIR}
802 set(OPENGL_INCLUDE_DIR
804 ${COMMON_INCLUDE_DIR}
807 set(VULKAN_INCLUDE_DIR
808 ${COMMON_INCLUDE_DIR}
809 ${CPPDAP_INCLUDE_DIR}
812 ###########################################################
814 ###########################################################
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
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
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
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
863 list(APPEND LIBBACKTRACE_LIST ${LIBBACKTRACE_DIR}/pecoff.c)
865 list(APPEND LIBBACKTRACE_LIST ${LIBBACKTRACE_DIR}/elf.c)
867 message(FATAL_ERROR "libbacktrace does not support mach-o yet")
869 endif(REACTOR_EMIT_DEBUG_INFO)
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
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
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
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
933 file(GLOB_RECURSE OPENGL_COMPILER_LIST
934 ${OPENGL_COMPILER_DIR}/*.cpp
935 ${OPENGL_COMPILER_DIR}/*.h
936 ${OPENGL_COMPILER_DIR}/*.hpp
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
943 list(REMOVE_ITEM OPENGL_COMPILER_LIST ${OPENGL_COMPILER_OS_SPECIFIC_LIST})
945 file(GLOB VULKAN_LIST
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}
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
985 list(APPEND VULKAN_LIST ${VULKAN_DEBUG_LIST})
986 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_VK_DEBUGGER")
989 if(SWIFTSHADER_ENABLE_ASTC)
990 file(GLOB_RECURSE VULKAN_ASTC_LIST
991 ${ASTC_DIR}/Source/*.cpp
992 ${ASTC_DIR}/Source/*.h
994 list(APPEND VULKAN_LIST ${VULKAN_ASTC_LIST})
995 list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DSWIFTSHADER_ENABLE_ASTC")
999 list(APPEND VULKAN_LIST
1000 ${SOURCE_DIR}/System/Linux/MemFd.cpp
1001 ${SOURCE_DIR}/System/Linux/MemFd.hpp)
1004 ###########################################################
1005 # Append OS specific files to lists
1006 ###########################################################
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
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
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
1034 list(APPEND EGL_LIST
1035 ${SOURCE_DIR}/Common/SharedLibrary.hpp
1036 ${SOURCE_DIR}/Main/libX11.cpp
1037 ${SOURCE_DIR}/Main/libX11.hpp
1039 list(APPEND OPENGL_COMPILER_LIST
1040 ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
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
1053 list(APPEND VULKAN_LIST
1054 ${SOURCE_DIR}/WSI/XcbSurfaceKHR.cpp
1055 ${SOURCE_DIR}/WSI/XcbSurfaceKHR.hpp
1060 list(APPEND SWIFTSHADER_LIST
1061 ${SOURCE_DIR}/Main/FrameBufferOSX.mm
1062 ${SOURCE_DIR}/Main/FrameBufferOSX.hpp
1064 list(APPEND EGL_LIST
1065 ${OPENGL_DIR}/libEGL/OSXUtils.mm
1066 ${OPENGL_DIR}/libEGL/OSXUtils.hpp
1068 list(APPEND OPENGL_COMPILER_LIST
1069 ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
1072 list(APPEND VULKAN_LIST
1073 ${SOURCE_DIR}/WSI/MetalSurface.mm
1074 ${SOURCE_DIR}/WSI/MetalSurface.h
1077 list(APPEND SWIFTSHADER_LIST
1078 ${SOURCE_DIR}/Main/FrameBufferAndroid.cpp
1079 ${SOURCE_DIR}/Main/FrameBufferAndroid.hpp
1081 list(APPEND OPENGL_COMPILER_LIST
1082 ${OPENGL_COMPILER_DIR}/ossource_posix.cpp
1087 set(OS_LIBS odbc32 odbccp32 WS2_32 dxguid)
1089 set(OS_LIBS dl pthread)
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}")
1099 ###########################################################
1100 # SwiftShader Targets
1101 ###########################################################
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
1108 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1109 COMPILE_DEFINITIONS "NO_SANITIZE_FUNCTION=;"
1110 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1112 target_link_libraries(SwiftShader ${OS_LIBS} ${SWIFTSHADER_LIBS})
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
1119 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1120 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1122 target_link_libraries(ReactorLLVM llvm ${OS_LIBS})
1124 if(${REACTOR_BACKEND} STREQUAL "LLVM")
1125 set(Reactor ReactorLLVM)
1126 elseif(${REACTOR_BACKEND} STREQUAL "Subzero")
1127 set(Reactor ReactorSubzero)
1129 message(FATAL_ERROR "REACTOR_BACKEND must be 'LLVM' or 'Subzero'")
1132 if(REACTOR_EMIT_DEBUG_INFO)
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)
1138 # Boost stacktrace uses libbacktrace
1139 target_compile_definitions(${Reactor} PRIVATE BOOST_STACKTRACE_USE_BACKTRACE)
1141 # Boost stacktrace uses exceptions, so force enable it
1142 set_cpp_flag("-fexceptions")
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
1150 target_link_libraries(Libbacktrace ${OS_LIBS} ${SWIFTSHADER_LIBS})
1151 target_link_libraries(${Reactor} Libbacktrace)
1154 # Download boost and use it
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)
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
1166 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1167 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1169 target_link_libraries(GLCompiler ${OS_LIBS} ${SWIFTSHADER_LIBS})
1171 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
1172 set(LIB_PREFIX "lib64")
1174 set(LIB_PREFIX "lib")
1177 if(SWIFTSHADER_BUILD_EGL)
1178 add_library(libEGL SHARED ${EGL_LIST})
1179 set_target_properties(libEGL PROPERTIES
1180 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
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}"
1189 set_property(TARGET libEGL APPEND PROPERTY COMPILE_DEFINITIONS "USE_X11=1")
1193 set_target_properties(libEGL PROPERTIES SUFFIX "_swiftshader.so")
1195 set_shared_library_export_map(libEGL ${SOURCE_DIR}/OpenGL/libEGL)
1196 target_link_libraries(libEGL ${OS_LIBS} ${SWIFTSHADER_LIBS})
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}/
1207 if(SWIFTSHADER_BUILD_GLESv2)
1208 add_library(libGLESv2 SHARED ${GLES2_LIST})
1209 set_target_properties(libGLESv2 PROPERTIES
1210 INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
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}"
1218 set_target_properties(libGLESv2 PROPERTIES SUFFIX "_swiftshader.so")
1220 set_shared_library_export_map(libGLESv2 ${SOURCE_DIR}/OpenGL/libGLESv2)
1221 target_link_libraries(libGLESv2 SwiftShader ${Reactor} GLCompiler ${OS_LIBS} ${SWIFTSHADER_LIBS})
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}/
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}"
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}"
1243 set_target_properties(libGLES_CM PROPERTIES SUFFIX "_swiftshader.so")
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})
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}
1253 endif(SWIFTSHADER_BUILD_GLES_CM)
1255 if(SWIFTSHADER_BUILD_VULKAN)
1256 add_library(vk_swiftshader SHARED ${VULKAN_LIST})
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")
1263 add_subdirectory(third_party/SPIRV-Tools)
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")
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
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)
1287 set_target_properties(vk_swiftshader PROPERTIES
1288 INCLUDE_DIRECTORIES "${VULKAN_INCLUDE_DIR}"
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}"
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")
1300 set(VULKAN_API_LIBRARY_NAME "libvulkan.so.1")
1302 set_property(TARGET vk_swiftshader APPEND
1303 PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_XLIB_KHR")
1306 set_property(TARGET vk_swiftshader APPEND
1307 PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_XCB_KHR")
1310 set(VULKAN_API_LIBRARY_NAME "libvulkan.dylib")
1311 set_property(TARGET vk_swiftshader APPEND
1312 PROPERTY COMPILE_DEFINITIONS "VK_USE_PLATFORM_MACOS_MVK")
1314 message(FATAL_ERROR "Platform does not support Vulkan yet")
1317 set_shared_library_export_map(vk_swiftshader ${SOURCE_DIR}/Vulkan)
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)
1323 target_link_libraries(vk_swiftshader ${VK_SWIFTSHADER_LIBS})
1326 TARGET vk_swiftshader
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}
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}")
1338 # The path is output to a JSON file, which requires backslashes to be escaped.
1339 set(ICD_LIBRARY_PATH ".\\\\${ICD_LIBRARY_PATH}")
1341 set(ICD_LIBRARY_PATH "./${ICD_LIBRARY_PATH}")
1344 "${VULKAN_DIR}/vk_swiftshader_icd.json.tmpl"
1345 "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/vk_swiftshader_icd.json"
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)
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)
1358 OUTPUT "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/coverage-toolchain.txt"
1359 CONTENT "{\"llvm\": \"${COMPILER_TOOLCHAIN_DIR}\", \"turbo-cov\": \"$<TARGET_FILE:turbo-cov>\"}"
1365 ###########################################################
1366 # Sample programs and tests
1367 ###########################################################
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
1375 set(REACTOR_UNIT_TESTS_INCLUDE_DIR
1376 ${THIRD_PARTY_DIR}/googletest/googletest/include
1377 ${THIRD_PARTY_DIR}/googletest/googletest/
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}"
1388 if(NOT WIN32 AND ${REACTOR_BACKEND} STREQUAL "Subzero")
1389 target_link_libraries(ReactorUnitTests ${Reactor} pthread dl)
1391 target_link_libraries(ReactorUnitTests ${Reactor})
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
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/
1407 add_executable(gles-unittests ${GLES_UNITTESTS_LIST})
1408 set_target_properties(gles-unittests PROPERTIES
1409 INCLUDE_DIRECTORIES "${GLES_UNITTESTS_INCLUDE_DIR}"
1411 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1412 COMPILE_DEFINITIONS "STANDALONE"
1413 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1416 target_link_libraries(gles-unittests libEGL libGLESv2 ${OS_LIBS} ${SWIFTSHADER_LIBS})
1418 target_link_libraries(gles-unittests -landroid)
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
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/
1435 add_executable(math-unittests ${MATH_UNITTESTS_LIST})
1436 set_target_properties(math-unittests PROPERTIES
1437 INCLUDE_DIRECTORIES "${MATH_UNITTESTS_INCLUDE_DIR}"
1439 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1440 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1444 target_link_libraries(math-unittests pthread ${SWIFTSHADER_LIBS})
1446 endif(SWIFTSHADER_BUILD_TESTS)
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)
1454 set(REACTOR_BENCHMARK_LIST
1455 ${SOURCE_DIR}/Reactor/ReactorBenchmarks.cpp
1458 add_executable(ReactorBenchmarks ${REACTOR_BENCHMARK_LIST})
1459 target_link_libraries(ReactorBenchmarks benchmark::benchmark marl ${Reactor})
1461 set_target_properties(ReactorBenchmarks PROPERTIES
1462 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1463 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1466 endif(SWIFTSHADER_BUILD_BENCHMARKS)
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
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/
1485 add_executable(vk-unittests ${VK_UNITTESTS_LIST})
1486 add_dependencies(vk-unittests vk_swiftshader)
1488 set_target_properties(vk-unittests PROPERTIES
1489 INCLUDE_DIRECTORIES "${VK_UNITTESTS_INCLUDE_DIR}"
1491 COMPILE_OPTIONS "${SWIFTSHADER_COMPILE_OPTIONS};${WARNINGS_AS_ERRORS}"
1492 COMPILE_DEFINITIONS "STANDALONE"
1493 LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS}"
1496 target_link_libraries(vk-unittests ${OS_LIBS} SPIRV-Tools ${SWIFTSHADER_LIBS})
1497 endif(SWIFTSHADER_BUILD_TESTS AND SWIFTSHADER_BUILD_VULKAN)
1499 if(HAVE_PVR_SUBMODULE AND SWIFTSHADER_BUILD_PVR)
1500 if(UNIX AND NOT APPLE)
1501 set(PVR_WINDOW_SYSTEM XCB)
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")
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)
1512 # Copy the 'loader' library to the bin/ directory
1513 # where the PowerVR executables are placed.
1515 TARGET vk_swiftshader
1517 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/bin/${VULKAN_API_LIBRARY_NAME}
1522 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libGLESv2> ${CMAKE_BINARY_DIR}/bin/$<TARGET_FILE_NAME:libGLESv2>
1527 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libEGL> ${CMAKE_BINARY_DIR}/bin/$<TARGET_FILE_NAME:libEGL>
1531 # Samples known to work well
1532 set(PVR_VULKAN_TARGET_GOOD
1539 VulkanImageBasedLighting
1540 VulkanIntroducingPVRUtils
1543 VulkanParticleSystem
1547 set(PVR_GLES_TARGET_GOOD
1549 OpenGLESIntroducingPVRUtils
1550 OpenGLESNavigation2D
1553 set(PVR_VULKAN_TARGET_OTHER
1554 VulkanDeferredShading
1555 VulkanDeferredShadingPFX
1557 VulkanIBLMapsGenerator
1558 VulkanIMGTextureFilterCubic
1559 VulkanIntroducingPVRShell
1560 VulkanIntroducingPVRVk
1561 VulkanIntroducingUIRenderer
1562 VulkanMultithreading
1564 VulkanPostProcessing
1565 VulkanPVRScopeExample
1566 VulkanPVRScopeRemote
1569 set(PVR_GLES_TARGET_OTHER
1570 OpenGLESDeferredShading
1571 OpenGLESGaussianBlur
1572 OpenGLESImageBasedLighting
1573 OpenGLESIMGFramebufferDownsample
1574 OpenGLESIMGTextureFilterCubic
1575 OpenGLESIntroducingPVRCamera
1576 OpenGLESIntroducingPVRShell
1577 OpenGLESIntroducingUIRenderer
1579 OpenGLESNavigation3D
1580 OpenGLESOpenCLExample
1581 OpenGLESParticleSystem
1582 OpenGLESPostProcessing
1583 OpenGLESPVRScopeExample
1584 OpenGLESPVRScopeRemote
1588 set(PVR_TARGET_OTHER
1591 glslang-default-resource-limits
1594 OpenCLMatrixMultiplication
1610 set(PVR_VULKAN_TARGET
1611 ${PVR_VULKAN_TARGET_GOOD}
1612 ${PVR_VULKAN_TARGET_OTHER}
1616 ${PVR_GLES_TARGET_GOOD}
1617 ${PVR_GLES_TARGET_OTHER}
1620 foreach(pvr_target ${PVR_VULKAN_TARGET})
1621 add_dependencies(${pvr_target} vk_swiftshader)
1624 foreach(pvr_target ${PVR_GLES_TARGET})
1625 add_dependencies(${pvr_target} libGLESv2)
1626 add_dependencies(${pvr_target} libEGL)
1629 foreach(pvr_target ${PVR_VULKAN_TARGET_GOOD} ${PVR_GLES_TARGET_GOOD})
1630 set_target_properties(${pvr_target} PROPERTIES FOLDER Samples)
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)