[v6,09/24] libcamera: shaders: Add support for Gamma
diff mbox series

Message ID 20251202134544.662446-10-bryan.odonoghue@linaro.org
State New
Headers show
Series
  • Add GLES 2.0 GPUISP to libcamera
Related show

Commit Message

Bryan O'Donoghue Dec. 2, 2025, 1:45 p.m. UTC
Add gamma compentation 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>
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