Fullframe compositor: unify size inference with GPU compositor part 2 #115733

Merged
Habib Gahbiche merged 6 commits from zazizizou/blender:com-unify-size-inference-complex-nodes into main 2023-12-29 18:10:05 +01:00
6 changed files with 43 additions and 9 deletions

View File

@ -14,6 +14,7 @@ FlipOperation::FlipOperation()
input_operation_ = nullptr;
flip_x_ = true;
flip_y_ = false;
flags_.can_be_constant = true;
}
void FlipOperation::init_execution()
{
@ -110,6 +111,10 @@ void FlipOperation::update_memory_buffer_partial(MemoryBuffer *output,
Span<MemoryBuffer *> inputs)
{
const MemoryBuffer *input_img = inputs[0];
if (input_img->is_a_single_elem()) {
copy_v4_v4(output->get_elem(0, 0), input_img->get_elem(0, 0));
return;
}
const int input_offset_x = input_img->get_rect().xmin;
const int input_offset_y = input_img->get_rect().ymin;
for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {

View File

@ -22,6 +22,7 @@ InpaintSimpleOperation::InpaintSimpleOperation()
cached_buffer_ = nullptr;
cached_buffer_ready_ = false;
flags_.is_fullframe_operation = true;
flags_.can_be_constant = true;
}
void InpaintSimpleOperation::init_execution()
{
@ -282,15 +283,14 @@ void InpaintSimpleOperation::update_memory_buffer(MemoryBuffer *output,
{
/* TODO(manzanilla): once tiled implementation is removed, run multi-threaded where possible. */
MemoryBuffer *input = inputs[0];
if (input->is_a_single_elem()) {
copy_v4_v4(output->get_elem(0, 0), input->get_elem(0, 0));
return;
}
if (!cached_buffer_ready_) {
if (input->is_a_single_elem()) {
MemoryBuffer *tmp = input->inflate();
cached_buffer_ = tmp->release_ownership_buffer();
delete tmp;
}
else {
cached_buffer_ = (float *)MEM_dupallocN(input->get_buffer());
}
cached_buffer_ = (float *)MEM_dupallocN(input->get_buffer());
this->calc_manhattan_distance();

View File

@ -22,6 +22,7 @@ KuwaharaClassicOperation::KuwaharaClassicOperation()
this->add_output_socket(DataType::Color);
this->flags_.is_fullframe_operation = true;
this->flags_.can_be_constant = true;
}
void KuwaharaClassicOperation::init_execution()
@ -152,6 +153,10 @@ void KuwaharaClassicOperation::update_memory_buffer_partial(MemoryBuffer *output
Span<MemoryBuffer *> inputs)
{
MemoryBuffer *image = inputs[0];
if (image->is_a_single_elem()) {
copy_v4_v4(output->get_elem(0, 0), image->get_elem(0, 0));
return;
}
MemoryBuffer *size_image = inputs[1];
MemoryBuffer *sat = inputs[2];
MemoryBuffer *sat_squared = inputs[3];

View File

@ -486,6 +486,10 @@ void ScreenLensDistortionOperation::update_memory_buffer_partial(MemoryBuffer *o
Span<MemoryBuffer *> inputs)
{
const MemoryBuffer *input_image = inputs[0];
if (input_image->is_a_single_elem()) {
copy_v4_v4(output->get_elem(0, 0), input_image->get_elem(0, 0));
return;
}
for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
float xy[2] = {float(it.x), float(it.y)};
float uv[2];

View File

@ -18,6 +18,7 @@ SummedAreaTableOperation::SummedAreaTableOperation()
mode_ = eMode::Identity;
this->flags_.is_fullframe_operation = true;
this->flags_.can_be_constant = true;
}
void SummedAreaTableOperation::init_execution()

View File

@ -18,6 +18,7 @@ TonemapOperation::TonemapOperation()
data_ = nullptr;
cached_instance_ = nullptr;
flags_.complex = true;
flags_.can_be_constant = true;
}
void TonemapOperation::init_execution()
{
@ -171,10 +172,16 @@ static Luminance calc_area_luminance(const MemoryBuffer *input, const rcti &area
return lum;
}
void TonemapOperation::update_memory_buffer_started(MemoryBuffer * /*output*/,
void TonemapOperation::update_memory_buffer_started(MemoryBuffer * output,
const rcti & /*area*/,
Span<MemoryBuffer *> inputs)
{
MemoryBuffer *input_img = inputs[0];
if(input_img->is_a_single_elem()) {
copy_v4_v4(output->get_elem(0, 0), input_img->get_elem(0, 0));
return;
}
if (cached_instance_ == nullptr) {
Luminance lum = {0};
const MemoryBuffer *input = inputs[0];
@ -209,6 +216,12 @@ void TonemapOperation::update_memory_buffer_partial(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> inputs)
{
MemoryBuffer *input_img = inputs[0];
if(input_img->is_a_single_elem()) {
return;
}
AvgLogLum *avg = cached_instance_;
const float igm = avg->igm;
const float offset = data_->offset;
@ -233,6 +246,12 @@ void PhotoreceptorTonemapOperation::update_memory_buffer_partial(MemoryBuffer *o
const rcti &area,
Span<MemoryBuffer *> inputs)
{
MemoryBuffer *input_img = inputs[0];
if(input_img->is_a_single_elem()) {
copy_v4_v4(output->get_elem(0, 0), input_img->get_elem(0, 0));
return;
}
AvgLogLum *avg = cached_instance_;
const NodeTonemap *ntm = data_;
const float f = expf(-data_->f);