| Message ID | 20260621-kbingham-awb-saturation-v1-7-b91ea59c6cfb@ideasonboard.com |
|---|---|
| State | Accepted |
| Headers | show |
| Series |
|
| Related | show |
On 21/06/2026 00:00, Kieran Bingham wrote: > Remove the open coded matrix multiplication as glsl can perform this > directly. Adapt the uniform ccmUniformDataIn_ to ensure we correctly > upload the matrix in row major ordering. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > src/libcamera/shaders/bayer_1x_packed.frag | 45 ++---------------------------- > src/libcamera/shaders/bayer_unpacked.frag | 45 ++---------------------------- > src/libcamera/software_isp/debayer_egl.cpp | 13 +-------- > 3 files changed, 5 insertions(+), 98 deletions(-) > > diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag > index 6b3f7532c177f277e43c27e498dfadcb9cd4e26c..0b641a5f35c53a20811315c4e5def18f301cae69 100644 > --- a/src/libcamera/shaders/bayer_1x_packed.frag > +++ b/src/libcamera/shaders/bayer_1x_packed.frag > @@ -235,49 +235,8 @@ void main(void) > /* Apply AWB gains, and saturate each channel at sensor range */ > rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0)); > > - /* > - * CCM is a 3x3 in the format > - * > - * +--------------+----------------+---------------+ > - * | RedRedGain | RedGreenGain | RedBlueGain | > - * +--------------+----------------+---------------+ > - * | GreenRedGain | GreenGreenGain | GreenBlueGain | > - * +--------------+----------------+---------------+ > - * | BlueRedGain | BlueGreenGain | BlueBlueGain | > - * +--------------+----------------+---------------+ > - * > - * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin > - * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin > - * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin > - * > - * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); > - * > - * CPU > - * float ccm [] = { > - * RedRedGain, RedGreenGain, RedBlueGain, > - * GreenRedGain, GreenGreenGain, GreenBlueGain, > - * BlueRedGain, BlueGreenGain, BlueBlueGain, > - * }; > - * > - * GPU > - * ccm = { > - * RedRedGain, GreenRedGain, BlueRedGain, > - * RedGreenGain, GreenGreenGain, BlueGreenGain, > - * RedBlueGain, GreenBlueGain, BlueBlueGain, > - * } > - * > - * However the indexing for the mat data-type is column major hence > - * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain > - * > - */ > - float rin, gin, bin; > - rin = rgb.r; > - gin = rgb.g; > - bin = rgb.b; > - > - rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); > - rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); > - rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); > + /* Colour Correction Matrix */ > + rgb = ccm * rgb; > > /* > * Contrast > diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag > index 44535312125d0e7e5cca372f4e8e0f8ad9fce8b3..10c5e941b67c6409312d4091e54d87c1037fae32 100644 > --- a/src/libcamera/shaders/bayer_unpacked.frag > +++ b/src/libcamera/shaders/bayer_unpacked.frag > @@ -138,49 +138,8 @@ void main(void) { > /* Apply AWB gains, and saturate each channel at sensor range */ > rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0)); > > - /* > - * CCM is a 3x3 in the format > - * > - * +--------------+----------------+---------------+ > - * | RedRedGain | RedGreenGain | RedBlueGain | > - * +--------------+----------------+---------------+ > - * | GreenRedGain | GreenGreenGain | GreenBlueGain | > - * +--------------+----------------+---------------+ > - * | BlueRedGain | BlueGreenGain | BlueBlueGain | > - * +--------------+----------------+---------------+ > - * > - * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin > - * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin > - * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin > - * > - * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); > - * > - * CPU > - * float ccm [] = { > - * RedRedGain, RedGreenGain, RedBlueGain, > - * GreenRedGain, GreenGreenGain, GreenBlueGain, > - * BlueRedGain, BlueGreenGain, BlueBlueGain, > - * }; > - * > - * GPU > - * ccm = { > - * RedRedGain, GreenRedGain, BlueRedGain, > - * RedGreenGain, GreenGreenGain, BlueGreenGain, > - * RedBlueGain, GreenBlueGain, BlueBlueGain, > - * } > - * > - * However the indexing for the mat data-type is column major hence > - * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain > - * > - */ > - float rin, gin, bin; > - rin = rgb.r; > - gin = rgb.g; > - bin = rgb.b; > - > - rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); > - rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); > - rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); > + /* Colour Correction Matrix */ > + rgb = ccm * rgb; > > /* > * Contrast > diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp > index 6ba197966d85e1ab3bdc337b9e4ddeb20f1ec2fa..0ec2a98cfafbf87f4de8f160b7b779f61943d287 100644 > --- a/src/libcamera/software_isp/debayer_egl.cpp > +++ b/src/libcamera/software_isp/debayer_egl.cpp > @@ -486,18 +486,7 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams ¶ms) > << " textureUniformStrideFactor_ " << Stride > << " textureUniformProjMatrix_ " << textureUniformProjMatrix_; > > - GLfloat ccm[9] = { > - params.combinedMatrix[0][0], > - params.combinedMatrix[0][1], > - params.combinedMatrix[0][2], > - params.combinedMatrix[1][0], > - params.combinedMatrix[1][1], > - params.combinedMatrix[1][2], > - params.combinedMatrix[2][0], > - params.combinedMatrix[2][1], > - params.combinedMatrix[2][2], > - }; > - glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm); > + glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_TRUE, params.combinedMatrix.data().data()); > LOG(Debayer, Debug) << " ccmUniformDataIn_ " << ccmUniformDataIn_ << " data " << params.combinedMatrix; > > /* > > -- > 2.53.0 > Tested-by: Bryan O'Donoghue <bod.linux@nxsw.ie> Reviewed-by: Bryan O'Donoghue <bod.linux@nxsw.ie> --- bod
2026. 06. 21. 1:00 keltezéssel, Kieran Bingham írta: > Remove the open coded matrix multiplication as glsl can perform this > directly. Adapt the uniform ccmUniformDataIn_ to ensure we correctly > upload the matrix in row major ordering. > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> > src/libcamera/shaders/bayer_1x_packed.frag | 45 ++---------------------------- > src/libcamera/shaders/bayer_unpacked.frag | 45 ++---------------------------- > src/libcamera/software_isp/debayer_egl.cpp | 13 +-------- > 3 files changed, 5 insertions(+), 98 deletions(-) > > diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag > index 6b3f7532c177f277e43c27e498dfadcb9cd4e26c..0b641a5f35c53a20811315c4e5def18f301cae69 100644 > --- a/src/libcamera/shaders/bayer_1x_packed.frag > +++ b/src/libcamera/shaders/bayer_1x_packed.frag > @@ -235,49 +235,8 @@ void main(void) > /* Apply AWB gains, and saturate each channel at sensor range */ > rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0)); > > - /* > - * CCM is a 3x3 in the format > - * > - * +--------------+----------------+---------------+ > - * | RedRedGain | RedGreenGain | RedBlueGain | > - * +--------------+----------------+---------------+ > - * | GreenRedGain | GreenGreenGain | GreenBlueGain | > - * +--------------+----------------+---------------+ > - * | BlueRedGain | BlueGreenGain | BlueBlueGain | > - * +--------------+----------------+---------------+ > - * > - * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin > - * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin > - * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin > - * > - * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); > - * > - * CPU > - * float ccm [] = { > - * RedRedGain, RedGreenGain, RedBlueGain, > - * GreenRedGain, GreenGreenGain, GreenBlueGain, > - * BlueRedGain, BlueGreenGain, BlueBlueGain, > - * }; > - * > - * GPU > - * ccm = { > - * RedRedGain, GreenRedGain, BlueRedGain, > - * RedGreenGain, GreenGreenGain, BlueGreenGain, > - * RedBlueGain, GreenBlueGain, BlueBlueGain, > - * } > - * > - * However the indexing for the mat data-type is column major hence > - * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain > - * > - */ > - float rin, gin, bin; > - rin = rgb.r; > - gin = rgb.g; > - bin = rgb.b; > - > - rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); > - rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); > - rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); > + /* Colour Correction Matrix */ > + rgb = ccm * rgb; > > /* > * Contrast > diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag > index 44535312125d0e7e5cca372f4e8e0f8ad9fce8b3..10c5e941b67c6409312d4091e54d87c1037fae32 100644 > --- a/src/libcamera/shaders/bayer_unpacked.frag > +++ b/src/libcamera/shaders/bayer_unpacked.frag > @@ -138,49 +138,8 @@ void main(void) { > /* Apply AWB gains, and saturate each channel at sensor range */ > rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0)); > > - /* > - * CCM is a 3x3 in the format > - * > - * +--------------+----------------+---------------+ > - * | RedRedGain | RedGreenGain | RedBlueGain | > - * +--------------+----------------+---------------+ > - * | GreenRedGain | GreenGreenGain | GreenBlueGain | > - * +--------------+----------------+---------------+ > - * | BlueRedGain | BlueGreenGain | BlueBlueGain | > - * +--------------+----------------+---------------+ > - * > - * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin > - * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin > - * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin > - * > - * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); > - * > - * CPU > - * float ccm [] = { > - * RedRedGain, RedGreenGain, RedBlueGain, > - * GreenRedGain, GreenGreenGain, GreenBlueGain, > - * BlueRedGain, BlueGreenGain, BlueBlueGain, > - * }; > - * > - * GPU > - * ccm = { > - * RedRedGain, GreenRedGain, BlueRedGain, > - * RedGreenGain, GreenGreenGain, BlueGreenGain, > - * RedBlueGain, GreenBlueGain, BlueBlueGain, > - * } > - * > - * However the indexing for the mat data-type is column major hence > - * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain > - * > - */ > - float rin, gin, bin; > - rin = rgb.r; > - gin = rgb.g; > - bin = rgb.b; > - > - rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); > - rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); > - rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); > + /* Colour Correction Matrix */ > + rgb = ccm * rgb; > > /* > * Contrast > diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp > index 6ba197966d85e1ab3bdc337b9e4ddeb20f1ec2fa..0ec2a98cfafbf87f4de8f160b7b779f61943d287 100644 > --- a/src/libcamera/software_isp/debayer_egl.cpp > +++ b/src/libcamera/software_isp/debayer_egl.cpp > @@ -486,18 +486,7 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams ¶ms) > << " textureUniformStrideFactor_ " << Stride > << " textureUniformProjMatrix_ " << textureUniformProjMatrix_; > > - GLfloat ccm[9] = { > - params.combinedMatrix[0][0], > - params.combinedMatrix[0][1], > - params.combinedMatrix[0][2], > - params.combinedMatrix[1][0], > - params.combinedMatrix[1][1], > - params.combinedMatrix[1][2], > - params.combinedMatrix[2][0], > - params.combinedMatrix[2][1], > - params.combinedMatrix[2][2], > - }; > - glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm); > + glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_TRUE, params.combinedMatrix.data().data()); > LOG(Debayer, Debug) << " ccmUniformDataIn_ " << ccmUniformDataIn_ << " data " << params.combinedMatrix; > > /* >
diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag index 6b3f7532c177f277e43c27e498dfadcb9cd4e26c..0b641a5f35c53a20811315c4e5def18f301cae69 100644 --- a/src/libcamera/shaders/bayer_1x_packed.frag +++ b/src/libcamera/shaders/bayer_1x_packed.frag @@ -235,49 +235,8 @@ void main(void) /* Apply AWB gains, and saturate each channel at sensor range */ rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0)); - /* - * CCM is a 3x3 in the format - * - * +--------------+----------------+---------------+ - * | RedRedGain | RedGreenGain | RedBlueGain | - * +--------------+----------------+---------------+ - * | GreenRedGain | GreenGreenGain | GreenBlueGain | - * +--------------+----------------+---------------+ - * | BlueRedGain | BlueGreenGain | BlueBlueGain | - * +--------------+----------------+---------------+ - * - * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin - * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin - * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin - * - * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); - * - * CPU - * float ccm [] = { - * RedRedGain, RedGreenGain, RedBlueGain, - * GreenRedGain, GreenGreenGain, GreenBlueGain, - * BlueRedGain, BlueGreenGain, BlueBlueGain, - * }; - * - * GPU - * ccm = { - * RedRedGain, GreenRedGain, BlueRedGain, - * RedGreenGain, GreenGreenGain, BlueGreenGain, - * RedBlueGain, GreenBlueGain, BlueBlueGain, - * } - * - * However the indexing for the mat data-type is column major hence - * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain - * - */ - float rin, gin, bin; - rin = rgb.r; - gin = rgb.g; - bin = rgb.b; - - rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); - rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); - rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); + /* Colour Correction Matrix */ + rgb = ccm * rgb; /* * Contrast diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag index 44535312125d0e7e5cca372f4e8e0f8ad9fce8b3..10c5e941b67c6409312d4091e54d87c1037fae32 100644 --- a/src/libcamera/shaders/bayer_unpacked.frag +++ b/src/libcamera/shaders/bayer_unpacked.frag @@ -138,49 +138,8 @@ void main(void) { /* Apply AWB gains, and saturate each channel at sensor range */ rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0)); - /* - * CCM is a 3x3 in the format - * - * +--------------+----------------+---------------+ - * | RedRedGain | RedGreenGain | RedBlueGain | - * +--------------+----------------+---------------+ - * | GreenRedGain | GreenGreenGain | GreenBlueGain | - * +--------------+----------------+---------------+ - * | BlueRedGain | BlueGreenGain | BlueBlueGain | - * +--------------+----------------+---------------+ - * - * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin - * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin - * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin - * - * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); - * - * CPU - * float ccm [] = { - * RedRedGain, RedGreenGain, RedBlueGain, - * GreenRedGain, GreenGreenGain, GreenBlueGain, - * BlueRedGain, BlueGreenGain, BlueBlueGain, - * }; - * - * GPU - * ccm = { - * RedRedGain, GreenRedGain, BlueRedGain, - * RedGreenGain, GreenGreenGain, BlueGreenGain, - * RedBlueGain, GreenBlueGain, BlueBlueGain, - * } - * - * However the indexing for the mat data-type is column major hence - * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain - * - */ - float rin, gin, bin; - rin = rgb.r; - gin = rgb.g; - bin = rgb.b; - - rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); - rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); - rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); + /* Colour Correction Matrix */ + rgb = ccm * rgb; /* * Contrast diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp index 6ba197966d85e1ab3bdc337b9e4ddeb20f1ec2fa..0ec2a98cfafbf87f4de8f160b7b779f61943d287 100644 --- a/src/libcamera/software_isp/debayer_egl.cpp +++ b/src/libcamera/software_isp/debayer_egl.cpp @@ -486,18 +486,7 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams ¶ms) << " textureUniformStrideFactor_ " << Stride << " textureUniformProjMatrix_ " << textureUniformProjMatrix_; - GLfloat ccm[9] = { - params.combinedMatrix[0][0], - params.combinedMatrix[0][1], - params.combinedMatrix[0][2], - params.combinedMatrix[1][0], - params.combinedMatrix[1][1], - params.combinedMatrix[1][2], - params.combinedMatrix[2][0], - params.combinedMatrix[2][1], - params.combinedMatrix[2][2], - }; - glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm); + glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_TRUE, params.combinedMatrix.data().data()); LOG(Debayer, Debug) << " ccmUniformDataIn_ " << ccmUniformDataIn_ << " data " << params.combinedMatrix; /*
Remove the open coded matrix multiplication as glsl can perform this directly. Adapt the uniform ccmUniformDataIn_ to ensure we correctly upload the matrix in row major ordering. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> --- src/libcamera/shaders/bayer_1x_packed.frag | 45 ++---------------------------- src/libcamera/shaders/bayer_unpacked.frag | 45 ++---------------------------- src/libcamera/software_isp/debayer_egl.cpp | 13 +-------- 3 files changed, 5 insertions(+), 98 deletions(-)