34 const int num_samples,
35 bool allow_inplace_modification)
38 if (!denoiser_device) {
49 bool local_buffer_used =
false;
53 local_buffer_used =
false;
57 VLOG_WORK <<
"Creating temporary buffer on denoiser device.";
64 local_buffer_used =
true;
68 local_render_buffers.
reset(buffer_params);
75 sizeof(
float) * local_render_buffers.
buffer.
size());
85 if (local_buffer_used) {
89 render_buffers, buffer_params, &local_render_buffers, local_render_buffers.
params);
94 return denoise_result;
106 LOG(ERROR) <<
"Error preprocessing guiding passes.";
123 LOG(ERROR) <<
"GPU denoiser creation has failed.";
128 LOG(ERROR) <<
"GPU denoiser configuration has failed.";
137 const BufferParams &buffer_params = context.buffer_params;
142 &context.guiding_params.pass_stride,
143 &context.guiding_params.pass_albedo,
144 &context.guiding_params.pass_normal,
145 &context.guiding_params.pass_flow,
146 &context.render_buffers->buffer.device_pointer,
150 &context.pass_sample_count,
151 &context.pass_denoising_albedo,
152 &context.pass_denoising_normal,
153 &context.pass_motion,
156 &buffer_params.
width,
158 &context.num_samples);
172 num_input_passes += 1;
173 use_pass_albedo = true;
174 pass_denoising_albedo = buffer_params.get_pass_offset(PASS_DENOISING_ALBEDO);
175 if (denoise_params.use_pass_normal) {
176 num_input_passes += 1;
177 use_pass_normal = true;
178 pass_denoising_normal = buffer_params.get_pass_offset(PASS_DENOISING_NORMAL);
182 if (denoise_params.temporally_stable) {
183 prev_output.device_pointer = render_buffers->buffer.device_pointer;
185 prev_output.offset = buffer_params.get_pass_offset(PASS_DENOISING_PREVIOUS);
187 prev_output.stride = buffer_params.stride;
188 prev_output.pass_stride = buffer_params.pass_stride;
190 num_input_passes += 1;
191 use_pass_motion = true;
192 pass_motion = buffer_params.get_pass_offset(PASS_MOTION);
195 use_guiding_passes = (num_input_passes - 1) > 0;
197 if (use_guiding_passes) {
198 if (task.allow_inplace_modification) {
199 guiding_params.device_pointer = render_buffers->buffer.device_pointer;
201 guiding_params.pass_albedo = pass_denoising_albedo;
202 guiding_params.pass_normal = pass_denoising_normal;
203 guiding_params.pass_flow = pass_motion;
205 guiding_params.stride = buffer_params.stride;
206 guiding_params.pass_stride = buffer_params.pass_stride;
209 guiding_params.pass_stride = 0;
210 if (use_pass_albedo) {
211 guiding_params.pass_albedo = guiding_params.pass_stride;
212 guiding_params.pass_stride += 3;
214 if (use_pass_normal) {
215 guiding_params.pass_normal = guiding_params.pass_stride;
216 guiding_params.pass_stride += 3;
218 if (use_pass_motion) {
219 guiding_params.pass_flow = guiding_params.pass_stride;
220 guiding_params.pass_stride += 2;
223 guiding_params.stride = buffer_params.width;
225 guiding_buffer.alloc_to_device(buffer_params.width * buffer_params.height *
226 guiding_params.pass_stride);
227 guiding_params.device_pointer = guiding_buffer.device_pointer;
237 const BufferParams &buffer_params = context.buffer_params;
244 &buffer_params.
width,
249 &context.num_samples,
252 &context.pass_sample_count,
268 const BufferParams &buffer_params = context.buffer_params;
275 &buffer_params.
width,
287 const BufferParams &buffer_params = context.buffer_params;
292 &context.guiding_params.pass_stride,
293 &context.guiding_params.pass_albedo,
294 &buffer_params.
width,
320 destination.
d_pixels = context.render_buffers->buffer.device_pointer;
323 destination.
pixel_stride = context.buffer_params.pass_stride;
336 const BufferParams &buffer_params = context.buffer_params;
349 if (context.albedo_replaced_with_fake) {
350 LOG(ERROR) <<
"Pass which requires albedo is denoised after fake albedo has been set.";
354 else if (context.use_guiding_passes && !context.albedo_replaced_with_fake) {
355 context.albedo_replaced_with_fake =
true;
357 LOG(ERROR) <<
"Error replacing real albedo with the fake one.";
365 LOG(ERROR) <<
"Error converting denoising passes to RGB buffer.";
370 LOG(ERROR) <<
"Error running denoiser.";
378 LOG(ERROR) <<
"Error copying denoiser result to the denoised pass.";
void render_buffers_host_copy_denoised(RenderBuffers *dst, const BufferParams &dst_params, const RenderBuffers *src, const BufferParams &src_params, const size_t src_offset)
DenoiseContext(Device *device, const DenoiseTask &task)
const BufferParams & buffer_params
const DenoiseParams & denoise_params
device_only_memory< float > guiding_buffer
RenderBuffers * render_buffers
bool use_denoising_albedo
BufferParams buffer_params
RenderBuffers * render_buffers
bool allow_inplace_modification
bool denoise_filter_guiding_set_fake_albedo(const DenoiseContext &context)
virtual bool denoise_run(const DenoiseContext &context, const DenoisePass &pass)=0
DenoiserGPU(Device *denoiser_device, const DenoiseParams ¶ms)
virtual bool denoise_ensure(DenoiseContext &context)
bool denoise_filter_color_postprocess(const DenoiseContext &context, const DenoisePass &pass)
bool denoise_filter_color_preprocess(const DenoiseContext &context, const DenoisePass &pass)
bool denoise_filter_guiding_preprocess(const DenoiseContext &context)
virtual bool denoise_create_if_needed(DenoiseContext &context)=0
bool denoise_buffer(const BufferParams &buffer_params, RenderBuffers *render_buffers, const int num_samples, bool allow_inplace_modification) override
unique_ptr< DeviceQueue > denoiser_queue_
void denoise_pass(DenoiseContext &context, PassType pass_type)
void denoise_color_read(const DenoiseContext &context, const DenoisePass &pass)
virtual bool denoise_configure_if_needed(DenoiseContext &context)=0
Denoiser(Device *denoiser_device, const DenoiseParams ¶ms)
Device * get_denoiser_device() const
Device * denoiser_device_
virtual unique_ptr< DeviceQueue > gpu_queue_create()
bool use_approximate_shadow_catcher
bool use_approximate_shadow_catcher_background
bool get_render_tile_pixels(const RenderBuffers *render_buffers, const Destination &destination) const
device_vector< float > buffer
void reset(const BufferParams ¶ms)
#define CCL_NAMESPACE_END
ccl_gpu_kernel_postfix const ccl_global int ccl_global float const int work_size
@ PASS_SHADOW_CATCHER_MATTE
@ DEVICE_KERNEL_FILTER_COLOR_PREPROCESS
@ DEVICE_KERNEL_FILTER_GUIDING_SET_FAKE_ALBEDO
@ DEVICE_KERNEL_FILTER_COLOR_POSTPROCESS
@ DEVICE_KERNEL_FILTER_GUIDING_PREPROCESS
#define DCHECK(expression)
CCL_NAMESPACE_BEGIN const char * pass_type_as_string(const PassType type)