Commit: a859837cdea0c34268c870da25b038e3826aecc2 Author: Patrick Mours Date: Tue Nov 15 13:05:23 2022 +0100 Branches: master https://developer.blender.org/rBa859837cdea0c34268c870da25b038e3826aecc2
Cleanup: Move OptiX denoiser code from device into denoiser class Cycles already treats denoising fairly separate in its code, with a dedicated `Denoiser` base class used to describe denoising behavior. That class has been fully implemented for OIDN (`denoiser_oidn.cpp`), but for OptiX was mostly empty (`denoiser_optix.cpp`) and denoising was instead implemented in the OptiX device. That meant denoising code was split over various files and directories, making it a bit awkward to work with. This patch moves the OptiX denoising implementation into the existing `OptiXDenoiser` class, so that everything is in one place. There are no functional changes, code has been mostly moved as-is. To retain support for potential other denoiser implementations based on a GPU device in the future, the `DeviceDenoiser` base class was kept and slightly extended (and its file renamed to `denoiser_gpu.cpp` to follow similar naming rules as `path_trace_work_*.cpp`). Differential Revision: https://developer.blender.org/D16502 =================================================================== M intern/cycles/CMakeLists.txt M intern/cycles/device/CMakeLists.txt M intern/cycles/device/denoise.h M intern/cycles/device/device.h M intern/cycles/device/optix/device_impl.cpp M intern/cycles/device/optix/device_impl.h M intern/cycles/integrator/CMakeLists.txt M intern/cycles/integrator/denoiser.cpp D intern/cycles/integrator/denoiser_device.h R077 intern/cycles/integrator/denoiser_device.cpp intern/cycles/integrator/denoiser_gpu.cpp A intern/cycles/integrator/denoiser_gpu.h M intern/cycles/integrator/denoiser_optix.cpp M intern/cycles/integrator/denoiser_optix.h =================================================================== diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 329aa3990f6..c6590a07ee4 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -253,6 +253,33 @@ if(WITH_CYCLES_OSL) ) endif() +if(WITH_CYCLES_DEVICE_CUDA OR WITH_CYCLES_DEVICE_OPTIX) + add_definitions(-DWITH_CUDA) + + if(WITH_CUDA_DYNLOAD) + include_directories( + ../../extern/cuew/include + ) + add_definitions(-DWITH_CUDA_DYNLOAD) + else() + include_directories( + SYSTEM + ${CUDA_TOOLKIT_INCLUDE} + ) + endif() +endif() + +if(WITH_CYCLES_DEVICE_HIP) + add_definitions(-DWITH_HIP) + + if(WITH_HIP_DYNLOAD) + include_directories( + ../../extern/hipew/include + ) + add_definitions(-DWITH_HIP_DYNLOAD) + endif() +endif() + if(WITH_CYCLES_DEVICE_OPTIX) find_package(OptiX 7.3.0) @@ -261,12 +288,16 @@ if(WITH_CYCLES_DEVICE_OPTIX) include_directories( SYSTEM ${OPTIX_INCLUDE_DIR} - ) + ) else() set_and_warn_library_found("OptiX" OPTIX_FOUND WITH_CYCLES_DEVICE_OPTIX) endif() endif() +if(WITH_CYCLES_DEVICE_METAL) + add_definitions(-DWITH_METAL) +endif() + if (WITH_CYCLES_DEVICE_ONEAPI) add_definitions(-DWITH_ONEAPI) endif() diff --git a/intern/cycles/device/CMakeLists.txt b/intern/cycles/device/CMakeLists.txt index bfca3ab6aea..6808d8c04d7 100644 --- a/intern/cycles/device/CMakeLists.txt +++ b/intern/cycles/device/CMakeLists.txt @@ -8,28 +8,13 @@ set(INC set(INC_SYS ) if(WITH_CYCLES_DEVICE_OPTIX OR WITH_CYCLES_DEVICE_CUDA) - if(WITH_CUDA_DYNLOAD) - list(APPEND INC - ../../../extern/cuew/include - ) - add_definitions(-DWITH_CUDA_DYNLOAD) - else() - list(APPEND INC_SYS - ${CUDA_TOOLKIT_INCLUDE} - ) + if(NOT WITH_CUDA_DYNLOAD) 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) - list(APPEND INC - ../../../extern/hipew/include - ) - add_definitions(-DWITH_HIP_DYNLOAD) -endif() - set(SRC_BASE device.cpp denoise.cpp @@ -168,24 +153,15 @@ if(WITH_CYCLES_DEVICE_HIP AND WITH_HIP_DYNLOAD) ) endif() -if(WITH_CYCLES_DEVICE_CUDA) - add_definitions(-DWITH_CUDA) -endif() -if(WITH_CYCLES_DEVICE_HIP) - add_definitions(-DWITH_HIP) -endif() -if(WITH_CYCLES_DEVICE_OPTIX) - add_definitions(-DWITH_OPTIX) -endif() if(WITH_CYCLES_DEVICE_METAL) list(APPEND LIB ${METAL_LIBRARY} ) - add_definitions(-DWITH_METAL) list(APPEND SRC ${SRC_METAL} ) endif() + if (WITH_CYCLES_DEVICE_ONEAPI) if(WITH_CYCLES_ONEAPI_BINARIES) set(cycles_kernel_oneapi_lib_suffix "_aot") @@ -203,7 +179,6 @@ if (WITH_CYCLES_DEVICE_ONEAPI) else() list(APPEND LIB ${SYCL_LIBRARY}) endif() - add_definitions(-DWITH_ONEAPI) list(APPEND SRC ${SRC_ONEAPI} ) diff --git a/intern/cycles/device/denoise.h b/intern/cycles/device/denoise.h index 095ee3b89ae..48d6d5c11ed 100644 --- a/intern/cycles/device/denoise.h +++ b/intern/cycles/device/denoise.h @@ -78,24 +78,4 @@ class DenoiseParams : public Node { } }; -/* All the parameters needed to perform buffer denoising on a device. - * Is not really a task in its canonical terms (as in, is not an asynchronous running task). Is - * more like a wrapper for all the arguments and parameters needed to perform denoising. Is a - * single place where they are all listed, so that it's not required to modify all device methods - * when these parameters do change. */ -class DeviceDenoiseTask { - public: - DenoiseParams params; - - int num_samples; - - RenderBuffers *render_buffers; - BufferParams buffer_params; - - /* Allow to do in-place modification of the input passes (scaling them down i.e.). This will - * lower the memory footprint of the denoiser but will make input passes "invalid" (from path - * tracer) point of view. */ - bool allow_inplace_modification; -}; - CCL_NAMESPACE_END diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h index 06a2f5c7b01..11d693cb25b 100644 --- a/intern/cycles/device/device.h +++ b/intern/cycles/device/device.h @@ -233,21 +233,6 @@ class Device { return nullptr; } - /* Buffer denoising. */ - - /* Returns true if task is fully handled. */ - virtual bool denoise_buffer(const DeviceDenoiseTask & /*task*/) - { - LOG(ERROR) << "Request buffer denoising from a device which does not support it."; - return false; - } - - virtual DeviceQueue *get_denoise_queue() - { - LOG(ERROR) << "Request denoising queue from a device which does not support it."; - return nullptr; - } - /* Sub-devices */ /* Run given callback for every individual device which will be handling rendering. diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp index 02f34bf3bd0..f4d1969f3f3 100644 --- a/intern/cycles/device/optix/device_impl.cpp +++ b/intern/cycles/device/optix/device_impl.cpp @@ -1,16 +1,15 @@ /* SPDX-License-Identifier: Apache-2.0 - * Copyright 2019, NVIDIA Corporation. - * Copyright 2019-2022 Blender Foundation. */ + * Copyright 2019, NVIDIA Corporation + * Copyright 2019-2022 Blender Foundation */ #ifdef WITH_OPTIX # include "device/optix/device_impl.h" +# include "device/optix/queue.h" # include "bvh/bvh.h" # include "bvh/optix.h" -# include "integrator/pass_accessor_gpu.h" - # include "scene/hair.h" # include "scene/mesh.h" # include "scene/object.h" @@ -29,197 +28,8 @@ # define __KERNEL_OPTIX__ # include "kernel/device/optix/globals.h" -# include <optix_denoiser_tiling.h> - CCL_NAMESPACE_BEGIN -// A minimal copy of functionality `optix_denoiser_tiling.h` which allows to fix integer overflow -// issues without bumping SDK or driver requirement. -// -// 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, - unsigned int tileWidth, - unsigned int tileHeight, - std::vector<OptixUtilDenoiserImageTile> &tiles) -{ - if (tileWidth == 0 || tileHeight == 0) - return OPTIX_ERROR_INVALID_VALUE; - - unsigned int inPixelStride = optixUtilGetPixelStride(input); - unsigned int outPixelStride = optixUtilGetPixelStride(output); - - int inp_w = std::min(tileWidth + 2 * overlapWindowSizeInPixels, input.width); - int inp_h = std::min(tileHeight + 2 * overlapWindowSizeInPixels, input.height); - int inp_y = 0, copied_y = 0; - - do { - int inputOffsetY = inp_y == 0 ? 0 : - std::max((int)overlapWindowSizeInPixels, - inp_h - ((int)input.height - inp_y)); - int copy_y = inp_y == 0 ? std::min(input.height, tileHeight + overlapWindowSizeInPixels) : - std::min(tileHeight, input.height - copied_y); - - int inp_x = 0, copied_x = 0; - do { - int inputOffsetX = inp_x == 0 ? 0 : - std::max((int)overlapWindowSizeInPixels, - inp_w - ((int)input.width - inp_x)); - int copy_x = inp_x == 0 ? std::min(input.width, tileWidth + overlapWindowSizeInPixels) : - std::min(tileWidth, input.width - copied_x); - - OptixUtilDenoiserImageTile tile; - tile.input.data = input.data + (size_t)(inp_y - inputOffsetY) * input.rowStrideInBytes + - +(size_t)(inp_x - inputOffsetX) * inPixelStride; - tile.input.width = inp_w; - tile.input.height = inp_h; - tile.input.rowStrideInBytes = input.rowStrideInBytes; - tile.input.pixelStrideInBytes = input.pixelStrideInBytes; - tile.input.format = input.format; - - tile.output.data = output.data + (size_t)inp_y * output.rowStrideInBytes + - (size_t)inp_x * outPixelStride; - tile.output.width = copy_x; - tile.output.height = copy_y; - tile.output.rowStrideInBytes = output.rowStrideInBytes; - tile.output.pixelStrideInBytes = output.pixelStrideInBytes; - tile.output.format = output.format; - - tile.inputOffsetX = inputOffsetX; - tile.inputOffsetY = inputOffsetY; - tiles.push_back(tile); - - inp_x += inp_x == 0 ? tileWidth + overlapWindowSizeInPixels : tileWidth; - copied_x += copy_x; - } while (inp_x < static_cast<int>(input.width)); - - inp_y += inp_y == 0 ? tileHeight + overlapWindowSizeInPixels : tileHeight; - copied_y += copy_y; - } while (inp_y < static_cast<int>(input.height)); - - return OPTIX_SUCCESS; -} - -static OptixResult optixUtilDenoiserInvokeTiled(OptixDenoiser denoiser, - CUstream stream, - const OptixDenoiserParams *params, - CUdeviceptr denoiserState, - size_t denoiserStateSizeInBytes, - const OptixDenoiserGuideLayer *guideLayer, - const OptixDenoiserLayer *layers, - unsigned int numLayers, - CUdeviceptr scratch, - size_t scratchSizeInBytes, - unsigned int overlapWindowSizeInPixels, - unsigned int tileWidth, - unsigned int tileHeight) -{ - if (!guideLayer || !layers) - return OPTIX_ERROR_INVALID_VALUE; - - std::vector<std::vector<OptixUtilDenoiserImageTile>> tiles(numLayers); - std::vector<std::vector @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
