@@ -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
@@ -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
@@ -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(-)