Blender V5.0
pad.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "GPU_shader.hh"
6
7#include "COM_context.hh"
8#include "COM_result.hh"
9#include "COM_utilities.hh"
10
11#include "COM_algorithm_pad.hh"
12
13namespace blender::compositor {
14
15static const char *get_shader_name(const ResultType type, const PaddingMethod padding_method)
16{
17 switch (padding_method) {
19 switch (type) {
21 return "compositor_pad_zero_float4";
22 default:
23 break;
24 }
25 break;
27 switch (type) {
29 return "compositor_pad_extend_float2";
31 return "compositor_pad_extend_float";
32 default:
33 break;
34 }
35 break;
36 }
37
39 return "";
40}
41
42static void zero_pad_gpu(Context &context,
43 const Result &input,
45 const int2 size,
46 const PaddingMethod padding_method)
47{
48 gpu::Shader *shader = context.get_shader(get_shader_name(input.type(), padding_method));
49 GPU_shader_bind(shader);
50
51 GPU_shader_uniform_2iv(shader, "size", size);
52
53 input.bind_as_texture(shader, "input_tx");
54
55 Domain extended_domain = input.domain();
56 extended_domain.size += size * 2;
57 output.allocate_texture(extended_domain);
58 output.bind_as_image(shader, "output_img");
59
60 compute_dispatch_threads_at_least(shader, extended_domain.size);
61
63 input.unbind_as_texture();
64 output.unbind_as_image();
65}
66
67static void zero_pad_cpu(const Result &input,
69 const int2 size,
70 const PaddingMethod padding_method)
71{
72 Domain extended_domain = input.domain();
73 extended_domain.size += size * 2;
74 output.allocate_texture(extended_domain);
75
76 switch (padding_method) {
78 switch (input.type()) {
80 parallel_for(extended_domain.size, [&](const int2 texel) {
81 output.store_pixel(texel, input.load_pixel_zero<float4>(texel - size));
82 });
83 break;
84 default:
86 }
87 break;
89 switch (input.type()) {
91 parallel_for(extended_domain.size, [&](const int2 texel) {
92 output.store_pixel(texel, input.load_pixel_extended<float>(texel - size));
93 });
94 break;
96 parallel_for(extended_domain.size, [&](const int2 texel) {
97 output.store_pixel(texel, input.load_pixel_extended<float2>(texel - size));
98 });
99 break;
100 default:
102 }
103 break;
104 }
105}
106
107void pad(Context &context,
108 const Result &input,
109 Result &output,
110 const int2 size,
111 const PaddingMethod padding_method)
112{
113 if (input.is_single_value()) {
114 output.share_data(input);
115 return;
116 }
117
118 if (context.use_gpu()) {
119 zero_pad_gpu(context, input, output, size, padding_method);
120 }
121 else {
122 zero_pad_cpu(input, output, size, padding_method);
123 }
124}
125
126} // namespace blender::compositor
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_shader_unbind()
void GPU_shader_uniform_2iv(blender::gpu::Shader *sh, const char *name, const int data[2])
int pad[32 - sizeof(int)]
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define input
#define output
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
Definition utilities.cc:196
static void zero_pad_gpu(Context &context, const Result &input, Result &output, const int2 size, const PaddingMethod padding_method)
Definition pad.cc:42
static void zero_pad_cpu(const Result &input, Result &output, const int2 size, const PaddingMethod padding_method)
Definition pad.cc:67
void parallel_for(const int2 range, const Function &function)
static const char * get_shader_name(const int distance)
VecBase< int32_t, 2 > int2