diff options
Diffstat (limited to 'intern/cycles/device/optix/device_impl.cpp')
-rw-r--r-- | intern/cycles/device/optix/device_impl.cpp | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp index 11c0d1bf8a0..6c64e7106d5 100644 --- a/intern/cycles/device/optix/device_impl.cpp +++ b/intern/cycles/device/optix/device_impl.cpp @@ -26,7 +26,6 @@ # include "util/task.h" # include "util/time.h" -# undef __KERNEL_CPU__ # define __KERNEL_OPTIX__ # include "kernel/device/optix/globals.h" @@ -40,6 +39,9 @@ CCL_NAMESPACE_BEGIN // The original code is Copyright NVIDIA Corporation, BSD-3-Clause. namespace { +# if OPTIX_ABI_VERSION >= 60 +using ::optixUtilDenoiserInvokeTiled; +# else static OptixResult optixUtilDenoiserSplitImage(const OptixImage2D &input, const OptixImage2D &output, unsigned int overlapWindowSizeInPixels, @@ -216,6 +218,7 @@ static OptixResult optixUtilDenoiserInvokeTiled(OptixDenoiser denoiser, } return OPTIX_SUCCESS; } +# endif # if OPTIX_ABI_VERSION >= 55 static void execute_optix_task(TaskPool &pool, OptixTask task, OptixResult &failure_reason) @@ -339,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\"", get_optix_include_dir().c_str()); /* Specialization for shader raytracing. */ if (kernel_features & KERNEL_FEATURE_NODE_RAYTRACE) { @@ -457,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( @@ -1390,7 +1416,7 @@ bool OptiXDevice::build_optix_bvh(BVHOptiX *bvh, options.operation = operation; if (use_fast_trace_bvh || /* The build flags have to match the ones used to query the built-in curve intersection - program (see optixBuiltinISModuleGet above) */ + * program (see optixBuiltinISModuleGet above) */ build_input.type == OPTIX_BUILD_INPUT_TYPE_CURVES) { VLOG_INFO << "Using fast to trace OptiX BVH"; options.buildFlags = OPTIX_BUILD_FLAG_PREFER_FAST_TRACE | OPTIX_BUILD_FLAG_ALLOW_COMPACTION; |