Blender V4.3
path_trace_work.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "device/device.h"
6
11#include "scene/film.h"
12#include "scene/scene.h"
13#include "session/buffers.h"
14
15#include "kernel/types.h"
16
18
19unique_ptr<PathTraceWork> PathTraceWork::create(Device *device,
20 Film *film,
21 DeviceScene *device_scene,
22 bool *cancel_requested_flag)
23{
24 if (device->info.type == DEVICE_CPU) {
25 return make_unique<PathTraceWorkCPU>(device, film, device_scene, cancel_requested_flag);
26 }
27 if (device->info.type == DEVICE_DUMMY) {
28 /* Dummy devices can't perform any work. */
29 return nullptr;
30 }
31
32 return make_unique<PathTraceWorkGPU>(device, film, device_scene, cancel_requested_flag);
33}
34
36 Film *film,
37 DeviceScene *device_scene,
38 bool *cancel_requested_flag)
39 : device_(device),
40 film_(film),
41 device_scene_(device_scene),
42 buffers_(make_unique<RenderBuffers>(device)),
43 effective_buffer_params_(buffers_->params),
44 cancel_requested_flag_(cancel_requested_flag)
45{
46}
47
49
54
56 const BufferParams &effective_big_tile_params,
57 const BufferParams &effective_buffer_params)
58{
59 effective_full_params_ = effective_full_params;
60 effective_big_tile_params_ = effective_big_tile_params;
61 effective_buffer_params_ = effective_buffer_params;
62}
63
65{
66 /* Assume if there are multiple works working on the same big tile none of the works gets the
67 * entire big tile to work on. */
72}
73
75{
77
81 const int64_t row_stride = width * pass_stride;
82 const int64_t data_size = row_stride * height * sizeof(float);
83
85 const int64_t offset_in_floats = offset_y * row_stride;
86
87 const float *src = buffers_->buffer.data();
88 float *dst = render_buffers->buffer.data() + offset_in_floats;
89
90 memcpy(dst, src, data_size);
91}
92
94{
98 const int64_t row_stride = width * pass_stride;
99 const int64_t data_size = row_stride * height * sizeof(float);
100
102 const int64_t offset_in_floats = offset_y * row_stride;
103
104 const float *src = render_buffers->buffer.data() + offset_in_floats;
105 float *dst = buffers_->buffer.data();
106
107 memcpy(dst, src, data_size);
108
110}
111
123
125 const PassAccessor::Destination &destination)
126{
129 const int width = effective_buffer_params_.width;
130
131 PassAccessor::Destination slice_destination = destination;
132 slice_destination.offset += offset_y * width;
133
134 return pass_accessor.get_render_tile_pixels(buffers_.get(), slice_destination);
135}
136
138 const PassAccessor::Source &source)
139{
141 const int width = effective_buffer_params_.width;
142
143 PassAccessor::Source slice_source = source;
144 slice_source.offset += offset_y * width;
145
146 return pass_accessor.set_render_tile_pixels(buffers_.get(), slice_source);
147}
148
150{
151 const KernelFilm &kfilm = device_scene_->data.film;
152 const KernelBackground &kbackground = device_scene_->data.background;
153
154 const BufferParams &params = buffers_->params;
155
156 const BufferPass *display_pass = params.get_actual_display_pass(film_->get_display_pass());
157 if (display_pass == nullptr) {
158 /* Happens when interactive session changes display pass but render
159 * buffer does not contain it yet. */
161 }
162
163 PassAccessor::PassAccessInfo pass_access_info;
164 pass_access_info.type = display_pass->type;
165 pass_access_info.offset = PASS_UNUSED;
166
167 if (pass_mode == PassMode::DENOISED) {
168 pass_access_info.mode = PassMode::DENOISED;
169 pass_access_info.offset = params.get_pass_offset(pass_access_info.type, PassMode::DENOISED);
170 }
171
172 if (pass_access_info.offset == PASS_UNUSED) {
173 pass_access_info.mode = PassMode::NOISY;
174 pass_access_info.offset = params.get_pass_offset(pass_access_info.type);
175 }
176
177 pass_access_info.use_approximate_shadow_catcher = kfilm.use_approximate_shadow_catcher;
179 kfilm.use_approximate_shadow_catcher && !kbackground.transparent;
180
181 pass_access_info.show_active_pixels = film_->get_show_active_pixels();
182
183 return pass_access_info;
184}
185
187 const PathTraceDisplay *display) const
188{
189 PassAccessor::Destination destination(film_->get_display_pass());
190
191 const int2 display_texture_size = display->get_texture_size();
196
197 destination.offset = texture_y * display_texture_size.x + texture_x;
198 destination.stride = display_texture_size.x;
199
200 return destination;
201}
202
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:307
int pass_stride
Definition buffers.h:94
int window_y
Definition buffers.h:80
NODE_DECLARE int width
Definition buffers.h:72
int window_x
Definition buffers.h:79
NODE_DECLARE PassType type
Definition buffers.h:30
DeviceType type
KernelData data
Definition devicescene.h:95
DeviceInfo info
Definition film.h:30
bool set_render_tile_pixels(RenderBuffers *render_buffers, const Source &source)
bool get_render_tile_pixels(const RenderBuffers *render_buffers, const Destination &destination) const
void copy_from_denoised_render_buffers(const RenderBuffers *render_buffers)
RenderBuffers * get_render_buffers()
unique_ptr< RenderBuffers > buffers_
BufferParams effective_full_params_
virtual bool copy_render_buffers_from_device()=0
PassAccessor::PassAccessInfo get_display_pass_access_info(PassMode pass_mode) const
BufferParams effective_big_tile_params_
bool get_render_tile_pixels(const PassAccessor &pass_accessor, const PassAccessor::Destination &destination)
PassAccessor::Destination get_display_destination_template(const PathTraceDisplay *display) const
virtual bool copy_render_buffers_to_device()=0
bool has_multiple_works() const
void copy_to_render_buffers(RenderBuffers *render_buffers)
void set_effective_buffer_params(const BufferParams &effective_full_params, const BufferParams &effective_big_tile_params, const BufferParams &effective_buffer_params)
void copy_from_render_buffers(const RenderBuffers *render_buffers)
BufferParams effective_buffer_params_
DeviceScene * device_scene_
static unique_ptr< PathTraceWork > create(Device *device, Film *film, DeviceScene *device_scene, bool *cancel_requested_flag)
PathTraceWork(Device *device, Film *film, DeviceScene *device_scene, bool *cancel_requested_flag)
virtual ~PathTraceWork()
bool set_render_tile_pixels(PassAccessor &pass_accessor, const PassAccessor::Source &source)
device_vector< float > buffer
Definition buffers.h:160
#define CCL_NAMESPACE_END
@ DEVICE_DUMMY
@ DEVICE_CPU
draw_view in_light_buf[] float
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define PASS_UNUSED
PassMode
Definition pass.h:20
__int64 int64_t
Definition stdint.h:89
int x
Definition types_int2.h:15