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