Compositor: Full frame Color Balance node

Adds full frame implementation to this node operations.
No functional changes.
1.3x faster than tiled fallback.

Reviewed By: jbakker

Differential Revision: https://developer.blender.org/D11764
This commit is contained in:
Manuel Castilla 2021-07-05 21:43:44 +02:00
parent 0c90aa097d
commit 3d9ecf1cf2
4 changed files with 42 additions and 4 deletions

View File

@ -76,6 +76,23 @@ void ColorBalanceASCCDLOperation::executePixelSampled(float output[4],
output[3] = inputColor[3];
}
void ColorBalanceASCCDLOperation::update_memory_buffer_row(PixelCursor &p)
{
for (; p.out < p.row_end; p.next()) {
const float *in_factor = p.ins[0];
const float *in_color = p.ins[1];
const float fac = MIN2(1.0f, in_factor[0]);
const float fac_m = 1.0f - fac;
p.out[0] = fac_m * in_color[0] +
fac * colorbalance_cdl(in_color[0], m_offset[0], m_power[0], m_slope[0]);
p.out[1] = fac_m * in_color[1] +
fac * colorbalance_cdl(in_color[1], m_offset[1], m_power[1], m_slope[1]);
p.out[2] = fac_m * in_color[2] +
fac * colorbalance_cdl(in_color[2], m_offset[2], m_power[2], m_slope[2]);
p.out[3] = in_color[3];
}
}
void ColorBalanceASCCDLOperation::deinitExecution()
{
this->m_inputValueOperation = nullptr;

View File

@ -18,7 +18,7 @@
#pragma once
#include "COM_NodeOperation.h"
#include "COM_MultiThreadedRowOperation.h"
namespace blender::compositor {
@ -26,7 +26,7 @@ namespace blender::compositor {
* this program converts an input color to an output value.
* it assumes we are in sRGB color space.
*/
class ColorBalanceASCCDLOperation : public NodeOperation {
class ColorBalanceASCCDLOperation : public MultiThreadedRowOperation {
protected:
/**
* Prefetched reference to the inputProgram
@ -71,6 +71,8 @@ class ColorBalanceASCCDLOperation : public NodeOperation {
{
copy_v3_v3(this->m_slope, slope);
}
void update_memory_buffer_row(PixelCursor &p) override;
};
} // namespace blender::compositor

View File

@ -81,6 +81,23 @@ void ColorBalanceLGGOperation::executePixelSampled(float output[4],
output[3] = inputColor[3];
}
void ColorBalanceLGGOperation::update_memory_buffer_row(PixelCursor &p)
{
for (; p.out < p.row_end; p.next()) {
const float *in_factor = p.ins[0];
const float *in_color = p.ins[1];
const float fac = MIN2(1.0f, in_factor[0]);
const float fac_m = 1.0f - fac;
p.out[0] = fac_m * in_color[0] +
fac * colorbalance_lgg(in_color[0], m_lift[0], m_gamma_inv[0], m_gain[0]);
p.out[1] = fac_m * in_color[1] +
fac * colorbalance_lgg(in_color[1], m_lift[1], m_gamma_inv[1], m_gain[1]);
p.out[2] = fac_m * in_color[2] +
fac * colorbalance_lgg(in_color[2], m_lift[2], m_gamma_inv[2], m_gain[2]);
p.out[3] = in_color[3];
}
}
void ColorBalanceLGGOperation::deinitExecution()
{
this->m_inputValueOperation = nullptr;

View File

@ -18,7 +18,7 @@
#pragma once
#include "COM_NodeOperation.h"
#include "COM_MultiThreadedRowOperation.h"
namespace blender::compositor {
@ -26,7 +26,7 @@ namespace blender::compositor {
* this program converts an input color to an output value.
* it assumes we are in sRGB color space.
*/
class ColorBalanceLGGOperation : public NodeOperation {
class ColorBalanceLGGOperation : public MultiThreadedRowOperation {
protected:
/**
* Prefetched reference to the inputProgram
@ -71,6 +71,8 @@ class ColorBalanceLGGOperation : public NodeOperation {
{
copy_v3_v3(this->m_gamma_inv, gamma_inv);
}
void update_memory_buffer_row(PixelCursor &p) override;
};
} // namespace blender::compositor