This change brings the following improvements on the user level - Support of GPUs with gfx12 architecture - New HIP-RT library which in addition to the gfx12 support brings various bug-fixes. The known limitation of gfx12 is that OpenImageDenoiser does not yet support this GPU architecture. This means that while Cycles will use the full advantage of the gfx12 (including hardware accelerated ray-tracing), denoising will only be possible on CPU, or secondary gfx11 or below GPU. This is something that requires a change in OIDN and it is to late to do it for Blender 4.4, but it is something to look forward for Blender 4.5. The gfx12 changes for the pre-compiled kernels is rather trivial, so it comes together (in the same PR) as the bigger HIP-RT change. On the development side this change brings the following improvements: - One step compile and link (much simpler CMake rules) - Embedding BVH binaries in hiprt dll (which makes it easier to package and load, without relying on special path configuration) Co-authored-by: Sahar Kashi <sahar.kashi@amd.com> Co-authored-by: Sergey Sharybin <sergey@blender.org> Co-authored-by: Brecht Van Lommel <brecht@blender.org> Pull Request: https://projects.blender.org/blender/blender/pulls/133129
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)
|
|
# 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()
|