27 T accumulated_color =
T(0);
30 T center_color =
input.load_pixel_extended<
T>(texel);
31 accumulated_color += center_color * weights.
load_pixel<
float>(
int2(0));
39 accumulated_color +=
input.load_pixel_extended<
T>(texel +
int2(
i, 0)) * weight;
40 accumulated_color +=
input.load_pixel_extended<
T>(texel +
int2(-
i, 0)) * weight;
45 output.store_pixel(
int2(texel.y, texel.x), accumulated_color);
53 return "compositor_symmetric_separable_blur_float";
55 return "compositor_symmetric_separable_blur_float4";
67 const int filter_type)
72 input.bind_as_texture(shader,
"input_tx");
74 const Result &weights = context.cache_manager().symmetric_separable_blur_weights.get(
75 context, filter_type, radius);
90 output.allocate_texture(transposed_domain);
91 output.bind_as_image(shader,
"output_img");
96 input.unbind_as_texture();
106 const int filter_type)
108 const Result &weights = context.cache_manager().symmetric_separable_blur_weights.get(
109 context, filter_type, radius);
123 output.allocate_texture(transposed_domain);
125 switch (
input.type()) {
143 const int filter_type)
145 if (context.use_gpu()) {
152 const Result &original_input,
153 const Result &horizontal_pass_result,
156 const int filter_type)
163 const Result &weights = context.cache_manager().symmetric_separable_blur_weights.get(
164 context, filter_type, radius.y);
168 output.allocate_texture(domain);
169 output.bind_as_image(shader,
"output_img");
182 const Result &original_input,
183 const Result &horizontal_pass_result,
186 const int filter_type)
188 const Result &weights = context.cache_manager().symmetric_separable_blur_weights.get(
189 context, filter_type, radius.y);
193 switch (original_input.
type()) {
207 const Result &original_input,
208 const Result &horizontal_pass_result,
211 const int filter_type)
213 if (context.use_gpu()) {
215 context, original_input, horizontal_pass_result,
output, radius, filter_type);
219 context, original_input, horizontal_pass_result,
output, radius, filter_type);
227 const int filter_type)
231 horizontal_pass_result.
release();
#define BLI_assert_unreachable()
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void unbind_as_texture() const
static ResultType type(blender::gpu::TextureFormat format)
void bind_as_texture(gpu::Shader *shader, const char *texture_name) const
const Domain & domain() const
T load_pixel(const int2 &texel) const
void symmetric_separable_blur(Context &context, const Result &input, Result &output, const float2 &radius, const int filter_type=R_FILTER_GAUSS)
static void vertical_pass_cpu(Context &context, const Result &original_input, const Result &horizontal_pass_result, Result &output, const int distance, const int falloff_type)
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
static void vertical_pass(Context &context, const Result &original_input, const Result &horizontal_pass_result, Result &output, const int distance, const int falloff_type)
static Result horizontal_pass_cpu(Context &context, const Result &input, const int distance, const int falloff_type)
static const char * get_blur_shader(const ResultType type)
static Result horizontal_pass_gpu(Context &context, const Result &input, const int distance, const int falloff_type)
static Result horizontal_pass(Context &context, const Result &input, const int distance, const int falloff_type)
void parallel_for(const int2 range, const Function &function)
static void vertical_pass_gpu(Context &context, const Result &original_input, const Result &horizontal_pass_result, Result &output, const int distance, const int falloff_type)
static void blur_pass(Context &context, const Result &input, Result &output, const float sigma)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2