Blender V5.0
pass_accessor_cpu.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
8
9#include "session/buffers.h"
10
11#include "util/log.h"
12#include "util/tbb.h"
13
14#include "kernel/types.h"
15
17
18/* --------------------------------------------------------------------
19 * Kernel processing.
20 */
21
23 const KernelFilmConvert *kfilm_convert,
24 const RenderBuffers *render_buffers,
25 const BufferParams &buffer_params,
26 const Destination &destination,
27 const CPUKernels::FilmConvertFunction func) const
28{
29 /* NOTE: No overlays are applied since they are not used for final renders.
30 * Can be supported via some sort of specialization to avoid code duplication. */
31
32 DCHECK_EQ(destination.stride, 0) << "Custom stride for float destination is not implemented.";
33
34 const int64_t pass_stride = buffer_params.pass_stride;
35 const int64_t buffer_row_stride = buffer_params.stride * buffer_params.pass_stride;
36
37 const float *window_data = render_buffers->buffer.data() + buffer_params.window_x * pass_stride +
38 buffer_params.window_y * buffer_row_stride;
39
40 const int pixel_stride = destination.pixel_stride ? destination.pixel_stride :
41 destination.num_components;
42
43 parallel_for(0, buffer_params.window_height, [&](int64_t y) {
44 const float *buffer = window_data + y * buffer_row_stride;
45 float *pixel = destination.pixels + destination.pixel_offset +
46 (y * buffer_params.width + destination.offset) * pixel_stride;
47 func(kfilm_convert, buffer, pixel, buffer_params.window_width, pass_stride, pixel_stride);
48 });
49}
50
52 const KernelFilmConvert *kfilm_convert,
53 const RenderBuffers *render_buffers,
54 const BufferParams &buffer_params,
55 const Destination &destination,
57{
58 const int64_t pass_stride = buffer_params.pass_stride;
59 const int64_t buffer_row_stride = buffer_params.stride * buffer_params.pass_stride;
60
61 const float *window_data = render_buffers->buffer.data() + buffer_params.window_x * pass_stride +
62 buffer_params.window_y * buffer_row_stride;
63
64 half4 *dst_start = destination.pixels_half_rgba + destination.offset;
65 const int destination_stride = destination.stride != 0 ? destination.stride :
66 buffer_params.width;
67
68 parallel_for(0, buffer_params.window_height, [&](int64_t y) {
69 const float *buffer = window_data + y * buffer_row_stride;
70 half4 *pixel = dst_start + y * destination_stride;
71 func(kfilm_convert, buffer, pixel, buffer_params.window_width, pass_stride);
72 });
73}
74
75/* --------------------------------------------------------------------
76 * Pass accessors.
77 */
78
79#define DEFINE_PASS_ACCESSOR(pass) \
80 void PassAccessorCPU::get_pass_##pass(const RenderBuffers *render_buffers, \
81 const BufferParams &buffer_params, \
82 const Destination &destination) const \
83 { \
84 const CPUKernels &kernels = Device::get_cpu_kernels(); \
85 KernelFilmConvert kfilm_convert; \
86 init_kernel_film_convert(&kfilm_convert, buffer_params, destination); \
87\
88 if (destination.pixels) { \
89 run_get_pass_kernel_processor_float(&kfilm_convert, \
90 render_buffers, \
91 buffer_params, \
92 destination, \
93 kernels.film_convert_##pass); \
94 } \
95\
96 if (destination.pixels_half_rgba) { \
97 run_get_pass_kernel_processor_half_rgba(&kfilm_convert, \
98 render_buffers, \
99 buffer_params, \
100 destination, \
101 kernels.film_convert_half_rgba_##pass); \
102 } \
103 }
104
105/* Float (scalar) passes. */
108DEFINE_PASS_ACCESSOR(volume_majorant)
109DEFINE_PASS_ACCESSOR(sample_count)
111
112/* Float3 passes. */
113DEFINE_PASS_ACCESSOR(light_path)
114DEFINE_PASS_ACCESSOR(shadow_catcher)
117
118/* Float4 passes. */
120DEFINE_PASS_ACCESSOR(cryptomatte)
121DEFINE_PASS_ACCESSOR(shadow_catcher_matte_with_shadow)
122DEFINE_PASS_ACCESSOR(combined)
124
125#undef DEFINE_PASS_ACCESSOR
126
long long int int64_t
int pass_stride
Definition buffers.h:92
int window_y
Definition buffers.h:78
int window_height
Definition buffers.h:80
NODE_DECLARE int width
Definition buffers.h:70
int window_x
Definition buffers.h:77
CPUKernelFunction< void(*)(const KernelFilmConvert *kfilm_convert, const float *buffer, float *pixel, const int width, const int buffer_stride, const int pixel_stride)> FilmConvertFunction
CPUKernelFunction< void(*)(const KernelFilmConvert *kfilm_convert, const float *buffer, half4 *pixel, const int width, const int buffer_stride)> FilmConvertHalfRGBAFunction
void run_get_pass_kernel_processor_float(const KernelFilmConvert *kfilm_convert, const RenderBuffers *render_buffers, const BufferParams &buffer_params, const Destination &destination, const CPUKernels::FilmConvertFunction func) const
void run_get_pass_kernel_processor_half_rgba(const KernelFilmConvert *kfilm_convert, const RenderBuffers *render_buffers, const BufferParams &buffer_params, const Destination &destination, const CPUKernels::FilmConvertHalfRGBAFunction func) const
device_vector< float > buffer
Definition buffers.h:158
#define CCL_NAMESPACE_END
#define DCHECK_EQ(a, b)
Definition log.h:144
#define DEFINE_PASS_ACCESSOR(pass)
Definition half.h:60