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