This change switches Cycles to an opensource HIP-RT library which
implements hardware ray-tracing. This library is now used on
both Windows and Linux. While there should be no noticeable changes
on Windows, on Linux this adds support for hardware ray-tracing on
AMD GPUs.
The majority of the change is typical platform code to add new
library to the dependency builder, and a change in the way how
ahead-of-time (AoT) kernels are compiled. There are changes in
Cycles itself, but they are rather straightforward: some APIs
changed in the opensource version of the library.
There are a couple of extra files which are needed for this to
work: hiprt02003_6.1_amd.hipfb and oro_compiled_kernels.hipfb.
There are some assumptions in the HIP-RT library about how they
are available. Currently they follow the same rule as AoT
kernels for oneAPI:
- On Windows they are next to blender.exe
- On Linux they are in the lib/ folder
Performance comparison on Ubuntu 22.04.5:
```
GPU: AMD Radeon PRO W7800
Driver: amdgpu-install_6.1.60103-1_all.deb
main hip-rt
attic 0.1414s 0.0932s
barbershop_interior 0.1563s 0.1258s
bistro 0.2134s 0.1597s
bmw27 0.0119s 0.0099s
classroom 0.1006s 0.0803s
fishy_cat 0.0248s 0.0178s
junkshop 0.0916s 0.0713s
koro 0.0589s 0.0720s
monster 0.0435s 0.0385s
pabellon 0.0543s 0.0391s
sponza 0.0223s 0.0180s
spring 0.1026s 1.5145s
victor 0.1901s 0.1239s
wdas_cloud 0.1153s 0.1125s
```
Co-authored-by: Brecht Van Lommel <brecht@blender.org>
Co-authored-by: Ray Molenkamp <github@lazydodo.com>
Co-authored-by: Sergey Sharybin <sergey@blender.org>
Pull Request: https://projects.blender.org/blender/blender/pulls/121050
131 lines
4.3 KiB
CMake
131 lines
4.3 KiB
CMake
# SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
###########################################################################
|
|
# SDL
|
|
###########################################################################
|
|
|
|
if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
|
|
# We can't use the version from the Blender precompiled libraries because
|
|
# it does not include the video subsystem.
|
|
find_package(SDL2 REQUIRED)
|
|
set_and_warn_library_found("SDL" SDL2_FOUND WITH_CYCLES_STANDALONE_GUI)
|
|
|
|
if(SDL2_FOUND)
|
|
include_directories(
|
|
SYSTEM
|
|
${SDL2_INCLUDE_DIRS}
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
###########################################################################
|
|
# CUDA
|
|
###########################################################################
|
|
|
|
if(WITH_CYCLES_DEVICE_CUDA AND (WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DYNLOAD))
|
|
find_package(CUDA) # Try to auto locate CUDA toolkit
|
|
set_and_warn_library_found("CUDA compiler" CUDA_FOUND WITH_CYCLES_CUDA_BINARIES)
|
|
|
|
if(CUDA_FOUND)
|
|
message(STATUS "Found CUDA ${CUDA_NVCC_EXECUTABLE} (${CUDA_VERSION})")
|
|
else()
|
|
if(NOT WITH_CUDA_DYNLOAD)
|
|
message(STATUS "Additionally falling back to dynamic CUDA load")
|
|
set(WITH_CUDA_DYNLOAD ON)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
###########################################################################
|
|
# HIP
|
|
###########################################################################
|
|
|
|
if(WITH_CYCLES_DEVICE_HIP)
|
|
if(WITH_CYCLES_HIP_BINARIES OR WITH_CYCLES_DEVICE_HIPRT)
|
|
# Need at least HIP 5.5 to solve compiler bug affecting the kernel.
|
|
find_package(HIP 5.5.0)
|
|
set_and_warn_library_found("HIP compiler" HIP_FOUND WITH_CYCLES_HIP_BINARIES)
|
|
|
|
if(HIP_FOUND)
|
|
message(STATUS "Found HIP ${HIP_HIPCC_EXECUTABLE} (${HIP_VERSION})")
|
|
endif()
|
|
endif()
|
|
|
|
# HIP RT
|
|
if(WITH_CYCLES_DEVICE_HIP AND WITH_CYCLES_DEVICE_HIPRT)
|
|
if(DEFINED LIBDIR)
|
|
set(HIPRT_ROOT_DIR ${LIBDIR}/hiprt)
|
|
endif()
|
|
find_package(HIPRT)
|
|
set_and_warn_library_found("HIP RT" HIPRT_FOUND WITH_CYCLES_DEVICE_HIPRT)
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT WITH_CYCLES_DEVICE_HIP)
|
|
set(WITH_CYCLES_DEVICE_HIPRT OFF)
|
|
endif()
|
|
|
|
if(NOT WITH_HIP_DYNLOAD)
|
|
set(WITH_HIP_DYNLOAD ON)
|
|
endif()
|
|
|
|
###########################################################################
|
|
# Metal
|
|
###########################################################################
|
|
|
|
if(WITH_CYCLES_DEVICE_METAL)
|
|
find_library(METAL_LIBRARY Metal)
|
|
|
|
# This file was added in the 12.0 SDK, use it as a way to detect the version.
|
|
if(METAL_LIBRARY)
|
|
if(EXISTS "${METAL_LIBRARY}/Headers/MTLFunctionStitching.h")
|
|
set(METAL_FOUND ON)
|
|
else()
|
|
message(STATUS "Metal version too old, must be SDK 12.0 or newer")
|
|
set(METAL_FOUND OFF)
|
|
endif()
|
|
endif()
|
|
|
|
set_and_warn_library_found("Metal" METAL_FOUND WITH_CYCLES_DEVICE_METAL)
|
|
if(METAL_FOUND)
|
|
message(STATUS "Found Metal: ${METAL_LIBRARY}")
|
|
endif()
|
|
endif()
|
|
|
|
###########################################################################
|
|
# oneAPI
|
|
###########################################################################
|
|
|
|
if(WITH_CYCLES_DEVICE_ONEAPI OR EMBREE_SYCL_SUPPORT)
|
|
# Find packages for even when WITH_CYCLES_DEVICE_ONEAPI is OFF, as it's
|
|
# needed for linking to Embree with SYCL support.
|
|
find_package(SYCL)
|
|
find_package(LevelZero)
|
|
|
|
if(WITH_CYCLES_DEVICE_ONEAPI)
|
|
set_and_warn_library_found("oneAPI" SYCL_FOUND WITH_CYCLES_DEVICE_ONEAPI)
|
|
set_and_warn_library_found("Level Zero" LEVEL_ZERO_FOUND WITH_CYCLES_DEVICE_ONEAPI)
|
|
if(NOT (SYCL_FOUND AND SYCL_VERSION VERSION_GREATER_EQUAL 6.0 AND LEVEL_ZERO_FOUND))
|
|
message(STATUS "SYCL 6.0+ or Level Zero not found, disabling WITH_CYCLES_DEVICE_ONEAPI")
|
|
set(WITH_CYCLES_DEVICE_ONEAPI OFF)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(WITH_CYCLES_DEVICE_ONEAPI AND WITH_CYCLES_ONEAPI_BINARIES)
|
|
if(NOT OCLOC_INSTALL_DIR)
|
|
get_filename_component(_sycl_compiler_root ${SYCL_COMPILER} DIRECTORY)
|
|
get_filename_component(OCLOC_INSTALL_DIR "${_sycl_compiler_root}/../lib/ocloc" ABSOLUTE)
|
|
unset(_sycl_compiler_root)
|
|
endif()
|
|
|
|
if(NOT EXISTS ${OCLOC_INSTALL_DIR})
|
|
set(OCLOC_FOUND OFF)
|
|
message(STATUS "oneAPI ocloc not found in ${OCLOC_INSTALL_DIR}."
|
|
" A different ocloc directory can be set using OCLOC_INSTALL_DIR cmake variable.")
|
|
set_and_warn_library_found("ocloc" OCLOC_FOUND WITH_CYCLES_ONEAPI_BINARIES)
|
|
endif()
|
|
endif()
|