1 # Standalone or with Blender
2 if(NOT WITH_BLENDER AND WITH_CYCLES_STANDALONE)
3 set(CYCLES_INSTALL_PATH "")
5 set(WITH_CYCLES_BLENDER ON)
6 # WINDOWS_PYTHON_DEBUG needs to write into the user addons folder since it will
7 # be started with --env-system-scripts pointing to the release folder, which will
8 # lack the cycles addon, and we don't want to write into it.
9 if(NOT WINDOWS_PYTHON_DEBUG)
10 set(CYCLES_INSTALL_PATH "scripts/addons/cycles")
12 set(CYCLES_INSTALL_PATH "$ENV{appdata}/blender foundation/blender/${BLENDER_VERSION}/scripts/addons/cycles")
18 include(cmake/external_libs.cmake)
19 include(cmake/macros.cmake)
22 # todo: this code could be refactored a bit to avoid duplication
23 # note: CXX_HAS_SSE is needed in case passing SSE flags fails altogether (gcc-arm)
25 if(WITH_CYCLES_NATIVE_ONLY)
26 set(CXX_HAS_SSE FALSE)
27 set(CXX_HAS_AVX FALSE)
28 set(CXX_HAS_AVX2 FALSE)
34 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
35 set(CYCLES_KERNEL_FLAGS "-march=native")
37 elseif(NOT WITH_CPU_SSE)
38 set(CXX_HAS_SSE FALSE)
39 set(CXX_HAS_AVX FALSE)
40 set(CXX_HAS_AVX2 FALSE)
41 elseif(WIN32 AND MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
44 set(CXX_HAS_AVX2 TRUE)
46 # /arch:AVX for VC2012 and above
47 if(NOT MSVC_VERSION LESS 1700)
48 set(CYCLES_AVX_ARCH_FLAGS "/arch:AVX")
49 set(CYCLES_AVX2_ARCH_FLAGS "/arch:AVX /arch:AVX2")
50 elseif(NOT CMAKE_CL_64)
51 set(CYCLES_AVX_ARCH_FLAGS "/arch:SSE2")
52 set(CYCLES_AVX2_ARCH_FLAGS "/arch:SSE2")
55 # Unlike GCC/clang we still use fast math, because there is no fine
56 # grained control and the speedup we get here is too big to ignore.
57 set(CYCLES_KERNEL_FLAGS "/fp:fast -D_CRT_SECURE_NO_WARNINGS /GS-")
59 # there is no /arch:SSE3, but intrinsics are available anyway
61 set(CYCLES_SSE2_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS}")
62 set(CYCLES_SSE3_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS}")
63 set(CYCLES_SSE41_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS}")
64 set(CYCLES_AVX_KERNEL_FLAGS "${CYCLES_AVX_ARCH_FLAGS} ${CYCLES_KERNEL_FLAGS}")
65 set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_AVX2_ARCH_FLAGS} ${CYCLES_KERNEL_FLAGS}")
67 set(CYCLES_SSE2_KERNEL_FLAGS "/arch:SSE2 ${CYCLES_KERNEL_FLAGS}")
68 set(CYCLES_SSE3_KERNEL_FLAGS "/arch:SSE2 ${CYCLES_KERNEL_FLAGS}")
69 set(CYCLES_SSE41_KERNEL_FLAGS "/arch:SSE2 ${CYCLES_KERNEL_FLAGS}")
70 set(CYCLES_AVX_KERNEL_FLAGS "${CYCLES_AVX_ARCH_FLAGS} ${CYCLES_KERNEL_FLAGS}")
71 set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_AVX2_ARCH_FLAGS} ${CYCLES_KERNEL_FLAGS}")
74 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CYCLES_KERNEL_FLAGS}")
75 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ox")
76 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Ox")
77 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Ox")
78 elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
79 check_cxx_compiler_flag(-msse CXX_HAS_SSE)
80 check_cxx_compiler_flag(-mavx CXX_HAS_AVX)
81 check_cxx_compiler_flag(-mavx2 CXX_HAS_AVX2)
83 # Assume no signal trapping for better code generation.
84 set(CYCLES_KERNEL_FLAGS "-fno-trapping-math")
85 # Avoid overhead of setting errno for NaNs.
86 set(CYCLES_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -fno-math-errno")
87 # Let compiler optimize 0.0 - x without worrying about signed zeros.
88 set(CYCLES_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -fno-signed-zeros")
90 if(CMAKE_COMPILER_IS_GNUCC)
91 # Assume no signal trapping for better code generation.
92 set(CYCLES_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -fno-signaling-nans")
93 # Assume a fixed rounding mode for better constant folding.
94 set(CYCLES_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -fno-rounding-math")
98 if(CMAKE_COMPILER_IS_GNUCC)
99 set(CYCLES_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -mfpmath=sse")
102 set(CYCLES_SSE2_KERNEL_FLAGS "${CYCLES_KERNEL_FLAGS} -msse -msse2")
103 set(CYCLES_SSE3_KERNEL_FLAGS "${CYCLES_SSE2_KERNEL_FLAGS} -msse3 -mssse3")
104 set(CYCLES_SSE41_KERNEL_FLAGS "${CYCLES_SSE3_KERNEL_FLAGS} -msse4.1")
106 set(CYCLES_AVX_KERNEL_FLAGS "${CYCLES_SSE41_KERNEL_FLAGS} -mavx")
109 set(CYCLES_AVX2_KERNEL_FLAGS "${CYCLES_SSE41_KERNEL_FLAGS} -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c")
113 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CYCLES_KERNEL_FLAGS}")
114 elseif(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Intel")
115 check_cxx_compiler_flag(/QxSSE2 CXX_HAS_SSE)
116 check_cxx_compiler_flag(/arch:AVX CXX_HAS_AVX)
117 check_cxx_compiler_flag(/QxCORE-AVX2 CXX_HAS_AVX2)
120 set(CYCLES_SSE2_KERNEL_FLAGS "/QxSSE2")
121 set(CYCLES_SSE3_KERNEL_FLAGS "/QxSSSE3")
122 set(CYCLES_SSE41_KERNEL_FLAGS "/QxSSE4.1")
125 set(CYCLES_AVX_KERNEL_FLAGS "/arch:AVX")
129 set(CYCLES_AVX2_KERNEL_FLAGS "/QxCORE-AVX2")
132 elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
134 # ICC does not support SSE2 flag on MacOSX
135 check_cxx_compiler_flag(-xssse3 CXX_HAS_SSE)
137 check_cxx_compiler_flag(-xsse2 CXX_HAS_SSE)
140 check_cxx_compiler_flag(-xavx CXX_HAS_AVX)
141 check_cxx_compiler_flag(-xcore-avx2 CXX_HAS_AVX2)
145 # ICC does not support SSE2 flag on MacOSX
146 set(CYCLES_SSE2_KERNEL_FLAGS "-xssse3")
148 set(CYCLES_SSE2_KERNEL_FLAGS "-xsse2")
151 set(CYCLES_SSE3_KERNEL_FLAGS "-xssse3")
152 set(CYCLES_SSE41_KERNEL_FLAGS "-xsse4.1")
155 set(CYCLES_AVX_KERNEL_FLAGS "-xavx")
159 set(CYCLES_AVX2_KERNEL_FLAGS "-xcore-avx2")
173 add_definitions(-DWITH_KERNEL_AVX)
177 add_definitions(-DWITH_KERNEL_AVX2)
182 set(RTTI_DISABLE_FLAGS "/GR- -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
183 elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
184 set(RTTI_DISABLE_FLAGS "-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
188 # Definitions and Includes
192 ${OPENIMAGEIO_DEFINITIONS}
196 -DCCL_NAMESPACE_BEGIN=namespace\ ccl\ {
197 -DCCL_NAMESPACE_END=}
200 if(WITH_CYCLES_STANDALONE_GUI)
201 add_definitions(-DWITH_CYCLES_STANDALONE_GUI)
205 add_definitions(-DWITH_PTEX)
209 add_definitions(-DWITH_OSL)
211 add_definitions(-DOSL_STATIC_BUILD)
213 add_definitions(-DOSL_STATIC_LIBRARY)
220 if(WITH_CYCLES_EMBREE)
221 add_definitions(-DWITH_EMBREE)
222 add_definitions(-DEMBREE_STATIC_LIB)
225 ${EMBREE_INCLUDE_DIRS}
230 add_definitions(-DWITH_OPENSUBDIV)
233 ${OPENSUBDIV_INCLUDE_DIR}
237 if(WITH_CYCLES_STANDALONE)
238 set(WITH_CYCLES_DEVICE_OPENCL TRUE)
239 set(WITH_CYCLES_DEVICE_CUDA TRUE)
240 # Experimental and unfinished.
241 set(WITH_CYCLES_NETWORK FALSE)
243 # TODO(sergey): Consider removing it, only causes confusion in interface.
244 set(WITH_CYCLES_DEVICE_MULTI TRUE)
246 # Logging capabilities using GLog library.
247 if(WITH_CYCLES_LOGGING)
248 add_definitions(-DWITH_CYCLES_LOGGING)
249 add_definitions(${GLOG_DEFINES})
250 add_definitions(-DCYCLES_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE})
254 ${GFLAGS_INCLUDE_DIRS}
258 # Debugging capabilities (debug passes etc).
259 if(WITH_CYCLES_DEBUG)
260 add_definitions(-DWITH_CYCLES_DEBUG)
263 if(NOT OPENIMAGEIO_PUGIXML_FOUND)
264 add_definitions(-DWITH_SYSTEM_PUGIXML)
270 ${OPENIMAGEIO_INCLUDE_DIRS}
271 ${OPENIMAGEIO_INCLUDE_DIRS}/OpenImageIO
272 ${OPENEXR_INCLUDE_DIR}
273 ${OPENEXR_INCLUDE_DIRS}
274 ${PUGIXML_INCLUDE_DIR}
277 if(CYCLES_STANDALONE_REPOSITORY)
278 include_directories(../third_party/atomic)
280 include_directories(../atomic)
284 if(CMAKE_COMPILER_IS_GNUCXX)
285 ADD_CHECK_CXX_COMPILER_FLAG(CMAKE_CXX_FLAGS _has_cxxflag_float_conversion "-Werror=float-conversion")
286 ADD_CHECK_CXX_COMPILER_FLAG(CMAKE_CXX_FLAGS _has_cxxflag_double_promotion "-Werror=double-promotion")
287 ADD_CHECK_CXX_COMPILER_FLAG(CMAKE_CXX_FLAGS _has_no_error_unused_macros "-Wno-error=unused-macros")
288 unset(_has_cxxflag_float_conversion)
289 unset(_has_cxxflag_double_promotion)
290 unset(_has_no_error_unused_macros)
293 if(WITH_CYCLES_CUDA_BINARIES AND (NOT WITH_CYCLES_CUBIN_COMPILER))
296 if(${CUDA_VERSION} EQUAL "8.0")
298 elseif(${CUDA_VERSION} EQUAL "9.0")
300 elseif(${CUDA_VERSION} EQUAL "9.1")
302 elseif(${CUDA_VERSION} EQUAL "10.0")
305 if(NOT MSVC_VERSION LESS ${MAX_MSVC} OR CMAKE_C_COMPILER_ID MATCHES "Clang")
306 message(STATUS "nvcc not supported for this compiler version, using cycles_cubin_cc instead.")
307 set(WITH_CYCLES_CUBIN_COMPILER ON)
311 if(NOT (${XCODE_VERSION} VERSION_LESS 10.0))
312 message(STATUS "nvcc not supported for this compiler version, using cycles_cubin_cc instead.")
313 set(WITH_CYCLES_CUBIN_COMPILER ON)
318 # NVRTC gives wrong rendering result in CUDA 10.0, so we must use NVCC.
319 if(WITH_CYCLES_CUDA_BINARIES AND WITH_CYCLES_CUBIN_COMPILER)
320 if(NOT (${CUDA_VERSION} VERSION_LESS 10.0))
321 message(STATUS "cycles_cubin_cc not supported for CUDA 10.0+, using nvcc instead.")
322 set(WITH_CYCLES_CUBIN_COMPILER OFF)
328 if(WITH_CYCLES_BLENDER)
329 add_definitions(-DWITH_BLENDER_GUARDEDALLOC)
330 add_subdirectory(blender)
333 if(WITH_CYCLES_NETWORK)
334 add_definitions(-DWITH_NETWORK)
338 add_definitions(-DWITH_OCIO)
341 ${OPENCOLORIO_INCLUDE_DIRS}
345 if(WITH_CYCLES_STANDALONE OR WITH_CYCLES_NETWORK OR WITH_CYCLES_CUBIN_COMPILER)
346 add_subdirectory(app)
349 add_subdirectory(bvh)
350 add_subdirectory(device)
351 add_subdirectory(doc)
352 add_subdirectory(graph)
353 add_subdirectory(kernel)
354 add_subdirectory(render)
355 add_subdirectory(subd)
356 add_subdirectory(util)
358 # TODO(sergey): Make this to work with standalone repository.
360 add_subdirectory(test)
363 if(NOT WITH_BLENDER AND WITH_CYCLES_STANDALONE)
364 delayed_do_install(${CMAKE_BINARY_DIR}/bin)