From https://developer.blender.org/rB74caf773619bbf6a0f95c598b66261a6bef392ee From: Brecht Van Lommel Date: Mon, 29 Aug 2022 19:12:15 +0200 Subject: [PATCH 001/539] 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 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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_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) + + 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(WITH_CYCLES_CUBIN_COMPILER) mark_as_advanced(WITH_CYCLES_CUDA_BUILD_SERIAL) mark_as_advanced(WITH_CUDA_DYNLOAD) + mark_as_advanced(OPTIX_ROOT_DIR) + mark_as_advanced(CYCLES_RUNTIME_OPTIX_ROOT_DIR) endif() # AMD HIP --- a/intern/cycles/device/CMakeLists.txt +++ b/intern/cycles/device/CMakeLists.txt @@ -19,6 +19,8 @@ if(WITH_CYCLES_DEVICE_OPTIX OR WITH_CYCLES_DEVICE_CUDA) ) add_definitions(-DCYCLES_CUDA_NVCC_EXECUTABLE="${CUDA_NVCC_EXECUTABLE}") endif() + + add_definitions(-DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${CYCLES_RUNTIME_OPTIX_ROOT_DIR}") endif() if(WITH_CYCLES_DEVICE_HIP AND WITH_HIP_DYNLOAD) --- a/intern/cycles/device/optix/device_impl.cpp +++ b/intern/cycles/device/optix/device_impl.cpp @@ -342,15 +342,29 @@ BVHLayoutMask OptiXDevice::get_bvh_layout_mask() const 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 common_cflags = CUDADevice::compile_kernel_get_common_cflags(kernel_features); /* Add OptiX SDK include directory to include paths. */ - const char *optix_sdk_path = getenv("OPTIX_ROOT_DIR"); - if (optix_sdk_path) { - common_cflags += string_printf(" -I\"%s/include\"", optix_sdk_path); - } + common_cflags += string_printf(" -I\"%s/include\"", get_optix_include_dir().c_str()); /* Specialization for shader raytracing. */ 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.ptx"); 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( - "Missing OPTIX_ROOT_DIR environment variable (which must be set with the path to " - "the Optix SDK to be able to compile Optix kernels on demand)."); + "Unable to compile OptiX kernels at runtime. Set OPTIX_ROOT_DIR environment variable " + "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; } ptx_filename = compile_kernel( -- 2.37.3