[v11,10/24] libcamera: shaders: Add support for Gamma
diff mbox series

Message ID 20260106170059.56193-11-bryan.odonoghue@linaro.org
State Accepted
Commit 46aac79a4458589f7539f59fb915c85dacc3f57b
Headers show
Series
  • Add GLES 2.0 GPUISP to libcamera
Related show

Commit Message

Bryan O'Donoghue Jan. 6, 2026, 5 p.m. UTC
Add gamma compensation to the debayer shaders after colour correction is
applied.

Similarly only apply the calculated Gamma curve when using the CCM as the
lookup tables already contain the data.

Suggested-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
 src/libcamera/shaders/bayer_1x_packed.frag | 4 ++++
 src/libcamera/shaders/bayer_unpacked.frag  | 4 ++++
 2 files changed, 8 insertions(+)

Patch
diff mbox series

diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag
index 7036fe278..77d9fbfa7 100644
--- a/src/libcamera/shaders/bayer_1x_packed.frag
+++ b/src/libcamera/shaders/bayer_1x_packed.frag
@@ -67,6 +67,7 @@  uniform vec2 tex_bayer_first_red;
 uniform sampler2D tex_y;
 uniform mat3 ccm;
 uniform vec3 blacklevel;
+uniform float gamma;
 
 void main(void)
 {
@@ -260,6 +261,9 @@  void main(void)
 	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]);
 
+	/* Apply gamma after colour correction */
+	rgb = pow(rgb, vec3(gamma));
+
 #if defined (SWAP_BLUE)
 	gl_FragColor = vec4(rgb.bgr, 1.0);
 #else
diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag
index f0d8cd1e2..aba11a87f 100644
--- a/src/libcamera/shaders/bayer_unpacked.frag
+++ b/src/libcamera/shaders/bayer_unpacked.frag
@@ -26,6 +26,7 @@  varying vec4            yCoord;
 varying vec4            xCoord;
 uniform mat3            ccm;
 uniform vec3            blacklevel;
+uniform float           gamma;
 
 void main(void) {
     vec3 rgb;
@@ -155,6 +156,9 @@  void main(void) {
     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]);
 
+    /* Apply gamma after colour correction */
+    rgb = pow(rgb, vec3(gamma));
+
 #if defined (SWAP_BLUE)
     gl_FragColor = vec4(rgb.bgr, 1.0);
 #else