diff options
author | Xavier Hallade <xavier.hallade@intel.com> | 2022-06-29 13:58:04 +0300 |
---|---|---|
committer | Xavier Hallade <xavier.hallade@intel.com> | 2022-06-29 13:58:04 +0300 |
commit | a02992f1313811c9905e44dc95a0aee31d707f67 (patch) | |
tree | 2d1f59524e2a298bb530ad578a2d2b9e2c4a1432 /build_files/build_environment | |
parent | 302b04a5a3fc0e767ac784424f78ce2edf5d2844 (diff) |
Cycles: Add support for rendering on Intel GPUs using oneAPI
This patch adds a new Cycles device with similar functionality to the
existing GPU devices. Kernel compilation and runtime interaction happen
via oneAPI DPC++ compiler and SYCL API.
This implementation is primarly focusing on Intel® Arc™ GPUs and other
future Intel GPUs. The first supported drivers are 101.1660 on Windows
and 22.10.22597 on Linux.
The necessary tools for compilation are:
- A SYCL compiler such as oneAPI DPC++ compiler or
https://github.com/intel/llvm
- Intel® oneAPI Level Zero which is used for low level device queries:
https://github.com/oneapi-src/level-zero
- To optionally generate prebuilt graphics binaries: Intel® Graphics
Compiler All are included in Linux precompiled libraries on svn:
https://svn.blender.org/svnroot/bf-blender/trunk/lib The same goes for
Windows precompiled binaries but for the graphics compiler, available
as "Intel® Graphics Offline Compiler for OpenCL™ Code" from
https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html,
for which path can be set as OCLOC_INSTALL_DIR.
Being based on the open SYCL standard, this implementation could also be
extended to run on other compatible non-Intel hardware in the future.
Reviewed By: sergey, brecht
Differential Revision: https://developer.blender.org/D15254
Co-authored-by: Nikita Sirgienko <nikita.sirgienko@intel.com>
Co-authored-by: Stefan Werner <stefan.werner@intel.com>
Diffstat (limited to 'build_files/build_environment')
-rw-r--r-- | build_files/build_environment/CMakeLists.txt | 10 | ||||
-rw-r--r-- | build_files/build_environment/cmake/download.cmake | 16 | ||||
-rw-r--r-- | build_files/build_environment/cmake/dpcpp.cmake | 107 | ||||
-rw-r--r-- | build_files/build_environment/cmake/dpcpp_deps.cmake | 62 | ||||
-rw-r--r-- | build_files/build_environment/cmake/gmmlib.cmake | 14 | ||||
-rw-r--r-- | build_files/build_environment/cmake/harvest.cmake | 6 | ||||
-rw-r--r-- | build_files/build_environment/cmake/igc.cmake | 126 | ||||
-rw-r--r-- | build_files/build_environment/cmake/macros.cmake | 18 | ||||
-rw-r--r-- | build_files/build_environment/cmake/ocloc.cmake | 24 | ||||
-rw-r--r-- | build_files/build_environment/cmake/options.cmake | 2 | ||||
-rw-r--r-- | build_files/build_environment/cmake/versions.cmake | 131 | ||||
-rw-r--r-- | build_files/build_environment/patches/dpcpp.diff | 54 | ||||
-rw-r--r-- | build_files/build_environment/patches/igc_opencl_clang.diff | 44 |
13 files changed, 613 insertions, 1 deletions
diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 1cf63f2d332..a9ff48b2a9b 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -33,6 +33,7 @@ include(cmake/versions.cmake) include(cmake/options.cmake) include(cmake/boost_build_options.cmake) include(cmake/download.cmake) +include(cmake/macros.cmake) if(ENABLE_MINGW64) include(cmake/setup_mingw64.cmake) @@ -96,6 +97,15 @@ include(cmake/fmt.cmake) include(cmake/robinmap.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() + if(NOT WIN32) + include(cmake/igc.cmake) + include(cmake/gmmlib.cmake) + include(cmake/ocloc.cmake) + endif() endif() # OpenColorIO and dependencies. diff --git a/build_files/build_environment/cmake/download.cmake b/build_files/build_environment/cmake/download.cmake index 81e7f7ab3fe..8b210992ada 100644 --- a/build_files/build_environment/cmake/download.cmake +++ b/build_files/build_environment/cmake/download.cmake @@ -101,3 +101,19 @@ download_source(ROBINMAP) download_source(IMATH) download_source(PYSTRING) download_source(LEVEL_ZERO) +download_source(DPCPP) +download_source(VCINTRINSICS) +download_source(OPENCLHEADERS) +download_source(ICDLOADER) +download_source(MP11) +download_source(SPIRV_HEADERS) +download_source(IGC) +download_source(IGC_LLVM) +download_source(IGC_OPENCL_CLANG) +download_source(IGC_VCINTRINSICS) +download_source(IGC_SPIRV_HEADERS) +download_source(IGC_SPIRV_TOOLS) +download_source(IGC_SPIRV_TRANSLATOR) +download_source(GMMLIB) +download_source(OCLOC) + diff --git a/build_files/build_environment/cmake/dpcpp.cmake b/build_files/build_environment/cmake/dpcpp.cmake new file mode 100644 index 00000000000..563bc7aeff4 --- /dev/null +++ b/build_files/build_environment/cmake/dpcpp.cmake @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + + +if(WIN32) + set(LLVM_GENERATOR "Ninja") +else() + set(LLVM_GENERATOR "Unix Makefiles") +endif() + +set(DPCPP_CONFIGURE_ARGS + # When external deps dpcpp needs are not found it will automatically + # download the during the configure stage using FetchContent. Given + # we need to keep an archive of all source used during build for compliance + # reasons it CANNOT download anything we do not know about. By setting + # this property to ON, all downloads are disabled, and we will have to + # provide the missing deps some other way, a build error beats a compliance + # violation + --cmake-opt FETCHCONTENT_FULLY_DISCONNECTED=ON +) +set(DPCPP_SOURCE_ROOT ${BUILD_DIR}/dpcpp/src/external_dpcpp/) +set(DPCPP_EXTRA_ARGS + # When external deps dpcpp needs are not found it will automatically + # download the during the configure stage using FetchContent. Given + # we need to keep an archive of all source used during build for compliance + # reasons it CANNOT download anything we do not know about. By setting + # this property to ON, all downloads are disabled, and we will have to + # provide the missing deps some other way, a build or configure error + # beats a compliance violation + -DFETCHCONTENT_FULLY_DISCONNECTED=ON + -DLLVMGenXIntrinsics_SOURCE_DIR=${BUILD_DIR}/vcintrinsics/src/external_vcintrinsics/ + -DOpenCL_HEADERS=file://${PACKAGE_DIR}/${OPENCLHEADERS_FILE} + -DOpenCL_LIBRARY_SRC=file://${PACKAGE_DIR}/${ICDLOADER_FILE} + -DBOOST_MP11_SOURCE_DIR=${BUILD_DIR}/mp11/src/external_mp11/ + -DLEVEL_ZERO_LIBRARY=${LIBDIR}/level-zero/lib/${LIBPREFIX}ze_loader${SHAREDLIBEXT} + -DLEVEL_ZERO_INCLUDE_DIR=${LIBDIR}/level-zero/include + -DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=${BUILD_DIR}/spirvheaders/src/external_spirvheaders/ + # 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_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 + -DLIBCLC_TARGETS_TO_BUILD= + -DLIBCLC_GENERATE_REMANGLED_VARIANTS=OFF + -DSYCL_BUILD_PI_HIP_PLATFORM=AMD + -DLLVM_BUILD_TOOLS=ON + -DSYCL_ENABLE_WERROR=OFF + -DSYCL_INCLUDE_TESTS=ON + -DLLVM_ENABLE_DOXYGEN=OFF + -DLLVM_ENABLE_SPHINX=OFF + -DBUILD_SHARED_LIBS=OFF + -DSYCL_ENABLE_XPTI_TRACING=ON + -DLLVM_ENABLE_LLD=OFF + -DXPTI_ENABLE_WERROR=OFF + -DSYCL_CLANG_EXTRA_FLAGS= + -DSYCL_ENABLE_PLUGINS=level_zero + -DCMAKE_INSTALL_RPATH=\$ORIGIN + -DPython3_ROOT_DIR=${LIBDIR}/python/ + -DPython3_EXECUTABLE=${PYTHON_BINARY} + -DPYTHON_EXECUTABLE=${PYTHON_BINARY} +) + +if(WIN32) + list(APPEND DPCPP_EXTRA_ARGS -DPython3_FIND_REGISTRY=NEVER) +endif() + +ExternalProject_Add(external_dpcpp + URL file://${PACKAGE_DIR}/${DPCPP_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${DPCPP_HASH_TYPE}=${DPCPP_HASH} + PREFIX ${BUILD_DIR}/dpcpp + CMAKE_GENERATOR ${LLVM_GENERATOR} + SOURCE_SUBDIR llvm + LIST_SEPARATOR ^^ + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/dpcpp ${DEFAULT_CMAKE_FLAGS} ${DPCPP_EXTRA_ARGS} + #CONFIGURE_COMMAND ${PYTHON_BINARY} ${BUILD_DIR}/dpcpp/src/external_dpcpp/buildbot/configure.py ${DPCPP_CONFIGURE_ARGS} + #BUILD_COMMAND echo "." #${PYTHON_BINARY} ${BUILD_DIR}/dpcpp/src/external_dpcpp/buildbot/compile.py + INSTALL_COMMAND ${CMAKE_COMMAND} --build . -- deploy-sycl-toolchain + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/dpcpp/src/external_dpcpp < ${PATCH_DIR}/dpcpp.diff + INSTALL_DIR ${LIBDIR}/dpcpp +) + +add_dependencies( + external_dpcpp + external_python + external_python_site_packages + external_vcintrinsics + external_openclheaders + external_icdloader + external_mp11 + external_level-zero + external_spirvheaders +) + +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/dpcpp_deps.cmake b/build_files/build_environment/cmake/dpcpp_deps.cmake new file mode 100644 index 00000000000..17cb9de3bf7 --- /dev/null +++ b/build_files/build_environment/cmake/dpcpp_deps.cmake @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# These are build time requirements for dpcpp +# We only have to unpack these dpcpp will build +# them. + +ExternalProject_Add(external_vcintrinsics + URL file://${PACKAGE_DIR}/${VCINTRINSICS_FILE} + URL_HASH ${VCINTRINSICS_HASH_TYPE}=${VCINTRINSICS_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/vcintrinsics + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +# opencl headers do not have to be unpacked, dpcpp will do it +# but it wouldn't hurt to do it anyway as an opertunity to validate +# the hash is correct. +ExternalProject_Add(external_openclheaders + URL file://${PACKAGE_DIR}/${OPENCLHEADERS_FILE} + URL_HASH ${OPENCLHEADERS_HASH_TYPE}=${OPENCLHEADERS_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/openclheaders + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +# icdloader does not have to be unpacked, dpcpp will do it +# but it wouldn't hurt to do it anyway as an opertunity to validate +# the hash is correct. +ExternalProject_Add(external_icdloader + URL file://${PACKAGE_DIR}/${ICDLOADER_FILE} + URL_HASH ${ICDLOADER_HASH_TYPE}=${ICDLOADER_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/icdloader + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +ExternalProject_Add(external_mp11 + URL file://${PACKAGE_DIR}/${MP11_FILE} + URL_HASH ${MP11_HASH_TYPE}=${MP11_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/mp11 + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +ExternalProject_Add(external_spirvheaders + URL file://${PACKAGE_DIR}/${SPIRV_HEADERS_FILE} + URL_HASH ${SPIRV_HEADERS_HASH_TYPE}=${SPIRV_HEADERS_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/spirvheaders + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + diff --git a/build_files/build_environment/cmake/gmmlib.cmake b/build_files/build_environment/cmake/gmmlib.cmake new file mode 100644 index 00000000000..d3ddfd39ac6 --- /dev/null +++ b/build_files/build_environment/cmake/gmmlib.cmake @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +set(GMMLIB_EXTRA_ARGS +) + +ExternalProject_Add(external_gmmlib + URL file://${PACKAGE_DIR}/${GMMLIB_FILE} + URL_HASH ${GMMLIB_HASH_TYPE}=${GMMLIB_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/gmmlib + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmmlib ${DEFAULT_CMAKE_FLAGS} ${GMMLIB_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/gmmlib +) + diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index aeaa6fbd2b5..2865a5304d7 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -192,6 +192,10 @@ harvest(zstd/lib zstd/lib "*.a") if(UNIX AND NOT APPLE) harvest(libglu/lib mesa/lib "*.so*") harvest(mesa/lib64 mesa/lib "*.so*") -endif() + + harvest(dpcpp dpcpp "*") + harvest(igc dpcpp/lib/igc "*") + harvest(ocloc dpcpp/lib/ocloc "*") + endif() endif() diff --git a/build_files/build_environment/cmake/igc.cmake b/build_files/build_environment/cmake/igc.cmake new file mode 100644 index 00000000000..64f30064a3a --- /dev/null +++ b/build_files/build_environment/cmake/igc.cmake @@ -0,0 +1,126 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +unpack_only(igc_vcintrinsics) +unpack_only(igc_spirv_headers) +unpack_only(igc_spirv_tools) + +# +# igc_opencl_clang contains patches that need to be applied +# to external_igc_llvm and igc_spirv_translator, we unpack +# igc_opencl_clang first, then have the patch stages of +# external_igc_llvm and igc_spirv_translator apply them. +# + +ExternalProject_Add(external_igc_opencl_clang + URL file://${PACKAGE_DIR}/${IGC_OPENCL_CLANG_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_OPENCL_CLANG_HASH_TYPE}=${IGC_OPENCL_CLANG_HASH} + PREFIX ${BUILD_DIR}/igc_opencl_clang + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ < ${PATCH_DIR}/igc_opencl_clang.diff +) + +set(IGC_OPENCL_CLANG_PATCH_DIR ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/patches) +set(IGC_LLVM_SOURCE_DIR ${BUILD_DIR}/igc_llvm/src/external_igc_llvm) +set(IGC_SPIRV_TRANSLATOR_SOURCE_DIR ${BUILD_DIR}/igc_spirv_translator/src/external_igc_spirv_translator) + +ExternalProject_Add(external_igc_llvm + URL file://${PACKAGE_DIR}/${IGC_LLVM_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_LLVM_HASH_TYPE}=${IGC_LLVM_HASH} + PREFIX ${BUILD_DIR}/igc_llvm + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0001-OpenCL-3.0-support.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0002-Remove-__IMAGE_SUPPORT__-macro-for-SPIR.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0003-Avoid-calling-ParseCommandLineOptions-in-BackendUtil.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0004-OpenCL-support-cl_ext_float_atomics.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0005-OpenCL-Add-cl_khr_integer_dot_product.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/llvm/0001-Memory-leak-fix-for-Managed-Static-Mutex.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/llvm/0002-Remove-repo-name-in-LLVM-IR.patch +) +add_dependencies( + external_igc_llvm + external_igc_opencl_clang +) + +ExternalProject_Add(external_igc_spirv_translator + URL file://${PACKAGE_DIR}/${IGC_SPIRV_TRANSLATOR_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_SPIRV_TRANSLATOR_HASH_TYPE}=${IGC_SPIRV_TRANSLATOR_HASH} + PREFIX ${BUILD_DIR}/igc_spirv_translator + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${IGC_SPIRV_TRANSLATOR_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/spirv/0001-update-SPIR-V-headers-for-SPV_INTEL_split_barrier.patch && + ${PATCH_CMD} -p 1 -d ${IGC_SPIRV_TRANSLATOR_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/spirv/0002-Add-support-for-split-barriers-extension-SPV_INTEL_s.patch && + ${PATCH_CMD} -p 1 -d ${IGC_SPIRV_TRANSLATOR_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/spirv/0003-Support-cl_bf16_conversions.patch +) +add_dependencies( + external_igc_spirv_translator + external_igc_opencl_clang +) + +if(WIN32) + set(IGC_GENERATOR "Ninja") + set(IGC_TARGET Windows64) +else() + set(IGC_GENERATOR "Unix Makefiles") + set(IGC_TARGET Linux64) +endif() + +set(IGC_EXTRA_ARGS + -DIGC_OPTION__ARCHITECTURE_TARGET=${IGC_TARGET} + -DIGC_OPTION__ARCHITECTURE_HOST=${IGC_TARGET} +) + +if(UNIX AND NOT APPLE) + list(APPEND IGC_EXTRA_ARGS + -DFLEX_EXECUTABLE=${LIBDIR}/flex/bin/flex + -DFLEX_INCLUDE_DIR=${LIBDIR}/flex/include + ) +endif() + +ExternalProject_Add(external_igc + URL file://${PACKAGE_DIR}/${IGC_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_HASH_TYPE}=${IGC_HASH} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/igc ${DEFAULT_CMAKE_FLAGS} ${IGC_EXTRA_ARGS} + + # IGC is pretty set in its way where sub projects ought to live, for some it offers + # hooks to supply alternatives folders, other are just hardocded with no way to configure + # we symlink everything here, since it's less work than trying to convince the cmake + # scripts to accept alternative locations. + # + PATCH_COMMAND ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_llvm/src/external_igc_llvm/ ${BUILD_DIR}/igc/src/llvm-project && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/opencl-clang && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_translator/src/external_igc_spirv_translator/ ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/llvm-spirv && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_tools/src/external_igc_spirv_tools/ ${BUILD_DIR}/igc/src/SPIRV-Tools && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_headers/src/external_igc_spirv_headers/ ${BUILD_DIR}/igc/src/SPIRV-Headers && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_vcintrinsics/src/external_igc_vcintrinsics/ ${BUILD_DIR}/igc/src/vc-intrinsics + PREFIX ${BUILD_DIR}/igc + INSTALL_DIR ${LIBDIR}/igc + INSTALL_COMMAND ${CMAKE_COMMAND} --install . --strip + CMAKE_GENERATOR ${IGC_GENERATOR} +) + +add_dependencies( + external_igc + external_igc_vcintrinsics + external_igc_llvm + external_igc_opencl_clang + external_igc_vcintrinsics + external_igc_spirv_headers + external_igc_spirv_tools + external_igc_spirv_translator +) + +if(UNIX AND NOT APPLE) + add_dependencies( + external_igc + external_flex + ) +endif() diff --git a/build_files/build_environment/cmake/macros.cmake b/build_files/build_environment/cmake/macros.cmake new file mode 100644 index 00000000000..82fc151a038 --- /dev/null +++ b/build_files/build_environment/cmake/macros.cmake @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# shorthand to only unpack a certain dependency +macro(unpack_only name) + string(TOUPPER ${name} UPPER_NAME) + set(TARGET_FILE ${${UPPER_NAME}_FILE}) + set(TARGET_HASH_TYPE ${${UPPER_NAME}_HASH_TYPE}) + set(TARGET_HASH ${${UPPER_NAME}_HASH}) + ExternalProject_Add(external_${name} + URL file://${PACKAGE_DIR}/${TARGET_FILE} + URL_HASH ${TARGET_HASH_TYPE}=${TARGET_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/${name} + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + ) +endmacro() diff --git a/build_files/build_environment/cmake/ocloc.cmake b/build_files/build_environment/cmake/ocloc.cmake new file mode 100644 index 00000000000..f686d2dd4fc --- /dev/null +++ b/build_files/build_environment/cmake/ocloc.cmake @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +set(OCLOC_EXTRA_ARGS + -DNEO_SKIP_UNIT_TESTS=1 + -DNEO_BUILD_WITH_OCL=0 + -DBUILD_WITH_L0=0 + -DIGC_DIR=${LIBDIR}/igc + -DGMM_DIR=${LIBDIR}/gmmlib +) + +ExternalProject_Add(external_ocloc + URL file://${PACKAGE_DIR}/${OCLOC_FILE} + URL_HASH ${OCLOC_HASH_TYPE}=${OCLOC_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/ocloc + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ocloc ${DEFAULT_CMAKE_FLAGS} ${OCLOC_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/ocloc +) + +add_dependencies( + external_ocloc + external_igc + external_gmmlib +) diff --git a/build_files/build_environment/cmake/options.cmake b/build_files/build_environment/cmake/options.cmake index 7b9529068f4..9015ef9ac7c 100644 --- a/build_files/build_environment/cmake/options.cmake +++ b/build_files/build_environment/cmake/options.cmake @@ -38,6 +38,7 @@ message("BUILD_DIR = ${BUILD_DIR}") if(WIN32) set(PATCH_CMD ${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/patch.exe) set(LIBEXT ".lib") + set(SHAREDLIBEXT ".lib") set(LIBPREFIX "") # For OIIO and OSL @@ -96,6 +97,7 @@ if(WIN32) else() set(PATCH_CMD patch) set(LIBEXT ".a") + set(SHAREDLIBEXT ".so") set(LIBPREFIX "lib") if(APPLE) diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index c8699c3773c..1a4ad291581 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -502,3 +502,134 @@ set(LEVEL_ZERO_URI https://github.com/oneapi-src/level-zero/archive/refs/tags/${ set(LEVEL_ZERO_HASH c39bb05a8e5898aa6c444e1704105b93d3f1888b9c333f8e7e73825ffbfb2617) set(LEVEL_ZERO_HASH_TYPE SHA256) set(LEVEL_ZERO_FILE level-zero-${LEVEL_ZERO_VERSION}.tar.gz) + +set(DPCPP_VERSION 20220620) +set(DPCPP_URI https://github.com/intel/llvm/archive/refs/tags/sycl-nightly/${DPCPP_VERSION}.tar.gz) +set(DPCPP_HASH a5f41abd5229d28afa92cbd8a5d8d786ee698bf239f722929fd686276bad692c) +set(DPCPP_HASH_TYPE SHA256) +set(DPCPP_FILE DPCPP-${DPCPP_VERSION}.tar.gz) + +######################## +### DPCPP DEPS BEGIN ### +######################## +# The following deps are build time requirements for dpcpp, when possible +# the source in the dpcpp source tree for the version chosen is documented +# by each dep, these will only have to be downloaded and unpacked, dpcpp +# will take care of building them, unpack is being done in dpcpp_deps.cmake + +# Source llvm/lib/SYCLLowerIR/CMakeLists.txt +set(VCINTRINSICS_VERSION 984bb27baacce6ee5c716c2e64845f2a1928025b) +set(VCINTRINSICS_URI https://github.com/intel/vc-intrinsics/archive/${VCINTRINSICS_VERSION}.tar.gz) +set(VCINTRINSICS_HASH abea415a15a0dd11fdc94dee8fb462910f2548311b787e02f42509789e1b0d7b) +set(VCINTRINSICS_HASH_TYPE SHA256) +set(VCINTRINSICS_FILE vc-intrinsics-${VCINTRINSICS_VERSION}.tar.gz) + +# Source opencl/CMakeLists.txt +set(OPENCLHEADERS_VERSION dcd5bede6859d26833cd85f0d6bbcee7382dc9b3) +set(OPENCLHEADERS_URI https://github.com/KhronosGroup/OpenCL-Headers/archive/${OPENCLHEADERS_VERSION}.tar.gz) +set(OPENCLHEADERS_HASH ca8090359654e94f2c41e946b7e9d826253d795ae809ce7c83a7d3c859624693) +set(OPENCLHEADERS_HASH_TYPE SHA256) +set(OPENCLHEADERS_FILE opencl_headers-${OPENCLHEADERS_VERSION}.tar.gz) + +# Source opencl/CMakeLists.txt +set(ICDLOADER_VERSION aec3952654832211636fc4af613710f80e203b0a) +set(ICDLOADER_URI https://github.com/KhronosGroup/OpenCL-ICD-Loader/archive/${ICDLOADER_VERSION}.tar.gz) +set(ICDLOADER_HASH e1880551d67bd8dc31d13de63b94bbfd6b1f315b6145dad1ffcd159b89bda93c) +set(ICDLOADER_HASH_TYPE SHA256) +set(ICDLOADER_FILE icdloader-${ICDLOADER_VERSION}.tar.gz) + +# Source sycl/cmake/modules/AddBoostMp11Headers.cmake +# Using external MP11 here, getting AddBoostMp11Headers.cmake to recognize +# our copy in boost directly was more trouble than it was worth. +set(MP11_VERSION 7bc4e1ae9b36ec8ee635c3629b59ec525bbe82b9) +set(MP11_URI https://github.com/boostorg/mp11/archive/${MP11_VERSION}.tar.gz) +set(MP11_HASH 071ee2bd3952ec89882edb3af25dd1816f6b61723f66e42eea32f4d02ceef426) +set(MP11_HASH_TYPE SHA256) +set(MP11_FILE mp11-${MP11_VERSION}.tar.gz) + +# Source llvm-spirv/CMakeLists.txt (repo) +# Source llvm-spirv/spirv-headers-tag.conf (hash) +set(SPIRV_HEADERS_VERSION 36c0c1596225e728bd49abb7ef56a3953e7ed468) +set(SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/${SPIRV_HEADERS_VERSION}.tar.gz) +set(SPIRV_HEADERS_HASH 7a5c89633f8740456fe8adee052033e134476d267411d1336c0cb1e587a9229a) +set(SPIRV_HEADERS_HASH_TYPE SHA256) +set(SPIRV_HEADERS_FILE SPIR-V-Headers-${SPIRV_HEADERS_VERSION}.tar.gz) + +###################### +### DPCPP DEPS END ### +###################### + +########################################## +### Intel Graphics Compiler DEPS BEGIN ### +########################################## +# The following deps are build time requirements for the intel graphics +# compiler, the versions used are taken from the following location +# https://github.com/intel/intel-graphics-compiler/releases + +set(IGC_VERSION 1.0.11222) +set(IGC_URI https://github.com/intel/intel-graphics-compiler/archive/refs/tags/igc-${IGC_VERSION}.tar.gz) +set(IGC_HASH d92f0608dcbb52690855685f9447282e5c09c0ba98ae35fabf114fcf8b1e9fcf) +set(IGC_HASH_TYPE SHA256) +set(IGC_FILE igc-${IGC_VERSION}.tar.gz) + +set(IGC_LLVM_VERSION llvmorg-11.1.0) +set(IGC_LLVM_URI https://github.com/llvm/llvm-project/archive/refs/tags/${IGC_LLVM_VERSION}.tar.gz) +set(IGC_LLVM_HASH 53a0719f3f4b0388013cfffd7b10c7d5682eece1929a9553c722348d1f866e79) +set(IGC_LLVM_HASH_TYPE SHA256) +set(IGC_LLVM_FILE ${IGC_LLVM_VERSION}.tar.gz) + +# WARNING WARNING WARNING +# +# IGC_OPENCL_CLANG contains patches for some of its dependencies. +# +# Whenever IGC_OPENCL_CLANG_VERSION changes, one *MUST* inspect +# IGC_OPENCL_CLANG's patches folder and update igc.cmake to account for +# any added or removed patches. +# +# WARNING WARNING WARNING + +set(IGC_OPENCL_CLANG_VERSION bbdd1587f577397a105c900be114b56755d1f7dc) +set(IGC_OPENCL_CLANG_URI https://github.com/intel/opencl-clang/archive/${IGC_OPENCL_CLANG_VERSION}.tar.gz) +set(IGC_OPENCL_CLANG_HASH d08315f1b0d8a6fef33de2b3e6aa7356534c324910634962c72523d970773efc) +set(IGC_OPENCL_CLANG_HASH_TYPE SHA256) +set(IGC_OPENCL_CLANG_FILE opencl-clang-${IGC_OPENCL_CLANG_VERSION}.tar.gz) + +set(IGC_VCINTRINSICS_VERSION v0.4.0) +set(IGC_VCINTRINSICS_URI https://github.com/intel/vc-intrinsics/archive/refs/tags/${IGC_VCINTRINSICS_VERSION}.tar.gz) +set(IGC_VCINTRINSICS_HASH c8b92682ad5031cf9d5b82a40e7d5c0e763cd9278660adbcaa69aab988e4b589) +set(IGC_VCINTRINSICS_HASH_TYPE SHA256) +set(IGC_VCINTRINSICS_FILE vc-intrinsics-${IGC_VCINTRINSICS_VERSION}.tar.gz) + +set(IGC_SPIRV_HEADERS_VERSION sdk-1.3.204.1) +set(IGC_SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/refs/tags/${IGC_SPIRV_HEADERS_VERSION}.tar.gz) +set(IGC_SPIRV_HEADERS_HASH 262864053968c217d45b24b89044a7736a32361894743dd6cfe788df258c746c) +set(IGC_SPIRV_HEADERS_HASH_TYPE SHA256) +set(IGC_SPIRV_HEADERS_FILE SPIR-V-Headers-${IGC_SPIRV_HEADERS_VERSION}.tar.gz) + +set(IGC_SPIRV_TOOLS_VERSION sdk-1.3.204.1) +set(IGC_SPIRV_TOOLS_URI https://github.com/KhronosGroup/SPIRV-Tools/archive/refs/tags/${IGC_SPIRV_TOOLS_VERSION}.tar.gz) +set(IGC_SPIRV_TOOLS_HASH 6e19900e948944243024aedd0a201baf3854b377b9cc7a386553bc103b087335) +set(IGC_SPIRV_TOOLS_HASH_TYPE SHA256) +set(IGC_SPIRV_TOOLS_FILE SPIR-V-Tools-${IGC_SPIRV_TOOLS_VERSION}.tar.gz) + +set(IGC_SPIRV_TRANSLATOR_VERSION 99420daab98998a7e36858befac9c5ed109d4920) +set(IGC_SPIRV_TRANSLATOR_URI https://github.com/KhronosGroup/SPIRV-LLVM-Translator/archive/${IGC_SPIRV_TRANSLATOR_VERSION}.tar.gz) +set(IGC_SPIRV_TRANSLATOR_HASH 77dfb4ddb6bfb993535562c02ddea23f0a0d1c5a0258c1afe7e27c894ff783a8) +set(IGC_SPIRV_TRANSLATOR_HASH_TYPE SHA256) +set(IGC_SPIRV_TRANSLATOR_FILE SPIR-V-Translator-${IGC_SPIRV_TRANSLATOR_VERSION}.tar.gz) + +######################################## +### Intel Graphics Compiler DEPS END ### +######################################## + +set(GMMLIB_VERSION intel-gmmlib-22.1.2) +set(GMMLIB_URI https://github.com/intel/gmmlib/archive/refs/tags/${GMMLIB_VERSION}.tar.gz) +set(GMMLIB_HASH 3b9a6d5e7e3f5748b3d0a2fb0e980ae943907fece0980bd9c0508e71c838e334) +set(GMMLIB_HASH_TYPE SHA256) +set(GMMLIB_FILE ${GMMLIB_VERSION}.tar.gz) + +set(OCLOC_VERSION 22.20.23198) +set(OCLOC_URI https://github.com/intel/compute-runtime/archive/refs/tags/${OCLOC_VERSION}.tar.gz) +set(OCLOC_HASH ab22b8bf2560a57fdd3def0e35a62ca75991406f959c0263abb00cd6cd9ae998) +set(OCLOC_HASH_TYPE SHA256) +set(OCLOC_FILE ocloc-${OCLOC_VERSION}.tar.gz) diff --git a/build_files/build_environment/patches/dpcpp.diff b/build_files/build_environment/patches/dpcpp.diff new file mode 100644 index 00000000000..9dbe032de0c --- /dev/null +++ b/build_files/build_environment/patches/dpcpp.diff @@ -0,0 +1,54 @@ +diff -Naur external_dpcpp.orig/sycl/source/CMakeLists.txt external_dpcpp/sycl/source/CMakeLists.txt +--- external_dpcpp.orig/sycl/source/CMakeLists.txt 2022-05-20 04:19:45.067771362 +0000 ++++ external_dpcpp/sycl/source/CMakeLists.txt 2022-05-20 04:21:49.708025048 +0000 +@@ -66,10 +66,10 @@ + target_compile_options(${LIB_OBJ_NAME} PUBLIC + -fvisibility=hidden -fvisibility-inlines-hidden) + set(linker_script "${CMAKE_CURRENT_SOURCE_DIR}/ld-version-script.txt") +- set(abi_linker_script "${CMAKE_CURRENT_SOURCE_DIR}/abi_replacements_linux.txt") +- target_link_libraries( +- ${LIB_NAME} PRIVATE "-Wl,${abi_linker_script}") +- set_target_properties(${LIB_NAME} PROPERTIES LINK_DEPENDS ${abi_linker_script}) ++# set(abi_linker_script "${CMAKE_CURRENT_SOURCE_DIR}/abi_replacements_linux.txt") ++# target_link_libraries( ++# ${LIB_NAME} PRIVATE "-Wl,${abi_linker_script}") ++# set_target_properties(${LIB_NAME} PROPERTIES LINK_DEPENDS ${abi_linker_script}) + target_link_libraries( + ${LIB_NAME} PRIVATE "-Wl,--version-script=${linker_script}") + set_target_properties(${LIB_NAME} PROPERTIES LINK_DEPENDS ${linker_script}) +diff -Naur llvm-sycl-nightly-20220501.orig\opencl/CMakeLists.txt llvm-sycl-nightly-20220501\opencl/CMakeLists.txt +--- llvm-sycl-nightly-20220501.orig/opencl/CMakeLists.txt 2022-04-29 13:47:11 -0600 ++++ llvm-sycl-nightly-20220501/opencl/CMakeLists.txt 2022-05-21 15:25:06 -0600 +@@ -11,6 +11,11 @@ + ) + endif() + ++# Blender code below is determined to use FetchContent_Declare ++# temporarily allow it (but feed it our downloaded tarball ++# in the OpenCL_HEADERS variable ++set(FETCHCONTENT_FULLY_DISCONNECTED OFF) ++ + # Repo URLs + + set(OCL_HEADERS_REPO +@@ -77,5 +82,6 @@ + + FetchContent_MakeAvailable(ocl-icd) + add_library(OpenCL-ICD ALIAS OpenCL) ++set(FETCHCONTENT_FULLY_DISCONNECTED ON) + + add_subdirectory(opencl-aot) +diff -Naur llvm-sycl-nightly-20220208.orig/libdevice/cmake/modules/SYCLLibdevice.cmake llvm-sycl-nightly-20220208/libdevice/cmake/modules/SYCLLibdevice.cmake +--- llvm-sycl-nightly-20220208.orig/libdevice/cmake/modules/SYCLLibdevice.cmake 2022-02-08 09:17:24 -0700 ++++ llvm-sycl-nightly-20220208/libdevice/cmake/modules/SYCLLibdevice.cmake 2022-05-24 11:35:51 -0600 +@@ -36,7 +36,9 @@ + add_custom_target(libsycldevice-obj) + add_custom_target(libsycldevice-spv) + +-add_custom_target(libsycldevice DEPENDS ++# Blender: add ALL here otherwise this target will not build ++# and cause an error due to missing files during the install phase. ++add_custom_target(libsycldevice ALL DEPENDS + libsycldevice-obj + libsycldevice-spv) + diff --git a/build_files/build_environment/patches/igc_opencl_clang.diff b/build_files/build_environment/patches/igc_opencl_clang.diff new file mode 100644 index 00000000000..adc592dd8b2 --- /dev/null +++ b/build_files/build_environment/patches/igc_opencl_clang.diff @@ -0,0 +1,44 @@ +diff -Naur external_igc_opencl_clang.orig/CMakeLists.txt external_igc_opencl_clang/CMakeLists.txt +--- external_igc_opencl_clang.orig/CMakeLists.txt 2022-03-16 05:51:10 -0600 ++++ external_igc_opencl_clang/CMakeLists.txt 2022-05-23 10:40:09 -0600 +@@ -126,22 +126,24 @@ + ) + endif() + +- +- set(SPIRV_BASE_REVISION llvm_release_110) +- set(TARGET_BRANCH "ocl-open-110") +- get_filename_component(LLVM_MONOREPO_DIR ${LLVM_SOURCE_DIR} DIRECTORY) +- set(LLVM_PATCHES_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/patches/llvm +- ${CMAKE_CURRENT_SOURCE_DIR}/patches/clang) +- apply_patches(${LLVM_MONOREPO_DIR} +- "${LLVM_PATCHES_DIRS}" +- ${LLVM_BASE_REVISION} +- ${TARGET_BRANCH} +- ret) +- apply_patches(${SPIRV_SOURCE_DIR} +- ${CMAKE_CURRENT_SOURCE_DIR}/patches/spirv +- ${SPIRV_BASE_REVISION} +- ${TARGET_BRANCH} +- ret) ++ # ++ # Blender: Why apply these manually in igc.cmake ++ # ++ #set(SPIRV_BASE_REVISION llvm_release_110) ++ #set(TARGET_BRANCH "ocl-open-110") ++ #get_filename_component(LLVM_MONOREPO_DIR ${LLVM_SOURCE_DIR} DIRECTORY) ++ #set(LLVM_PATCHES_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/patches/llvm ++ # ${CMAKE_CURRENT_SOURCE_DIR}/patches/clang) ++ #apply_patches(${LLVM_MONOREPO_DIR} ++ # "${LLVM_PATCHES_DIRS}" ++ # ${LLVM_BASE_REVISION} ++ # ${TARGET_BRANCH} ++ # ret) ++ #apply_patches(${SPIRV_SOURCE_DIR} ++ # ${CMAKE_CURRENT_SOURCE_DIR}/patches/spirv ++ # ${SPIRV_BASE_REVISION} ++ # ${TARGET_BRANCH} ++ # ret) + endif(NOT USE_PREBUILT_LLVM) + + # |