From 66b4e426cc3d8a12adca585bea217f2013568393 Mon Sep 17 00:00:00 2001 From: Xavier Hallade Date: Wed, 29 Mar 2023 13:10:23 +0200 Subject: [PATCH] Cycles: build Embree 4 with GPU support --- build_files/build_environment/CMakeLists.txt | 22 ++++--- .../build_environment/cmake/dpcpp.cmake | 8 ++- .../build_environment/cmake/embree.cmake | 59 +++++++++++++++++-- .../build_environment/cmake/options.cmake | 21 +++++++ .../build_environment/patches/embree.diff | 16 +++++ 5 files changed, 106 insertions(+), 20 deletions(-) diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index b77c64054ed..aaa4a74082a 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -90,28 +90,26 @@ include(cmake/haru.cmake) # Boost needs to be included after `python.cmake` due to the PYTHON_BINARY variable being needed. include(cmake/boost.cmake) include(cmake/pugixml.cmake) -include(cmake/ispc.cmake) -include(cmake/openimagedenoise.cmake) -include(cmake/embree.cmake) -include(cmake/openpgl.cmake) -include(cmake/fmt.cmake) -include(cmake/robinmap.cmake) -include(cmake/xml2.cmake) - include(cmake/fribidi.cmake) include(cmake/harfbuzz.cmake) if(NOT APPLE) include(cmake/xr_openxr.cmake) - if(NOT WIN32 OR BUILD_MODE STREQUAL Release) - include(cmake/dpcpp.cmake) - include(cmake/dpcpp_deps.cmake) - endif() + include(cmake/dpcpp.cmake) + include(cmake/dpcpp_deps.cmake) if(NOT WIN32) include(cmake/igc.cmake) include(cmake/gmmlib.cmake) include(cmake/ocloc.cmake) endif() endif() +include(cmake/ispc.cmake) +include(cmake/openimagedenoise.cmake) +# Embree needs to be included after dpcpp as it uses it for compiling with GPU support +include(cmake/embree.cmake) +include(cmake/openpgl.cmake) +include(cmake/fmt.cmake) +include(cmake/robinmap.cmake) +include(cmake/xml2.cmake) # OpenColorIO and dependencies. include(cmake/expat.cmake) diff --git a/build_files/build_environment/cmake/dpcpp.cmake b/build_files/build_environment/cmake/dpcpp.cmake index ae30d842af4..36fc4d78616 100644 --- a/build_files/build_environment/cmake/dpcpp.cmake +++ b/build_files/build_environment/cmake/dpcpp.cmake @@ -5,6 +5,9 @@ # for now. string(REPLACE "-DCMAKE_CXX_STANDARD=17" " " DPCPP_CMAKE_FLAGS "${DEFAULT_CMAKE_FLAGS}") +# DPCPP already generates debug libs, there isn't much point in compiling it in debug mode itself. +string(REPLACE "-DCMAKE_BUILD_TYPE=Debug" "-DCMAKE_BUILD_TYPE=Release" DPCPP_CMAKE_FLAGS "${DPCPP_CMAKE_FLAGS}") + if(WIN32) set(LLVM_GENERATOR "Ninja") else() @@ -41,14 +44,14 @@ set(DPCPP_EXTRA_ARGS # Below here is copied from an invocation of buildbot/config.py -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_TARGETS_TO_BUILD=X86 - -DLLVM_EXTERNAL_PROJECTS=sycl^^llvm-spirv^^opencl^^libdevice^^xpti^^xptifw + -DLLVM_EXTERNAL_PROJECTS=sycl^^llvm-spirv^^opencl^^libdevice^^xpti^^xptifw^^lld -DLLVM_EXTERNAL_SYCL_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/sycl -DLLVM_EXTERNAL_LLVM_SPIRV_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/llvm-spirv -DLLVM_EXTERNAL_XPTI_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/xpti -DXPTI_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/xpti -DLLVM_EXTERNAL_XPTIFW_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/xptifw -DLLVM_EXTERNAL_LIBDEVICE_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/libdevice - -DLLVM_ENABLE_PROJECTS=clang^^sycl^^llvm-spirv^^opencl^^libdevice^^xpti^^xptifw + -DLLVM_ENABLE_PROJECTS=clang^^sycl^^llvm-spirv^^opencl^^libdevice^^xpti^^xptifw^^lld -DLIBCLC_TARGETS_TO_BUILD= -DLIBCLC_GENERATE_REMANGLED_VARIANTS=OFF -DSYCL_BUILD_PI_HIP_PLATFORM=AMD @@ -110,7 +113,6 @@ if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_dpcpp after_install COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/dpcpp/bin/clang-cl.exe COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/dpcpp/bin/clang-cpp.exe - COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/dpcpp/bin/clang.exe COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/dpcpp ${HARVEST_TARGET}/dpcpp ) endif() diff --git a/build_files/build_environment/cmake/embree.cmake b/build_files/build_environment/cmake/embree.cmake index 75f4120f8af..eaa78ed146f 100644 --- a/build_files/build_environment/cmake/embree.cmake +++ b/build_files/build_environment/cmake/embree.cmake @@ -3,6 +3,8 @@ # Note the utility apps may use png/tiff/gif system libraries, but the # library itself does not depend on them, so should give no problems. +set(EMBREE_CMAKE_FLAGS ${DEFAULT_CMAKE_FLAGS}) + set(EMBREE_EXTRA_ARGS -DEMBREE_ISPC_SUPPORT=OFF -DEMBREE_TUTORIALS=OFF @@ -31,6 +33,43 @@ if(NOT BLENDER_PLATFORM_ARM) ) endif() +if(NOT APPLE) + if(WIN32) + # Levels below -O2 don't work well for Embree+SYCL. + string(REGEX REPLACE "-O[A-Za-z0-9]" "" EMBREE_CLANG_CMAKE_CXX_FLAGS_DEBUG ${BLENDER_CLANG_CMAKE_C_FLAGS_DEBUG}) + string(APPEND EMBREE_CLANG_CMAKE_CXX_FLAGS_DEBUG " -O2") + string(REGEX REPLACE "-O[A-Za-z0-9]" "" EMBREE_CLANG_CMAKE_C_FLAGS_DEBUG ${BLENDER_CLANG_CMAKE_C_FLAGS_DEBUG}) + string(APPEND EMBREE_CLANG_CMAKE_C_FLAGS_DEBUG " -O2") + set(EMBREE_CMAKE_FLAGS + -DCMAKE_BUILD_TYPE=${BUILD_MODE} + -DCMAKE_CXX_FLAGS_RELEASE=${BLENDER_CLANG_CMAKE_CXX_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_MINSIZEREL=${BLENDER_CLANG_CMAKE_CXX_FLAGS_MINSIZEREL} + -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${BLENDER_CLANG_CMAKE_CXX_FLAGS_RELWITHDEBINFO} + -DCMAKE_CXX_FLAGS_DEBUG=${EMBREE_CLANG_CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_RELEASE=${BLENDER_CLANG_CMAKE_C_FLAGS_RELEASE} + -DCMAKE_C_FLAGS_MINSIZEREL=${BLENDER_CLANG_CMAKE_C_FLAGS_MINSIZEREL} + -DCMAKE_C_FLAGS_RELWITHDEBINFO=${BLENDER_CLANG_CMAKE_C_FLAGS_RELWITHDEBINFO} + -DCMAKE_C_FLAGS_DEBUG=${EMBREE_CLANG_CMAKE_C_FLAGS_DEBUG} + -DCMAKE_CXX_STANDARD=17 + ) + set(EMBREE_EXTRA_ARGS + -DCMAKE_CXX_COMPILER=${LIBDIR}/dpcpp/bin/clang++.exe + -DCMAKE_C_COMPILER=${LIBDIR}/dpcpp/bin/clang.exe + -DCMAKE_SHARED_LINKER_FLAGS=-L"${LIBDIR}/dpcpp/lib" + -DEMBREE_SYCL_SUPPORT=ON + ${EMBREE_EXTRA_ARGS} + ) + else() + set(EMBREE_EXTRA_ARGS + -DCMAKE_CXX_COMPILER=${LIBDIR}/dpcpp/bin/clang++ + -DCMAKE_C_COMPILER=${LIBDIR}/dpcpp/bin/clang + -DCMAKE_SHARED_LINKER_FLAGS=-L"${LIBDIR}/dpcpp/lib" + -DEMBREE_SYCL_SUPPORT=ON + ${EMBREE_EXTRA_ARGS} + ) + endif() +endif() + if(TBB_STATIC_LIBRARY) set(EMBREE_EXTRA_ARGS ${EMBREE_EXTRA_ARGS} @@ -42,16 +81,25 @@ ExternalProject_Add(external_embree URL file://${PACKAGE_DIR}/${EMBREE_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${EMBREE_HASH_TYPE}=${EMBREE_HASH} + CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/embree PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${EMBREE_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/embree ) -add_dependencies( - external_embree - external_tbb -) +if(NOT APPLE) + add_dependencies( + external_embree + external_tbb + external_dpcpp + ) +else() + add_dependencies( + external_embree + external_tbb + ) +endif() if(WIN32) if(BUILD_MODE STREQUAL Release) @@ -66,6 +114,7 @@ if(WIN32) ExternalProject_Add_Step(external_embree after_install COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/bin/embree4_d.dll ${HARVEST_TARGET}/embree/bin/embree4_d.dll COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree4_d.lib ${HARVEST_TARGET}/embree/lib/embree4_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree4_sycl_d.lib ${HARVEST_TARGET}/embree/lib/embree4_sycl_d.lib DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/options.cmake b/build_files/build_environment/cmake/options.cmake index 34861caf8fc..ec37d89dcbd 100644 --- a/build_files/build_environment/cmake/options.cmake +++ b/build_files/build_environment/cmake/options.cmake @@ -74,6 +74,27 @@ if(WIN32) set(BLENDER_CMAKE_CXX_FLAGS_RELEASE "/MD ${COMMON_MSVC_FLAGS} /D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS /O2 /Ob2 /D NDEBUG /D PLATFORM_WINDOWS /DPSAPI_VERSION=2 /DTINYFORMAT_ALLOW_WCHAR_STRINGS") set(BLENDER_CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MD ${COMMON_MSVC_FLAGS} /D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS /Zi /O2 /Ob1 /D NDEBUG /D PLATFORM_WINDOWS /DPSAPI_VERSION=2 /DTINYFORMAT_ALLOW_WCHAR_STRINGS") + # Set similar flags for CLANG compilation. + set(COMMON_CLANG_FLAGS "-D_DLL -D_MT") # Equivalent to MSVC /MD + + if(WITH_OPTIMIZED_DEBUG) + set(BLENDER_CLANG_CMAKE_C_FLAGS_DEBUG "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrtd -O2 -D_DEBUG -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + else() + set(BLENDER_CLANG_CMAKE_C_FLAGS_DEBUG "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrtd -g -D_DEBUG -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + endif() + set(BLENDER_CLANG_CMAKE_C_FLAGS_MINSIZEREL "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrt -Os -DNDEBUG -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + set(BLENDER_CLANG_CMAKE_C_FLAGS_RELEASE "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrt -O2 -DNDEBUG -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + set(BLENDER_CLANG_CMAKE_C_FLAGS_RELWITHDEBINFO "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrt -g -O2 -DNDEBUG -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + + if(WITH_OPTIMIZED_DEBUG) + set(BLENDER_CLANG_CMAKE_CXX_FLAGS_DEBUG "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrtd -D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS -O2 -D_DEBUG -DPLATFORM_WINDOWS -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS -DBOOST_DEBUG_PYTHON -DBOOST_ALL_NO_LIB") + else() + set(BLENDER_CLANG_CMAKE_CXX_FLAGS_DEBUG "${COMMON_CLANG_FLAG} -Xclang --dependent-lib=msvcrtd -D_DEBUG -DPLATFORM_WINDOWS -D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS -g -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS -DBOOST_DEBUG_PYTHON -DBOOST_ALL_NO_LIB") + endif() + set(BLENDER_CLANG_CMAKE_CXX_FLAGS_MINSIZEREL "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrt -D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS -O2 -DNDEBUG -DPLATFORM_WINDOWS -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + set(BLENDER_CLANG_CMAKE_CXX_FLAGS_RELEASE "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrt -D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS -O2 -DNDEBUG -DPLATFORM_WINDOWS -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + set(BLENDER_CLANG_CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_CLANG_FLAGS} -Xclang --dependent-lib=msvcrt -D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS -g -O2 -DNDEBUG -DPLATFORM_WINDOWS -DPSAPI_VERSION=2 -DTINYFORMAT_ALLOW_WCHAR_STRINGS") + set(PLATFORM_FLAGS) set(PLATFORM_CXX_FLAGS) set(PLATFORM_CMAKE_FLAGS) diff --git a/build_files/build_environment/patches/embree.diff b/build_files/build_environment/patches/embree.diff index f5be00eee7e..40e19cff65f 100644 --- a/build_files/build_environment/patches/embree.diff +++ b/build_files/build_environment/patches/embree.diff @@ -149,3 +149,19 @@ index 074f910a2..30f490818 100644 return is_hit_first | is_hit_second; } }; +diff -ruN a/kernels/sycl/rthwif_embree_builder.cpp b/kernels/sycl/rthwif_embree_builder.cpp +--- a/kernels/sycl/rthwif_embree_builder.cpp 2023-03-28 17:23:06.429190200 +0200 ++++ b/kernels/sycl/rthwif_embree_builder.cpp 2023-03-28 17:35:01.291938600 +0200 +@@ -540,7 +540,12 @@ + assert(offset <= geomDescrData.size()); + } + ++ /* Force running BVH building sequentially from the calling thread if using TBB < 2021, as it otherwise leads to runtime issues. */ ++#if TBB_VERSION_MAJOR<2021 ++ RTHWIF_PARALLEL_OPERATION parallelOperation = nullptr; ++#else + RTHWIF_PARALLEL_OPERATION parallelOperation = rthwifNewParallelOperation(); ++#endif + + /* estimate static accel size */ + BBox1f time_range(0,1);