[7/7] shaders: bayer: Use native matrix multiplication
diff mbox series

Message ID 20260621-kbingham-awb-saturation-v1-7-b91ea59c6cfb@ideasonboard.com
State New
Headers show
Series
  • softisp: Fix Saturation and Black level handling
Related show

Commit Message

Kieran Bingham June 20, 2026, 11 p.m. UTC
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(-)

Patch
diff mbox series

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 &params)
 			    << " 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;
 
 	/*