37 return "compositor_summed_area_table_compute_incomplete_prologues_identity";
39 return "compositor_summed_area_table_compute_incomplete_prologues_square";
56 Result &incomplete_x_prologues,
57 Result &incomplete_y_prologues)
63 input.bind_as_texture(shader,
"input_tx");
66 const int2 input_size =
input.domain().size;
70 incomplete_x_prologues.
bind_as_image(shader,
"incomplete_x_prologues_img");
73 incomplete_y_prologues.
bind_as_image(shader,
"incomplete_y_prologues_img");
78 input.unbind_as_texture();
92 Result &incomplete_x_prologues,
93 Result &complete_x_prologues,
94 Result &complete_x_prologues_sum)
100 incomplete_x_prologues.
bind_as_texture(shader,
"incomplete_x_prologues_tx");
103 const int2 input_size =
input.domain().size;
107 complete_x_prologues.
bind_as_image(shader,
"complete_x_prologues_img");
110 complete_x_prologues_sum.
bind_as_image(shader,
"complete_x_prologues_sum_img");
127 Result &incomplete_y_prologues,
128 Result &complete_x_prologues_sum,
129 Result &complete_y_prologues)
135 incomplete_y_prologues.
bind_as_texture(shader,
"incomplete_y_prologues_tx");
136 complete_x_prologues_sum.
bind_as_texture(shader,
"complete_x_prologues_sum_tx");
139 const int2 input_size =
input.domain().size;
143 complete_y_prologues.
bind_as_image(shader,
"complete_y_prologues_img");
157 return "compositor_summed_area_table_compute_complete_blocks_identity";
159 return "compositor_summed_area_table_compute_complete_blocks_square";
172 Result &complete_x_prologues,
173 Result &complete_y_prologues,
181 input.bind_as_texture(shader,
"input_tx");
182 complete_x_prologues.
bind_as_texture(shader,
"complete_x_prologues_tx");
183 complete_y_prologues.
bind_as_texture(shader,
"complete_y_prologues_tx");
186 output.bind_as_image(shader,
"output_img",
true);
189 const int2 input_size =
input.domain().size;
195 input.unbind_as_texture();
209 context,
input, operation, incomplete_x_prologues, incomplete_y_prologues);
215 context,
input, incomplete_x_prologues, complete_x_prologues, complete_x_prologues_sum);
216 incomplete_x_prologues.
release();
220 context,
input, incomplete_y_prologues, complete_x_prologues_sum, complete_y_prologues);
221 incomplete_y_prologues.
release();
222 complete_x_prologues_sum.
release();
225 context,
input, complete_x_prologues, complete_y_prologues, operation,
output);
226 complete_x_prologues.
release();
227 complete_y_prologues.
release();
241 for (const int y : range_y) {
242 float4 accumulated_color = float4(0.0f);
243 for (const int x : IndexRange(size.x)) {
244 const int2 texel = int2(x, y);
245 const float4 color = input.load_pixel<float4>(texel);
246 accumulated_color += operation == SummedAreaTableOperation::Square ? color * color : color;
247 output.store_pixel(texel, accumulated_color);
254 for (const int x : range_x) {
255 float4 accumulated_color = float4(0.0f);
256 for (const int y : IndexRange(size.y)) {
257 const int2 texel = int2(x, y);
258 const float4 color = output.load_pixel<float4>(texel);
259 accumulated_color += color;
260 output.store_pixel(texel, accumulated_color);
271 if (context.use_gpu()) {
#define BLI_assert_unreachable()
void GPU_compute_dispatch(blender::gpu::Shader *shader, uint groups_x_len, uint groups_y_len, uint groups_z_len, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
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 allocate_texture(const Domain domain, const bool from_pool=true, const std::optional< ResultStorageType > storage_type=std::nullopt)
void unbind_as_texture() const
void bind_as_texture(gpu::Shader *shader, const char *texture_name) const
const Domain & domain() const
void unbind_as_image() const
void bind_as_image(gpu::Shader *shader, const char *image_name, bool read=false) const
void summed_area_table(Context &context, Result &input, Result &output, SummedAreaTableOperation operation=SummedAreaTableOperation::Identity)
static void compute_complete_blocks(Context &context, Result &input, Result &complete_x_prologues, Result &complete_y_prologues, SummedAreaTableOperation operation, Result &output)
static const char * get_compute_complete_blocks_shader(SummedAreaTableOperation operation)
static void compute_complete_y_prologues(Context &context, Result &input, Result &incomplete_y_prologues, Result &complete_x_prologues_sum, Result &complete_y_prologues)
static void summed_area_table_cpu(Result &input, Result &output, SummedAreaTableOperation operation)
static void summed_area_table_gpu(Context &context, Result &input, Result &output, SummedAreaTableOperation operation)
static void compute_complete_x_prologues(Context &context, Result &input, Result &incomplete_x_prologues, Result &complete_x_prologues, Result &complete_x_prologues_sum)
static void compute_incomplete_prologues(Context &context, Result &input, SummedAreaTableOperation operation, Result &incomplete_x_prologues, Result &incomplete_y_prologues)
static const char * get_compute_incomplete_prologues_shader(SummedAreaTableOperation operation)
VecBase< T, Size > divide_ceil(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< int32_t, 2 > int2