Blender  V3.3
path_trace_work.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #include "device/device.h"
5 
10 #include "scene/film.h"
11 #include "scene/scene.h"
12 #include "session/buffers.h"
13 
14 #include "kernel/types.h"
15 
17 
18 unique_ptr<PathTraceWork> PathTraceWork::create(Device *device,
19  Film *film,
20  DeviceScene *device_scene,
21  bool *cancel_requested_flag)
22 {
23  if (device->info.type == DEVICE_CPU) {
24  return make_unique<PathTraceWorkCPU>(device, film, device_scene, cancel_requested_flag);
25  }
26  if (device->info.type == DEVICE_DUMMY) {
27  /* Dummy devices can't perform any work. */
28  return nullptr;
29  }
30 
31  return make_unique<PathTraceWorkGPU>(device, film, device_scene, cancel_requested_flag);
32 }
33 
35  Film *film,
36  DeviceScene *device_scene,
37  bool *cancel_requested_flag)
38  : device_(device),
39  film_(film),
40  device_scene_(device_scene),
41  buffers_(make_unique<RenderBuffers>(device)),
42  effective_buffer_params_(buffers_->params),
43  cancel_requested_flag_(cancel_requested_flag)
44 {
45 }
46 
48 {
49 }
50 
52 {
53  return buffers_.get();
54 }
55 
56 void PathTraceWork::set_effective_buffer_params(const BufferParams &effective_full_params,
57  const BufferParams &effective_big_tile_params,
58  const BufferParams &effective_buffer_params)
59 {
60  effective_full_params_ = effective_full_params;
61  effective_big_tile_params_ = effective_big_tile_params;
62  effective_buffer_params_ = effective_buffer_params;
63 }
64 
66 {
67  /* Assume if there are multiple works working on the same big tile none of the works gets the
68  * entire big tile to work on. */
73 }
74 
76 {
78 
82  const int64_t row_stride = width * pass_stride;
83  const int64_t data_size = row_stride * height * sizeof(float);
84 
86  const int64_t offset_in_floats = offset_y * row_stride;
87 
88  const float *src = buffers_->buffer.data();
89  float *dst = render_buffers->buffer.data() + offset_in_floats;
90 
91  memcpy(dst, src, data_size);
92 }
93 
95 {
99  const int64_t row_stride = width * pass_stride;
100  const int64_t data_size = row_stride * height * sizeof(float);
101 
103  const int64_t offset_in_floats = offset_y * row_stride;
104 
105  const float *src = render_buffers->buffer.data() + offset_in_floats;
106  float *dst = buffers_->buffer.data();
107 
108  memcpy(dst, src, data_size);
109 
111 }
112 
114 {
117  const int64_t offset = offset_y * width;
118 
121 
123 }
124 
126  const PassAccessor::Destination &destination)
127 {
131 
132  PassAccessor::Destination slice_destination = destination;
133  slice_destination.offset += offset_y * width;
134 
135  return pass_accessor.get_render_tile_pixels(buffers_.get(), slice_destination);
136 }
137 
139  const PassAccessor::Source &source)
140 {
143 
144  PassAccessor::Source slice_source = source;
145  slice_source.offset += offset_y * width;
146 
147  return pass_accessor.set_render_tile_pixels(buffers_.get(), slice_source);
148 }
149 
151 {
152  const KernelFilm &kfilm = device_scene_->data.film;
153  const KernelBackground &kbackground = device_scene_->data.background;
154 
155  const BufferParams &params = buffers_->params;
156 
157  const BufferPass *display_pass = params.get_actual_display_pass(film_->get_display_pass());
158 
159  PassAccessor::PassAccessInfo pass_access_info;
160  pass_access_info.type = display_pass->type;
161  pass_access_info.offset = PASS_UNUSED;
162 
163  if (pass_mode == PassMode::DENOISED) {
164  pass_access_info.mode = PassMode::DENOISED;
165  pass_access_info.offset = params.get_pass_offset(pass_access_info.type, PassMode::DENOISED);
166  }
167 
168  if (pass_access_info.offset == PASS_UNUSED) {
169  pass_access_info.mode = PassMode::NOISY;
170  pass_access_info.offset = params.get_pass_offset(pass_access_info.type);
171  }
172 
173  pass_access_info.use_approximate_shadow_catcher = kfilm.use_approximate_shadow_catcher;
175  kfilm.use_approximate_shadow_catcher && !kbackground.transparent;
176 
177  pass_access_info.show_active_pixels = film_->get_show_active_pixels();
178 
179  return pass_access_info;
180 }
181 
183  const PathTraceDisplay *display) const
184 {
185  PassAccessor::Destination destination(film_->get_display_pass());
186 
187  const int2 display_texture_size = display->get_texture_size();
192 
193  destination.offset = texture_y * display_texture_size.x + texture_x;
194  destination.stride = display_texture_size.x;
195 
196  return destination;
197 }
198 
typedef float(TangentPoint)[2]
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
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
int pass_stride
Definition: buffers.h:93
int full_x
Definition: buffers.h:84
int height
Definition: buffers.h:72
int window_y
Definition: buffers.h:79
NODE_DECLARE int width
Definition: buffers.h:71
int window_x
Definition: buffers.h:78
int full_y
Definition: buffers.h:85
NODE_DECLARE PassType type
Definition: buffers.h:29
DeviceType type
Definition: device/device.h:62
KernelData data
Definition: scene.h:130
DeviceInfo info
Definition: film.h:29
bool set_render_tile_pixels(RenderBuffers *render_buffers, const Source &source)
bool get_render_tile_pixels(const RenderBuffers *render_buffers, const Destination &destination) const
int2 get_texture_size() 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:159
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
@ DEVICE_DUMMY
Definition: device/device.h:45
@ DEVICE_CPU
Definition: device/device.h:38
SyclQueue void void * src
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
ccl_gpu_kernel_postfix ccl_global float int int int int int int int pass_stride
#define PASS_UNUSED
Definition: kernel/types.h:44
PassMode
Definition: pass.h:19
__int64 int64_t
Definition: stdint.h:89
int x
Definition: types_int2.h:15