48 while (size_to_reduce !=
int2(1)) {
67 if (texture_to_reduce !=
texture) {
71 texture_to_reduce = reduced_texture;
72 size_to_reduce = reduced_size;
82 if (texture_to_reduce !=
texture) {
93template<
typename Value,
typename Function,
typename Reduction>
95 const Value &identity,
96 const Function &function,
97 const Reduction &reduction)
103 [&](
const IndexRange sub_y_range,
const Value &initial_value) {
104 Value result = initial_value;
105 for (const int64_t y : sub_y_range) {
106 for (const int64_t x : IndexRange(range.x)) {
107 function(int2(x, y), result);
126 const float sum = *reduced_value;
138 [&](
const int2 texel,
double &accumulated_value) {
139 accumulated_value += result.load_pixel<float4>(texel).x;
141 [&](
const double &a,
const double &
b) { return a + b; }));
146 if (context.use_gpu()) {
160 const float sum = *reduced_value;
172 [&](
const int2 texel,
double &accumulated_value) {
173 accumulated_value += result.load_pixel<float4>(texel).y;
175 [&](
const double &a,
const double &
b) { return a + b; }));
180 if (context.use_gpu()) {
194 const float sum = *reduced_value;
206 [&](
const int2 texel,
double &accumulated_value) {
207 accumulated_value += result.load_pixel<float4>(texel).z;
209 [&](
const double &a,
const double &
b) { return a + b; }));
214 if (context.use_gpu()) {
223 const float3 &luminance_coefficients)
232 const float sum = *reduced_value;
244 [&](
const int2 texel,
double &accumulated_value) {
245 accumulated_value += math::dot(result.load_pixel<float4>(texel).xyz(),
246 luminance_coefficients);
248 [&](
const double &a,
const double &
b) { return a + b; }));
253 if (context.use_gpu()) {
262 const float3 &luminance_coefficients)
271 const float sum = *reduced_value;
283 [&](
const int2 texel,
double &accumulated_value) {
284 const float luminance = math::dot(result.load_pixel<float4>(texel).xyz(),
285 luminance_coefficients);
286 accumulated_value += std::log(math::max(luminance, 1e-5f));
288 [&](
const double &a,
const double &
b) { return a + b; }));
293 const float3 &luminance_coefficients)
295 if (context.use_gpu()) {
321 [&](
const int2 texel,
double4 &accumulated_value) {
329 if (context.use_gpu()) {
342 const float subtrahend)
344 gpu::Shader *shader = context.get_shader(
"compositor_sum_red_squared_difference",
352 const float sum = *reduced_value;
364 [&](
const int2 texel,
double &accumulated_value) {
365 accumulated_value += math::square(result.load_pixel<float4>(texel).x - subtrahend);
367 [&](
const double &a,
const double &
b) { return a + b; }));
372 if (context.use_gpu()) {
381 const float subtrahend)
383 gpu::Shader *shader = context.get_shader(
"compositor_sum_green_squared_difference",
391 const float sum = *reduced_value;
403 [&](
const int2 texel,
double &accumulated_value) {
404 accumulated_value += math::square(result.load_pixel<float4>(texel).y - subtrahend);
406 [&](
const double &a,
const double &
b) { return a + b; }));
411 if (context.use_gpu()) {
420 const float subtrahend)
422 gpu::Shader *shader = context.get_shader(
"compositor_sum_blue_squared_difference",
430 const float sum = *reduced_value;
442 [&](
const int2 texel,
double &accumulated_value) {
443 accumulated_value += math::square(result.load_pixel<float4>(texel).z - subtrahend);
445 [&](
const double &a,
const double &
b) { return a + b; }));
450 if (context.use_gpu()) {
459 const float3 &luminance_coefficients,
460 const float subtrahend)
462 gpu::Shader *shader = context.get_shader(
"compositor_sum_luminance_squared_difference",
471 const float sum = *reduced_value;
479 const float3 &luminance_coefficients,
480 const float subtrahend)
485 [&](
const int2 texel,
double &accumulated_value) {
486 const float luminance = math::dot(result.load_pixel<float4>(texel).xyz(),
487 luminance_coefficients);
488 accumulated_value += math::square(luminance - subtrahend);
490 [&](
const double &a,
const double &
b) { return a + b; }));
495 const float3 &luminance_coefficients,
496 const float subtrahend)
498 if (context.use_gpu()) {
500 context,
result, luminance_coefficients, subtrahend);
512 const float3 &luminance_coefficients)
521 const float maximum = *reduced_value;
532 std::numeric_limits<float>::lowest(),
533 [&](
const int2 texel,
float &accumulated_value) {
534 const float luminance = math::dot(result.load_pixel<float4>(texel).xyz(),
535 luminance_coefficients);
536 accumulated_value = math::max(accumulated_value, luminance);
538 [&](
const float &a,
const float &
b) { return math::max(a, b); }));
543 const float3 &luminance_coefficients)
545 if (context.use_gpu()) {
559 const float maximum = *reduced_value;
570 std::numeric_limits<float>::lowest(),
571 [&](
const int2 texel,
float &accumulated_value) {
572 accumulated_value = math::max(accumulated_value, result.load_pixel<float>(texel));
574 [&](
const float &a,
const float &
b) { return math::max(a, b); }));
579 if (context.use_gpu()) {
593 const float2 maximum = reduced_value;
604 float2(std::numeric_limits<float>::lowest()),
605 [&](
const int2 texel,
float2 &accumulated_value) {
613 if (context.use_gpu()) {
622 const float lower_bound,
623 const float upper_bound)
625 gpu::Shader *shader = context.get_shader(
"compositor_maximum_float_in_range",
634 const float maximum = *reduced_value;
642 const float lower_bound,
643 const float upper_bound)
648 [&](
const int2 texel,
float &accumulated_value) {
649 const float value = result.load_pixel<float>(texel);
650 if ((value <= upper_bound) && (value >= lower_bound)) {
651 accumulated_value = math::max(accumulated_value, value);
654 [&](
const float &a,
const float &
b) {
return math::max(a,
b); }));
659 const float lower_bound,
660 const float upper_bound)
662 if (context.use_gpu()) {
675 const float3 &luminance_coefficients)
684 const float minimum = *reduced_value;
695 std::numeric_limits<float>::max(),
696 [&](
const int2 texel,
float &accumulated_value) {
697 const float luminance = math::dot(result.load_pixel<float4>(texel).xyz(),
698 luminance_coefficients);
699 accumulated_value = math::min(accumulated_value, luminance);
701 [&](
const float &a,
const float &
b) { return math::min(a, b); }));
706 const float3 &luminance_coefficients)
708 if (context.use_gpu()) {
722 const float minimum = *reduced_value;
733 std::numeric_limits<float>::max(),
734 [&](
const int2 texel,
float &accumulated_value) {
735 accumulated_value = math::min(accumulated_value, result.load_pixel<float>(texel));
737 [&](
const float &a,
const float &
b) { return math::min(a, b); }));
742 if (context.use_gpu()) {
751 const float lower_bound,
752 const float upper_bound)
754 gpu::Shader *shader = context.get_shader(
"compositor_minimum_float_in_range",
763 const float minimum = *reduced_value;
771 const float lower_bound,
772 const float upper_bound)
777 [&](
const int2 texel,
float &accumulated_value) {
778 const float value = result.load_pixel<float>(texel);
779 if ((value <= upper_bound) && (value >= lower_bound)) {
780 accumulated_value = math::min(accumulated_value, value);
783 [&](
const float &a,
const float &
b) {
return math::min(a,
b); });
788 const float lower_bound,
789 const float upper_bound)
791 if (context.use_gpu()) {
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_uniform_1b(blender::gpu::Shader *sh, const char *name, bool value)
void GPU_shader_uniform_1f(blender::gpu::Shader *sh, const char *name, float value)
int GPU_shader_get_sampler_binding(blender::gpu::Shader *shader, const char *name)
void GPU_shader_uniform_3fv(blender::gpu::Shader *sh, const char *name, const float data[3])
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
@ GPU_BARRIER_TEXTURE_FETCH
@ GPU_BARRIER_TEXTURE_UPDATE
void GPU_memory_barrier(GPUBarrier barrier)
int GPU_texture_height(const blender::gpu::Texture *texture)
void GPU_texture_unbind(blender::gpu::Texture *texture)
int GPU_texture_width(const blender::gpu::Texture *texture)
@ GPU_TEXTURE_USAGE_GENERAL
void * GPU_texture_read(blender::gpu::Texture *texture, eGPUDataFormat data_format, int mip_level)
void GPU_texture_image_bind(blender::gpu::Texture *texture, int unit)
void GPU_texture_image_unbind(blender::gpu::Texture *texture)
void GPU_texture_bind(blender::gpu::Texture *texture, int unit)
Read Guarded memory(de)allocation.
static T sum(const btAlignedObjectArray< T > &items)
static blender::gpu::TextureFormat gpu_texture_format(ResultType type, ResultPrecision precision)
blender::gpu::Texture * acquire_texture(int width, int height, blender::gpu::TextureFormat format, eGPUTextureUsage usage)
static TexturePool & get()
void release_texture(blender::gpu::Texture *tmp_tex)
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
VecBase< float, 4 > float4
void MEM_freeN(void *vmemh)
float sum_red(Context &context, const Result &result)
float4 sum_color(Context &context, const Result &result)
static float2 maximum_float2_gpu(Context &context, const Result &result)
float maximum_luminance(Context &context, const Result &result, const float3 &luminance_coefficients)
static float sum_blue_squared_difference_gpu(Context &context, const Result &result, const float subtrahend)
static float * parallel_reduction_dispatch(blender::gpu::Texture *texture, gpu::Shader *shader, blender::gpu::TextureFormat format)
static float sum_blue_cpu(const Result &result)
float sum_red_squared_difference(Context &context, const Result &result, const float subtrahend)
static Value parallel_reduce(const int2 range, const Value &identity, const Function &function, const Reduction &reduction)
static float minimum_float_in_range_gpu(Context &context, const Result &result, const float lower_bound, const float upper_bound)
float sum_luminance(Context &context, const Result &result, const float3 &luminance_coefficients)
static float sum_red_gpu(Context &context, const Result &result)
static float sum_log_luminance_cpu(const Result &result, const float3 &luminance_coefficients)
static float sum_luminance_gpu(Context &context, const Result &result, const float3 &luminance_coefficients)
static float sum_luminance_squared_difference_cpu(const Result &result, const float3 &luminance_coefficients, const float subtrahend)
float sum_blue_squared_difference(Context &context, const Result &result, const float subtrahend)
float sum_luminance_squared_difference(Context &context, const Result &result, const float3 &luminance_coefficients, const float subtrahend)
float minimum_float_in_range(Context &context, const Result &result, const float lower_bound, const float upper_bound)
float maximum_float_in_range(Context &context, const Result &result, const float lower_bound, const float upper_bound)
static float maximum_float_cpu(const Result &result)
static float4 sum_color_gpu(Context &context, const Result &result)
static float sum_luminance_cpu(const Result &result, const float3 &luminance_coefficients)
float sum_green_squared_difference(Context &context, const Result &result, const float subtrahend)
float minimum_float(Context &context, const Result &result)
static float minimum_float_cpu(const Result &result)
float sum_green(Context &context, const Result &result)
float minimum_luminance(Context &context, const Result &result, const float3 &luminance_coefficients)
float sum_blue(Context &context, const Result &result)
static float sum_blue_gpu(Context &context, const Result &result)
static float sum_green_gpu(Context &context, const Result &result)
static float maximum_luminance_cpu(const Result &result, const float3 &luminance_coefficients)
static float minimum_float_in_range_cpu(const Result &result, const float lower_bound, const float upper_bound)
float2 maximum_float2(Context &context, const Result &result)
static float2 maximum_float2_cpu(const Result &result)
static float sum_green_squared_difference_gpu(Context &context, const Result &result, const float subtrahend)
static float minimum_float_gpu(Context &context, const Result &result)
static float sum_red_squared_difference_cpu(const Result &result, const float subtrahend)
float maximum_float(Context &context, const Result &result)
static float minimum_luminance_cpu(const Result &result, const float3 &luminance_coefficients)
static float sum_green_squared_difference_cpu(const Result &result, const float subtrahend)
static float maximum_float_in_range_gpu(Context &context, const Result &result, const float lower_bound, const float upper_bound)
static float4 sum_color_cpu(const Result &result)
static float maximum_float_in_range_cpu(const Result &result, const float lower_bound, const float upper_bound)
float sum_log_luminance(Context &context, const Result &result, const float3 &luminance_coefficients)
static float sum_luminance_squared_difference_gpu(Context &context, const Result &result, const float3 &luminance_coefficients, const float subtrahend)
static float sum_blue_squared_difference_cpu(const Result &result, const float subtrahend)
static float maximum_luminance_gpu(Context &context, const Result &result, const float3 &luminance_coefficients)
static float sum_green_cpu(const Result &result)
static float sum_log_luminance_gpu(Context &context, const Result &result, const float3 &luminance_coefficients)
static float sum_red_cpu(const Result &result)
static float minimum_luminance_gpu(Context &context, const Result &result, const float3 &luminance_coefficients)
static float maximum_float_gpu(Context &context, const Result &result)
static float sum_red_squared_difference_gpu(Context &context, const Result &result, const float subtrahend)
VecBase< T, Size > divide_ceil(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
T min(const T &a, const T &b)
T max(const T &a, const T &b)
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
VecBase< double, 4 > double4
static Value parallel_reduce(const int range, const Value &identity, const Function &function, const Reduction &reduction)