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
53 lines
1.8 KiB
C++
53 lines
1.8 KiB
C++
/* SPDX-License-Identifier: Apache-2.0
|
|
* Copyright 2011-2022 Blender Foundation */
|
|
|
|
#pragma once
|
|
|
|
#include "integrator/denoiser.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
/* Implementation of Denoiser which uses a device-specific denoising implementation, running on a
|
|
* GPU device queue. It makes sure the to-be-denoised buffer is available on the denoising device
|
|
* and invokes denoising kernels via the device queue API. */
|
|
class DenoiserGPU : public Denoiser {
|
|
public:
|
|
DenoiserGPU(Device *path_trace_device, const DenoiseParams ¶ms);
|
|
~DenoiserGPU();
|
|
|
|
virtual bool denoise_buffer(const BufferParams &buffer_params,
|
|
RenderBuffers *render_buffers,
|
|
const int num_samples,
|
|
bool allow_inplace_modification) override;
|
|
|
|
protected:
|
|
/* 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 DenoiseTask {
|
|
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;
|
|
};
|
|
|
|
/* Returns true if task is fully handled. */
|
|
virtual bool denoise_buffer(const DenoiseTask & /*task*/) = 0;
|
|
|
|
virtual Device *ensure_denoiser_device(Progress *progress) override;
|
|
|
|
unique_ptr<DeviceQueue> denoiser_queue_;
|
|
};
|
|
|
|
CCL_NAMESPACE_END
|