diff --git a/CMakeLists.txt b/CMakeLists.txt index 54e2626e30e..7b729921377 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -409,6 +409,8 @@ option(WITH_CYCLES_OSL "Build Cycles with OSL support" ${_init_CYCLES_OSL}) option(WITH_CYCLES_OPENSUBDIV "Build Cycles with OpenSubdiv support" ${_init_CYCLES_OPENSUBDIV}) option(WITH_CYCLES_CUDA_BINARIES "Build Cycles CUDA binaries" 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) +mark_as_advanced(WITH_CYCLES_CUDA_BUILD_SERIAL) set(CYCLES_CUDA_BINARIES_ARCH sm_30 sm_35 sm_37 sm_50 sm_52 sm_60 sm_61 CACHE STRING "CUDA architectures to build binaries for") mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH) unset(PLATFORM_DEFAULT) diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index c4cad17429d..118e18374a1 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -357,8 +357,14 @@ if(WITH_CYCLES_CUDA_BINARIES) ) set(cuda_cubins) - macro(CYCLES_CUDA_KERNEL_ADD arch name flags sources experimental) + macro(CYCLES_CUDA_KERNEL_ADD arch prev_arch name flags sources experimental) set(cuda_cubin ${name}_${arch}.cubin) + + set(kernel_sources ${sources}) + if(NOT ${prev_arch} STREQUAL "none") + set(kernel_sources ${kernel_sources} ${name}_${prev_arch}.cubin) + endif() + set(cuda_kernel_src "/kernels/cuda/${name}.cu") set(cuda_flags @@ -402,7 +408,7 @@ if(WITH_CYCLES_CUDA_BINARIES) ${cuda_flags} -v -cuda-toolkit-dir "${CUDA_TOOLKIT_ROOT_DIR}" - DEPENDS ${sources} cycles_cubin_cc) + DEPENDS ${kernel_sources} cycles_cubin_cc) else() add_custom_command( OUTPUT ${cuda_cubin} @@ -413,7 +419,7 @@ if(WITH_CYCLES_CUDA_BINARIES) ${CMAKE_CURRENT_SOURCE_DIR}${cuda_kernel_src} --ptxas-options="-v" ${cuda_flags} - DEPENDS ${sources}) + DEPENDS ${kernel_sources}) endif() delayed_install("${CMAKE_CURRENT_BINARY_DIR}" "${cuda_cubin}" ${CYCLES_INSTALL_PATH}/lib) list(APPEND cuda_cubins ${cuda_cubin}) @@ -421,18 +427,23 @@ if(WITH_CYCLES_CUDA_BINARIES) unset(cuda_debug_flags) endmacro() + set(prev_arch "none") foreach(arch ${CYCLES_CUDA_BINARIES_ARCH}) if(${arch} MATCHES "sm_2.") message(STATUS "CUDA binaries for ${arch} are no longer supported, skipped.") else() # Compile regular kernel - CYCLES_CUDA_KERNEL_ADD(${arch} filter "" "${cuda_filter_sources}" FALSE) - CYCLES_CUDA_KERNEL_ADD(${arch} kernel "" "${cuda_sources}" FALSE) - endif() + CYCLES_CUDA_KERNEL_ADD(${arch} ${prev_arch} filter "" "${cuda_filter_sources}" FALSE) + CYCLES_CUDA_KERNEL_ADD(${arch} ${prev_arch} kernel "" "${cuda_sources}" FALSE) - if(WITH_CYCLES_CUDA_SPLIT_KERNEL_BINARIES) - # Compile split kernel - CYCLES_CUDA_KERNEL_ADD(${arch} kernel_split "-D __SPLIT__" ${cuda_sources} FALSE) + if(WITH_CYCLES_CUDA_SPLIT_KERNEL_BINARIES) + # Compile split kernel + CYCLES_CUDA_KERNEL_ADD(${arch} ${prev_arch} kernel_split "-D __SPLIT__" "${cuda_sources}" FALSE) + endif() + + if(WITH_CYCLES_CUDA_BUILD_SERIAL) + set(prev_arch ${arch}) + endif() endif() endforeach() diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 04830eb1081..ca555a46da5 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -623,7 +623,7 @@ static bool calc_curve_deform(Object *par, float co[3], if (is_neg_axis) { index = axis - 3; if (cu->flag & CU_STRETCH) - fac = (-co[index] - cd->dmax[index]) / (cd->dmax[index] - cd->dmin[index]); + fac = -(co[index] - cd->dmax[index]) / (cd->dmax[index] - cd->dmin[index]); else fac = -(co[index] - cd->dmax[index]) / (par->runtime.curve_cache->path->totdist); }