Blender  V3.3
denoiser_device.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
5 
6 #include "device/denoise.h"
7 #include "device/device.h"
8 #include "device/memory.h"
9 #include "device/queue.h"
10 #include "session/buffers.h"
11 #include "util/log.h"
12 #include "util/progress.h"
13 
15 
17  : Denoiser(path_trace_device, params)
18 {
19 }
20 
22 {
23  /* Explicit implementation, to allow forward declaration of Device in the header. */
24 }
25 
26 bool DeviceDenoiser::denoise_buffer(const BufferParams &buffer_params,
27  RenderBuffers *render_buffers,
28  const int num_samples,
29  bool allow_inplace_modification)
30 {
31  Device *denoiser_device = get_denoiser_device();
32  if (!denoiser_device) {
33  return false;
34  }
35 
37  task.params = params_;
38  task.num_samples = num_samples;
39  task.buffer_params = buffer_params;
40  task.allow_inplace_modification = allow_inplace_modification;
41 
42  RenderBuffers local_render_buffers(denoiser_device);
43  bool local_buffer_used = false;
44 
45  if (denoiser_device == render_buffers->buffer.device) {
46  /* The device can access an existing buffer pointer. */
47  local_buffer_used = false;
48  task.render_buffers = render_buffers;
49  }
50  else {
51  VLOG_WORK << "Creating temporary buffer on denoiser device.";
52 
53  DeviceQueue *queue = denoiser_device->get_denoise_queue();
54 
55  /* Create buffer which is available by the device used by denoiser. */
56 
57  /* TODO(sergey): Optimize data transfers. For example, only copy denoising related passes,
58  * ignoring other light ad data passes. */
59 
60  local_buffer_used = true;
61 
62  render_buffers->copy_from_device();
63 
64  local_render_buffers.reset(buffer_params);
65 
66  /* NOTE: The local buffer is allocated for an exact size of the effective render size, while
67  * the input render buffer is allocated for the lowest resolution divider possible. So it is
68  * important to only copy actually needed part of the input buffer. */
69  memcpy(local_render_buffers.buffer.data(),
70  render_buffers->buffer.data(),
71  sizeof(float) * local_render_buffers.buffer.size());
72 
73  queue->copy_to_device(local_render_buffers.buffer);
74 
75  task.render_buffers = &local_render_buffers;
76  task.allow_inplace_modification = true;
77  }
78 
79  const bool denoise_result = denoiser_device->denoise_buffer(task);
80 
81  if (local_buffer_used) {
82  local_render_buffers.copy_from_device();
83 
85  render_buffers, buffer_params, &local_render_buffers, local_render_buffers.params);
86 
87  render_buffers->copy_to_device();
88  }
89 
90  return denoise_result;
91 }
92 
void render_buffers_host_copy_denoised(RenderBuffers *dst, const BufferParams &dst_params, const RenderBuffers *src, const BufferParams &src_params, const size_t src_offset)
Definition: buffers.cpp:306
DenoiseParams params_
Definition: denoiser.h:110
Device * get_denoiser_device() const
Definition: denoiser.cpp:67
DeviceDenoiser(Device *path_trace_device, const DenoiseParams &params)
virtual bool denoise_buffer(const BufferParams &buffer_params, RenderBuffers *render_buffers, const int num_samples, bool allow_inplace_modification) override
virtual DeviceQueue * get_denoise_queue()
virtual bool denoise_buffer(const DeviceDenoiseTask &)
device_vector< float > buffer
Definition: buffers.h:159
BufferParams params
Definition: buffers.h:156
bool copy_from_device()
Definition: buffers.cpp:289
void copy_to_device()
Definition: buffers.cpp:301
void reset(const BufferParams &params)
Definition: buffers.cpp:274
size_t size() const
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
SyclQueue * queue
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
ccl_gpu_kernel_postfix ccl_global float int int int int ccl_global const float int int int int int int int int int int int int num_samples
#define VLOG_WORK
Definition: log.h:80
struct blender::compositor::@179::@181 task