Commit: 956f318fd6d580d298600582c605c33eb4728df5 Author: Brecht Van Lommel Date: Fri Jul 9 15:29:53 2021 +0200 Branches: cycles-x https://developer.blender.org/rB956f318fd6d580d298600582c605c33eb4728df5
Cycles X: make OptiX 7.3 the minimum required SDK version This ensure the new faster builtin curve intersection is used, and lets us simplify the code a bit. Differential Revision: https://developer.blender.org/D11866 =================================================================== M build_files/cmake/Modules/FindOptiX.cmake M build_files/config/pipeline_config.json M intern/cycles/CMakeLists.txt M intern/cycles/device/optix/device_impl.cpp M intern/cycles/device/optix/device_impl.h M intern/cycles/kernel/device/optix/kernel.cu =================================================================== diff --git a/build_files/cmake/Modules/FindOptiX.cmake b/build_files/cmake/Modules/FindOptiX.cmake index cfcdd9cd23b..67106740f57 100644 --- a/build_files/cmake/Modules/FindOptiX.cmake +++ b/build_files/cmake/Modules/FindOptiX.cmake @@ -33,11 +33,23 @@ FIND_PATH(OPTIX_INCLUDE_DIR include ) +IF(EXISTS "${OPTIX_INCLUDE_DIR}/optix.h") + FILE(STRINGS "${OPTIX_INCLUDE_DIR}/optix.h" _optix_version REGEX "^#define OPTIX_VERSION[ \t].*$") + STRING(REGEX MATCHALL "[0-9]+" _optix_version ${_optix_version}) + + MATH(EXPR _optix_version_major "${_optix_version} / 10000") + MATH(EXPR _optix_version_minor "(${_optix_version} % 10000) / 100") + MATH(EXPR _optix_version_patch "${_optix_version} % 100") + + SET(OPTIX_VERSION "${_optix_version_major}.${_optix_version_minor}.${_optix_version_patch}") +ENDIF() + # handle the QUIETLY and REQUIRED arguments and set OPTIX_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(OptiX DEFAULT_MSG - OPTIX_INCLUDE_DIR) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(OptiX + REQUIRED_VARS OPTIX_INCLUDE_DIR + VERSION_VAR OPTIX_VERSION) IF(OPTIX_FOUND) SET(OPTIX_INCLUDE_DIRS ${OPTIX_INCLUDE_DIR}) @@ -45,6 +57,7 @@ ENDIF() MARK_AS_ADVANCED( OPTIX_INCLUDE_DIR + OPTIX_VERSION ) UNSET(_optix_SEARCH_DIRS) diff --git a/build_files/config/pipeline_config.json b/build_files/config/pipeline_config.json index c9a5e25eaaf..a353d35bd6c 100644 --- a/build_files/config/pipeline_config.json +++ b/build_files/config/pipeline_config.json @@ -33,7 +33,7 @@ { "optix": { - "version": "7.1.0" + "version": "7.3.0" }, "cuda10": { diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 2994b623ce5..6d10c2be7d3 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -247,7 +247,7 @@ if(WITH_CYCLES_OSL) endif() if(WITH_CYCLES_DEVICE_OPTIX) - find_package(OptiX) + find_package(OptiX 7.3.0) if(OPTIX_FOUND) add_definitions(-DWITH_OPTIX) diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp index 5c9ffa0ece2..5b9d99dd463 100644 --- a/intern/cycles/device/optix/device_impl.cpp +++ b/intern/cycles/device/optix/device_impl.cpp @@ -89,11 +89,9 @@ OptiXDevice::OptiXDevice(const DeviceInfo &info, Stats &stats, Profiler &profile } }; # endif -# if OPTIX_ABI_VERSION >= 41 if (DebugFlags().optix.use_debug) { options.validationMode = OPTIX_DEVICE_CONTEXT_VALIDATION_MODE_ALL; } -# endif optix_assert(optixDeviceContextCreate(cuContext, &options, &context)); # ifdef WITH_CYCLES_LOGGING optix_assert(optixDeviceContextSetLogCallback( @@ -214,10 +212,8 @@ bool OptiXDevice::load_kernels(const uint kernel_features) module_options.debugLevel = OPTIX_COMPILE_DEBUG_LEVEL_LINEINFO; } -# if OPTIX_ABI_VERSION >= 41 module_options.boundValues = nullptr; module_options.numBoundValues = 0; -# endif OptixPipelineCompileOptions pipeline_options = {}; /* Default to no motion blur and two-level graph, since it is the fastest option. */ @@ -229,18 +225,14 @@ bool OptiXDevice::load_kernels(const uint kernel_features) pipeline_options.exceptionFlags = OPTIX_EXCEPTION_FLAG_NONE; pipeline_options.pipelineLaunchParamsVariableName = "__params"; /* See globals.h */ -# if OPTIX_ABI_VERSION >= 36 pipeline_options.usesPrimitiveTypeFlags = OPTIX_PRIMITIVE_TYPE_FLAGS_TRIANGLE; if (kernel_features & KERNEL_FEATURE_HAIR) { -# if OPTIX_ABI_VERSION >= 47 if (kernel_features & KERNEL_FEATURE_HAIR_THICK) { pipeline_options.usesPrimitiveTypeFlags |= OPTIX_PRIMITIVE_TYPE_FLAGS_ROUND_CUBIC_BSPLINE; } else -# endif pipeline_options.usesPrimitiveTypeFlags |= OPTIX_PRIMITIVE_TYPE_FLAGS_CUSTOM; } -# endif /* Keep track of whether motion blur is enabled, so to enable/disable motion in BVH builds * This is necessary since objects may be reported to have motion if the Vector pass is @@ -325,23 +317,8 @@ bool OptiXDevice::load_kernels(const uint kernel_features) group_descs[PG_HITS].hitgroup.entryFunctionNameAH = "__anyhit__kernel_optix_shadow_all_hit"; if (kernel_features & KERNEL_FEATURE_HAIR) { - group_descs[PG_HITD].hitgroup.moduleIS = optix_module; - group_descs[PG_HITS].hitgroup.moduleIS = optix_module; - - /* Add curve intersection programs. */ - if (kernel_features & KERNEL_FEATURE_HAIR_THICK) { - /* Slower programs for thick hair since that also slows down ribbons. - * Ideally this should not be needed. */ - group_descs[PG_HITD].hitgroup.entryFunctionNameIS = "__intersection__curve_all"; - group_descs[PG_HITS].hitgroup.entryFunctionNameIS = "__intersection__curve_all"; - } - else { - group_descs[PG_HITD].hitgroup.entryFunctionNameIS = "__intersection__curve_ribbon"; - group_descs[PG_HITS].hitgroup.entryFunctionNameIS = "__intersection__curve_ribbon"; - } - -# if OPTIX_ABI_VERSION >= 47 if (kernel_features & KERNEL_FEATURE_HAIR_THICK) { + /* Built-in thick curve intersection. */ OptixBuiltinISOptions builtin_options = {}; builtin_options.builtinISModuleType = OPTIX_PRIMITIVE_TYPE_ROUND_CUBIC_BSPLINE; builtin_options.usesMotionBlur = false; @@ -366,7 +343,13 @@ bool OptiXDevice::load_kernels(const uint kernel_features) group_descs[PG_HITS_MOTION].hitgroup.moduleIS = builtin_modules[1]; } } -# endif + else { + /* Custom ribbon intersection. */ + group_descs[PG_HITD].hitgroup.moduleIS = optix_module; + group_descs[PG_HITS].hitgroup.moduleIS = optix_module; + group_descs[PG_HITD].hitgroup.entryFunctionNameIS = "__intersection__curve_ribbon"; + group_descs[PG_HITS].hitgroup.entryFunctionNameIS = "__intersection__curve_ribbon"; + } } if (kernel_features & (KERNEL_FEATURE_SUBSURFACE | KERNEL_FEATURE_NODE_RAYTRACE)) { @@ -414,12 +397,10 @@ bool OptiXDevice::load_kernels(const uint kernel_features) trace_css = std::max(trace_css, stack_size[PG_HITD].cssIS + stack_size[PG_HITD].cssAH); trace_css = std::max(trace_css, stack_size[PG_HITS].cssIS + stack_size[PG_HITS].cssAH); trace_css = std::max(trace_css, stack_size[PG_HITL].cssIS + stack_size[PG_HITL].cssAH); -# if OPTIX_ABI_VERSION >= 47 trace_css = std::max(trace_css, stack_size[PG_HITD_MOTION].cssIS + stack_size[PG_HITD_MOTION].cssAH); trace_css = std::max(trace_css, stack_size[PG_HITS_MOTION].cssIS + stack_size[PG_HITS_MOTION].cssAH); -# endif OptixPipelineLinkOptions link_options = {}; link_options.maxTraceDepth = 1; @@ -431,10 +412,6 @@ bool OptiXDevice::load_kernels(const uint kernel_features) link_options.debugLevel = OPTIX_COMPILE_DEBUG_LEVEL_LINEINFO; } -# if OPTIX_ABI_VERSION < 24 - link_options.overrideUsesMotionBlur = motion_blur; -# endif - if (kernel_features & KERNEL_FEATURE_NODE_RAYTRACE) { /* Create shader raytracing pipeline. */ vector<OptixProgramGroup> pipeline_groups; @@ -444,12 +421,10 @@ bool OptiXDevice::load_kernels(const uint kernel_features) pipeline_groups.push_back(groups[PG_HITD]); pipeline_groups.push_back(groups[PG_HITS]); pipeline_groups.push_back(groups[PG_HITL]); -# if OPTIX_ABI_VERSION >= 47 if (motion_blur) { pipeline_groups.push_back(groups[PG_HITD_MOTION]); pipeline_groups.push_back(groups[PG_HITS_MOTION]); } -# endif pipeline_groups.push_back(groups[PG_CALL_SVM_AO]); pipeline_groups.push_back(groups[PG_CALL_SVM_BEVEL]); @@ -484,12 +459,10 @@ bool OptiXDevice::load_kernels(const uint kernel_features) pipeline_groups.push_back(groups[PG_HITD]); pipeline_groups.push_back(groups[PG_HITS]); pipeline_groups.push_back(groups[PG_HITL]); -# if OPTIX_ABI_VERSION >= 47 if (motion_blur) { pipeline_groups.push_back(groups[PG_HITD_MOTION]); pipeline_groups.push_back(groups[PG_HITS_MOTION]); } -# endif optix_assert(optixPipelineCreate(context, &pipeline_options, @@ -859,32 +832,16 @@ bool OptiXDevice::denoise_create_if_needed(DenoiseContext &context) /* Create OptiX denoiser handle on demand when it is first used. */ OptixDenoiserOptions denoiser_options = {}; -# if OPTIX_ABI_VERSION >= 47 denoiser_options.guideAlbedo = context.use_pass_albedo; denoiser_options.guideNormal = context.use_pass_normal; const OptixResult result = optixDenoiserCreate( this->context, OPTIX_DENOISER_MODEL_KIND_HDR, &denoiser_options, &denoiser_.optix_denoiser); -# else - denoiser_options.inputKind = static_cast<OptixDenoiserInputKind>(OPTIX_DENOISER_INPUT_RGB + - (context.num_input_passes - 1)); -# if OPTIX_ABI_VERSION < 28 - denoiser_options.pixelFormat = OPTIX_PIXEL_FORMAT_FLOAT3; -# endif - - const OptixResult result = optixDenoiserCreate( - this->context, &denoiser_options, &denoiser_.optix_denoiser); -# endif if (result != OPTIX_SUCCESS) { set_error("Failed to create OptiX denoiser"); return false; } -# if OPTIX_ABI_VERSION < 47 - optix_assert( - optixDenoiserSetModel(denoiser_.optix_denoiser, OPTIX_DENOISER_MODEL_KIND_HDR, nullptr, 0)); -# endif - /* OptiX denoiser handle was created with the requested number of input passes. */ denoiser_.use_pass_albedo = context.use_pass_albedo; denoiser_.use_pass_normal = context.use_pass_normal; @@ -908,11 +865,7 @@ bool OptiXDevice::denoise_configure_if_needed(DenoiseContext &context) optix_assert(optixDenoiserComputeMemoryResources( denoiser_.optix_denoiser, buffer_params.width, buffer_params.height, &sizes)); -# if OPTIX_ABI_VERSION < 28 - denoiser_.scratch_size = sizes.recommendedScratchSizeInBytes; -# else denoiser_.scratch_size = sizes.withOverlapScratchSizeInBytes; -# endif denoiser_.scratch_offset = sizes.stateSizeInBytes; /* Allocate denoiser state if tile size has changed since last setup. */ @@ -999,7 +952,6 @@ bool OptiXDevice::denoise @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs