mirror of
https://github.com/blender/blender
synced 2026-09-29 04:37:17 +03:00
The commit switches Cycles to use CUDA-13 by default, which makes it easier to add support for CUDA on Windows arm64 platform. This commit also enables Cycles DLSS denoising, make Blender ready to utilize this technology as soon as an updated Nvidia driver is releases with the required runtime. The changes are coupled together because they required changes on the buildbot system side: the SDK's needed to be installed, and the information about them somehow needed to be passed to Blender. To make similar deployments easier in the future this change makes it so the SDK versions from build_files/config/pipeline_config.yaml to build_files/buildbot/config/blender_version.cmake Buildbot provides information about root directory where the specific SDKs are installed, giving flexibility to the buildbot to move things around if needed, but also making it more control to Blender developers to tweak the logic. Last but not least, the way how CUDA toolkit is selected for Cycles kernels got refactored to make it easier to follow: - There is an easy to follow table of per-architecture or family toolkits. - If there is no architectural preference, all provided toolkits are probed. For SM kernels newer toolkits are tested first, and for COMPUTE the oldest toolkits are probed first. - If there is no suitable toolkit with explicit major version the default one is used. A driver version 580 and above is now required. From quick checks it seems that on Windows it shouldn't be a problem since 582 driver is available for sm_50 devices (the oldest architecture we compile). Pull Request: https://projects.blender.org/blender/blender/pulls/164002
132 lines
3.2 KiB
C++
132 lines
3.2 KiB
C++
/* SPDX-FileCopyrightText: 2019 NVIDIA Corporation
|
|
* SPDX-FileCopyrightText: 2019-2022 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#include "device/optix/device.h"
|
|
#include "device/cuda/device.h"
|
|
#include "device/device.h"
|
|
|
|
#ifdef WITH_OSL
|
|
# include <OSL/oslconfig.h>
|
|
# include <OSL/oslversion.h>
|
|
#endif
|
|
|
|
#ifdef WITH_OPTIX
|
|
# include "device/optix/device_impl.h"
|
|
|
|
# include "integrator/denoiser_oidn_gpu.h" // IWYU pragma: keep
|
|
|
|
# include <optix_function_table_definition.h>
|
|
#endif
|
|
|
|
#include "util/log.h"
|
|
|
|
#ifndef OPTIX_FUNCTION_TABLE_SYMBOL
|
|
# define OPTIX_FUNCTION_TABLE_SYMBOL g_optixFunctionTable
|
|
#endif
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
bool device_optix_init(bool *r_meets_driver_requirement)
|
|
{
|
|
if (r_meets_driver_requirement) {
|
|
*r_meets_driver_requirement = true;
|
|
}
|
|
#ifdef WITH_OPTIX
|
|
if (OPTIX_FUNCTION_TABLE_SYMBOL.optixDeviceContextCreate != nullptr) {
|
|
/* Already initialized function table. */
|
|
return true;
|
|
}
|
|
|
|
/* Need to initialize CUDA as well. */
|
|
if (!device_cuda_init()) {
|
|
return false;
|
|
}
|
|
|
|
const OptixResult result = optixInit();
|
|
|
|
if (result == OPTIX_ERROR_UNSUPPORTED_ABI_VERSION) {
|
|
LOG_WARNING << "OptiX initialization failed because the installed NVIDIA driver is too old. "
|
|
"Please update to the latest driver first!";
|
|
if (r_meets_driver_requirement) {
|
|
*r_meets_driver_requirement = false;
|
|
}
|
|
return false;
|
|
}
|
|
if (result != OPTIX_SUCCESS) {
|
|
LOG_WARNING << "OptiX initialization failed with error code " << (unsigned int)result;
|
|
return false;
|
|
}
|
|
|
|
/* Loaded OptiX successfully! */
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
void device_optix_info(const vector<DeviceInfo> &cuda_devices, vector<DeviceInfo> &devices)
|
|
{
|
|
#ifdef WITH_OPTIX
|
|
devices.reserve(cuda_devices.size());
|
|
|
|
/* Simply add all supported CUDA devices as OptiX devices again. */
|
|
for (DeviceInfo info : cuda_devices) {
|
|
assert(info.type == DEVICE_CUDA);
|
|
|
|
int major;
|
|
cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, info.num);
|
|
if (major < 5) {
|
|
/* Only Maxwell and up are supported by OptiX. */
|
|
continue;
|
|
}
|
|
|
|
info.type = DEVICE_OPTIX;
|
|
info.id += "_OptiX";
|
|
|
|
info.use_hardware_raytracing = true;
|
|
|
|
# if defined(WITH_OSL) && defined(OSL_USE_OPTIX) && \
|
|
(OSL_VERSION_MINOR >= 13 || OSL_VERSION_MAJOR > 1)
|
|
info.has_osl = true;
|
|
# endif
|
|
info.denoisers |= DENOISER_OPTIX;
|
|
# if defined(WITH_OPENIMAGEDENOISE)
|
|
# if OIDN_VERSION >= 20300
|
|
if (oidnIsCUDADeviceSupported(info.num)) {
|
|
# else
|
|
if (OIDNDenoiserGPU::is_device_supported(info)) {
|
|
# endif
|
|
info.denoisers |= DENOISER_OPENIMAGEDENOISE;
|
|
}
|
|
# endif
|
|
|
|
devices.push_back(info);
|
|
}
|
|
#else
|
|
(void)cuda_devices;
|
|
(void)devices;
|
|
#endif
|
|
}
|
|
|
|
unique_ptr<Device> device_optix_create(const DeviceInfo &info,
|
|
Stats &stats,
|
|
Profiler &profiler,
|
|
bool headless)
|
|
{
|
|
#ifdef WITH_OPTIX
|
|
return make_unique<OptiXDevice>(info, stats, profiler, headless);
|
|
#else
|
|
(void)info;
|
|
(void)stats;
|
|
(void)profiler;
|
|
(void)headless;
|
|
|
|
LOG_FATAL << "Request to create OptiX device without compiled-in support. Should never happen.";
|
|
|
|
return nullptr;
|
|
#endif
|
|
}
|
|
|
|
CCL_NAMESPACE_END
|