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

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

Commit Message

Bryan O'Donoghue Nov. 27, 2025, 2:37 a.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 6bca07b6e..069b880ff 100644
--- a/src/libcamera/shaders/bayer_1x_packed.frag
+++ b/src/libcamera/shaders/bayer_1x_packed.frag
@@ -70,6 +70,7 @@  uniform sampler2D green_param;
 uniform sampler2D blue_param;
 uniform mat3 ccm;
 uniform vec3 blacklevel;
+uniform float gamma;
 
 void main(void)
 {
@@ -265,6 +266,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));
+
 #elif defined(APPLY_RGB_PARAMETERS)
 	/* Apply bayer params */
 	rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r;
diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag
index 66cece56b..86bf2c31c 100644
--- a/src/libcamera/shaders/bayer_unpacked.frag
+++ b/src/libcamera/shaders/bayer_unpacked.frag
@@ -29,6 +29,7 @@  varying vec4            yCoord;
 varying vec4            xCoord;
 uniform mat3            ccm;
 uniform vec3            blacklevel;
+uniform float           gamma;
 
 void main(void) {
     vec3 rgb;
@@ -160,6 +161,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));
+
 #elif defined(APPLY_RGB_PARAMETERS)
         /* Apply bayer params */
         rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r;