libcamera: shaders: Add support for Gamma

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>
Tested-by: Robert Mader <robert.mader@collabora.com>
Tested-by: Hans de Goede <johannes.goede@oss.qualcomm.com> # ThinkPad T14s gen 6 (arm64) ov02c10 + X1c gen 12 ov08x40
Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com> # Lenovo X13s
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Bryan O'Donoghue
2026-01-06 17:00:45 +00:00
committed by Kieran Bingham
parent 6029dcf9a6
commit 46aac79a44
2 changed files with 8 additions and 0 deletions
@@ -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
@@ -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