Blender V4.3
morphological_blur.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BLI_assert.h"
7
8#include "GPU_shader.hh"
9
10#include "COM_context.hh"
11#include "COM_result.hh"
12#include "COM_utilities.hh"
13
16
18
19static const char *get_shader(MorphologicalBlurOperation operation)
20{
21 switch (operation) {
23 return "compositor_morphological_blur_dilate";
25 return "compositor_morphological_blur_erode";
26 default:
27 break;
28 }
29
31 return nullptr;
32}
33
34/* Apply the morphological operator (minimum or maximum) on the input and the blurred input. The
35 * output is written to the blurred_input in-place. */
37 Result &input,
38 Result &blurred_input,
40{
41 GPUShader *shader = context.get_shader(get_shader(operation));
42 GPU_shader_bind(shader);
43
44 input.bind_as_texture(shader, "input_tx");
45
46 blurred_input.bind_as_image(shader, "blurred_input_img", true);
47
48 Domain domain = input.domain();
49 compute_dispatch_threads_at_least(shader, domain.size);
50
52 input.unbind_as_texture();
53 blurred_input.unbind_as_image();
54}
55
57 Result &input,
58 Result &output,
59 float2 radius,
61 int filter_type)
62{
63 BLI_assert(input.type() == ResultType::Float);
64
65 symmetric_separable_blur(context, input, output, radius, filter_type);
66 apply_morphological_operator(context, input, output, operation);
67}
68
69} // namespace blender::realtime_compositor
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define BLI_assert(a)
Definition BLI_assert.h:50
void GPU_shader_bind(GPUShader *shader)
void GPU_shader_unbind()
struct GPUShader GPUShader
void bind_as_image(GPUShader *shader, const char *image_name, bool read=false) const
Definition result.cc:264
static const char * get_shader(MorphologicalBlurOperation operation)
void symmetric_separable_blur(Context &context, Result &input, Result &output, float2 radius, int filter_type=R_FILTER_GAUSS, bool extend_bounds=false, bool gamma_correct=false)
static void apply_morphological_operator(Context &context, Result &input, Result &blurred_input, MorphologicalBlurOperation operation)
void morphological_blur(Context &context, Result &input, Result &output, float2 radius, MorphologicalBlurOperation operation=MorphologicalBlurOperation::Erode, int filter_type=R_FILTER_GAUSS)
void compute_dispatch_threads_at_least(GPUShader *shader, int2 threads_range, int2 local_size=int2(16))
Definition utilities.cc:131