[v4,09/23] libcamera: shaders: Add support for Gamma
diff mbox series

Message ID 20251120233347.5046-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. 20, 2025, 11:33 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>
---
 include/libcamera/internal/shaders/bayer_1x_packed.frag | 4 ++++
 include/libcamera/internal/shaders/bayer_unpacked.frag  | 4 ++++
 2 files changed, 8 insertions(+)

Patch
diff mbox series

diff --git a/include/libcamera/internal/shaders/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag
index 6bca07b6e..069b880ff 100644
--- a/include/libcamera/internal/shaders/bayer_1x_packed.frag
+++ b/include/libcamera/internal/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/include/libcamera/internal/shaders/bayer_unpacked.frag b/include/libcamera/internal/shaders/bayer_unpacked.frag
index ae214a9ae..950a4733e 100644
--- a/include/libcamera/internal/shaders/bayer_unpacked.frag
+++ b/include/libcamera/internal/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;