|
@@ -2,6 +2,15 @@ cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
|
|
|
|
|
|
project(JoltPhysics CXX)
|
|
|
|
|
|
+# Select X86 processor features to use (if everything is off it will be SSE4.1 compatible)
|
|
|
+option(USE_SSE4_2 "Enable SSE4.2" ON)
|
|
|
+option(USE_AVX "Enable AVX" ON)
|
|
|
+option(USE_AVX2 "Enable AVX2" ON)
|
|
|
+option(USE_LZCNT "Enable LZCNT" ON)
|
|
|
+option(USE_TZCNT "Enable TZCNT" ON)
|
|
|
+option(USE_F16C "Enable F16C" ON)
|
|
|
+option(USE_FMADD "Enable FMADD" ON)
|
|
|
+
|
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Distribution")
|
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
@@ -19,7 +28,7 @@ if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
|
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
|
|
|
|
# Set general compiler flags
|
|
|
- set(CMAKE_CXX_FLAGS "/std:c++17 /Zc:__cplusplus /GR- /Gm- /Wall /WX /EHsc /nologo /diagnostics:classic /FC /arch:AVX2 /fp:except- /Zc:inline /Zi /DWIN32 /D_WINDOWS /DUNICODE /D_UNICODE")
|
|
|
+ set(CMAKE_CXX_FLAGS "/std:c++17 /Zc:__cplusplus /GR- /Gm- /Wall /WX /EHsc /nologo /diagnostics:classic /FC /fp:except- /Zc:inline /Zi /DWIN32 /D_WINDOWS /DUNICODE /D_UNICODE")
|
|
|
|
|
|
# Set compiler flags for various configurations
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /GS /Od /Ob0 /RTC1 /DJPH_PROFILE_ENABLED /DJPH_DEBUG_RENDERER")
|
|
@@ -33,12 +42,53 @@ if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "/machine:x64 /SUBSYSTEM:WINDOWS /ignore:4221 /DEBUG:FASTLINK")
|
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /fp:fast") # Clang doesn't use fast math because it cannot be turned off inside a single compilation unit
|
|
|
+ if (USE_AVX2)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
|
|
|
+ elseif (USE_AVX)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
|
|
|
+ endif()
|
|
|
+ if (USE_SSE4_2)
|
|
|
+ add_compile_definitions(JPH_USE_SSE4_2)
|
|
|
+ endif()
|
|
|
+ if (USE_LZCNT)
|
|
|
+ add_compile_definitions(JPH_USE_LZCNT)
|
|
|
+ endif()
|
|
|
+ if (USE_TZCNT)
|
|
|
+ add_compile_definitions(JPH_USE_TZCNT)
|
|
|
+ endif()
|
|
|
+ if (USE_F16C)
|
|
|
+ add_compile_definitions(JPH_USE_F16C)
|
|
|
+ endif()
|
|
|
+ if (USE_FMADD)
|
|
|
+ add_compile_definitions(JPH_USE_FMADD)
|
|
|
+ endif()
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DJPH_FLOATING_POINT_EXCEPTIONS_ENABLED") # Clang turns Float2 into a vector sometimes causing floating point exceptions
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /DJPH_FLOATING_POINT_EXCEPTIONS_ENABLED")
|
|
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG:incremental /OPT:ICF /OPT:REF")
|
|
|
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG")
|
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
|
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /showFilenames -mavx2 -mfma -mf16c -mlzcnt -mpopcnt")
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /showFilenames")
|
|
|
+ if (USE_AVX2)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mpopcnt -mlzcnt -mf16c -mfma")
|
|
|
+ elseif (USE_AVX)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx -mpopcnt")
|
|
|
+ elseif (USE_SSE4_2)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpopcnt")
|
|
|
+ else()
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
|
|
|
+ endif()
|
|
|
+ if (USE_LZCNT)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlzcnt")
|
|
|
+ endif()
|
|
|
+ if (USE_TZCNT)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi")
|
|
|
+ endif()
|
|
|
+ if (USE_F16C)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mf16c")
|
|
|
+ endif()
|
|
|
+ if (USE_FMADD)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfma")
|
|
|
+ endif()
|
|
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASEASAN "/SUBSYSTEM:CONSOLE /LIBPATH:${CLANG_LIB_PATH} clang_rt.asan-x86_64.lib -wholearchive:clang_rt.asan-x86_64.lib clang_rt.asan_cxx-x86_64.lib -wholearchive:clang_rt.asan_cxx-x86_64.lib")
|
|
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASEUBSAN "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LIBPATH:${CLANG_LIB_PATH}")
|
|
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASECOVERAGE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LIBPATH:${CLANG_LIB_PATH}")
|
|
@@ -56,7 +106,27 @@ elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
|
|
# Platform specific compiler flags
|
|
|
if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64")
|
|
|
# X64
|
|
|
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mfma -mf16c -mlzcnt -mbmi -mpopcnt")
|
|
|
+ if (USE_AVX2)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mpopcnt -mlzcnt -mf16c -mfma")
|
|
|
+ elseif (USE_AVX)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx -mpopcnt")
|
|
|
+ elseif (USE_SSE4_2)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpopcnt")
|
|
|
+ else()
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
|
|
|
+ endif()
|
|
|
+ if (USE_LZCNT)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlzcnt")
|
|
|
+ endif()
|
|
|
+ if (USE_TZCNT)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi")
|
|
|
+ endif()
|
|
|
+ if (USE_F16C)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mf16c")
|
|
|
+ endif()
|
|
|
+ if (USE_FMADD)
|
|
|
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfma")
|
|
|
+ endif()
|
|
|
elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
|
|
|
# ARM64
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|