Cycles: add option to specify OptiX runtime root directory
This allows individual users or Linux distributions to specify a directory Cycles will automatically look for the OptiX include folder, to compile kernels at runtime. It is still possible to override this with the OPTIX_ROOT_DIR environment variable at runtime. Based on patch by Sebastian Parborg. Ref D15792
This commit is contained in:
@@ -435,10 +435,16 @@ if(NOT APPLE)
|
|||||||
option(WITH_CYCLES_CUBIN_COMPILER "Build cubins with nvrtc based compiler instead of nvcc" OFF)
|
option(WITH_CYCLES_CUBIN_COMPILER "Build cubins with nvrtc based compiler instead of nvcc" OFF)
|
||||||
option(WITH_CYCLES_CUDA_BUILD_SERIAL "Build cubins one after another (useful on machines with limited RAM)" OFF)
|
option(WITH_CYCLES_CUDA_BUILD_SERIAL "Build cubins one after another (useful on machines with limited RAM)" OFF)
|
||||||
option(WITH_CUDA_DYNLOAD "Dynamically load CUDA libraries at runtime (for developers, makes cuda-gdb work)" ON)
|
option(WITH_CUDA_DYNLOAD "Dynamically load CUDA libraries at runtime (for developers, makes cuda-gdb work)" ON)
|
||||||
|
|
||||||
|
set(OPTIX_ROOT_DIR "" CACHE PATH "Path to the OptiX SDK root directory, for building Cycles OptiX kernels.")
|
||||||
|
set(CYCLES_RUNTIME_OPTIX_ROOT_DIR "" CACHE PATH "Path to the OptiX SDK root directory. When set, this path will be used at runtime to compile OptiX kernels.")
|
||||||
|
|
||||||
mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH)
|
mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH)
|
||||||
mark_as_advanced(WITH_CYCLES_CUBIN_COMPILER)
|
mark_as_advanced(WITH_CYCLES_CUBIN_COMPILER)
|
||||||
mark_as_advanced(WITH_CYCLES_CUDA_BUILD_SERIAL)
|
mark_as_advanced(WITH_CYCLES_CUDA_BUILD_SERIAL)
|
||||||
mark_as_advanced(WITH_CUDA_DYNLOAD)
|
mark_as_advanced(WITH_CUDA_DYNLOAD)
|
||||||
|
mark_as_advanced(OPTIX_ROOT_DIR)
|
||||||
|
mark_as_advanced(CYCLES_RUNTIME_OPTIX_ROOT_DIR)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# AMD HIP
|
# AMD HIP
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ if(WITH_CYCLES_DEVICE_OPTIX OR WITH_CYCLES_DEVICE_CUDA)
|
|||||||
)
|
)
|
||||||
add_definitions(-DCYCLES_CUDA_NVCC_EXECUTABLE="${CUDA_NVCC_EXECUTABLE}")
|
add_definitions(-DCYCLES_CUDA_NVCC_EXECUTABLE="${CUDA_NVCC_EXECUTABLE}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_definitions(-DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${CYCLES_RUNTIME_OPTIX_ROOT_DIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WITH_CYCLES_DEVICE_HIP AND WITH_HIP_DYNLOAD)
|
if(WITH_CYCLES_DEVICE_HIP AND WITH_HIP_DYNLOAD)
|
||||||
|
|||||||
@@ -342,15 +342,29 @@ BVHLayoutMask OptiXDevice::get_bvh_layout_mask() const
|
|||||||
return BVH_LAYOUT_OPTIX;
|
return BVH_LAYOUT_OPTIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static string get_optix_include_dir()
|
||||||
|
{
|
||||||
|
const char *env_dir = getenv("OPTIX_ROOT_DIR");
|
||||||
|
const char *default_dir = CYCLES_RUNTIME_OPTIX_ROOT_DIR;
|
||||||
|
|
||||||
|
if (env_dir && env_dir[0]) {
|
||||||
|
const string env_include_dir = path_join(env_dir, "include");
|
||||||
|
return env_include_dir;
|
||||||
|
}
|
||||||
|
else if (default_dir[0]) {
|
||||||
|
const string default_include_dir = path_join(default_dir, "include");
|
||||||
|
return default_include_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string();
|
||||||
|
}
|
||||||
|
|
||||||
string OptiXDevice::compile_kernel_get_common_cflags(const uint kernel_features)
|
string OptiXDevice::compile_kernel_get_common_cflags(const uint kernel_features)
|
||||||
{
|
{
|
||||||
string common_cflags = CUDADevice::compile_kernel_get_common_cflags(kernel_features);
|
string common_cflags = CUDADevice::compile_kernel_get_common_cflags(kernel_features);
|
||||||
|
|
||||||
/* Add OptiX SDK include directory to include paths. */
|
/* Add OptiX SDK include directory to include paths. */
|
||||||
const char *optix_sdk_path = getenv("OPTIX_ROOT_DIR");
|
common_cflags += string_printf(" -I\"%s/include\"", get_optix_include_dir().c_str());
|
||||||
if (optix_sdk_path) {
|
|
||||||
common_cflags += string_printf(" -I\"%s/include\"", optix_sdk_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Specialization for shader raytracing. */
|
/* Specialization for shader raytracing. */
|
||||||
if (kernel_features & KERNEL_FEATURE_NODE_RAYTRACE) {
|
if (kernel_features & KERNEL_FEATURE_NODE_RAYTRACE) {
|
||||||
@@ -460,10 +474,19 @@ bool OptiXDevice::load_kernels(const uint kernel_features)
|
|||||||
"lib/kernel_optix_shader_raytrace.ptx" :
|
"lib/kernel_optix_shader_raytrace.ptx" :
|
||||||
"lib/kernel_optix.ptx");
|
"lib/kernel_optix.ptx");
|
||||||
if (use_adaptive_compilation() || path_file_size(ptx_filename) == -1) {
|
if (use_adaptive_compilation() || path_file_size(ptx_filename) == -1) {
|
||||||
if (!getenv("OPTIX_ROOT_DIR")) {
|
std::string optix_include_dir = get_optix_include_dir();
|
||||||
|
if (optix_include_dir.empty()) {
|
||||||
set_error(
|
set_error(
|
||||||
"Missing OPTIX_ROOT_DIR environment variable (which must be set with the path to "
|
"Unable to compile OptiX kernels at runtime. Set OPTIX_ROOT_DIR environment variable "
|
||||||
"the Optix SDK to be able to compile Optix kernels on demand).");
|
"to a directory containing the OptiX SDK.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!path_is_directory(optix_include_dir)) {
|
||||||
|
set_error(string_printf(
|
||||||
|
"OptiX headers not found at %s, unable to compile OptiX kernels at runtime. Install "
|
||||||
|
"OptiX SDK in the specified location, or set OPTIX_ROOT_DIR environment variable to a "
|
||||||
|
"directory containing the OptiX SDK.",
|
||||||
|
optix_include_dir.c_str()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ptx_filename = compile_kernel(
|
ptx_filename = compile_kernel(
|
||||||
|
|||||||
Reference in New Issue
Block a user