[4/7] libcamera: shaders: Add LSC support
diff mbox series

Message ID 20260126104256.119697-5-rick.w.ten.wolde@gmail.com
State New
Headers show
Series
  • LSC for SoftISP simple pipeline
Related show

Commit Message

Rick ten Wolde Jan. 26, 2026, 10:42 a.m. UTC
From: Xander Pronk <xander.c.pronk@gmail.com>

Apply LSC after black-level and before CCM operations.

Co-authored-by: Rick ten Wolde <rick_libcamera@wolde.info>
Signed-off-by: Rick ten Wolde <rick_libcamera@wolde.info>
Signed-off-by: Xander Pronk <xander.c.pronk@gmail.com>
---
 src/libcamera/shaders/bayer_1x_packed.frag | 10 ++++++++++
 src/libcamera/shaders/bayer_unpacked.frag  | 10 ++++++++++
 2 files changed, 20 insertions(+)

Comments

Barnabás Pőcze Jan. 26, 2026, 11:30 a.m. UTC | #1
Hi

2026. 01. 26. 11:42 keltezéssel, Rick ten Wolde írta:
> From: Xander Pronk <xander.c.pronk@gmail.com>
> 
> Apply LSC after black-level and before CCM operations.
> 
> Co-authored-by: Rick ten Wolde <rick_libcamera@wolde.info>
> Signed-off-by: Rick ten Wolde <rick_libcamera@wolde.info>
> Signed-off-by: Xander Pronk <xander.c.pronk@gmail.com>
> ---
>   src/libcamera/shaders/bayer_1x_packed.frag | 10 ++++++++++
>   src/libcamera/shaders/bayer_unpacked.frag  | 10 ++++++++++
>   2 files changed, 20 insertions(+)
> 
> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag
> index 23747f78..7993ea1d 100644
> --- a/src/libcamera/shaders/bayer_1x_packed.frag
> +++ b/src/libcamera/shaders/bayer_1x_packed.frag
> @@ -70,6 +70,10 @@ uniform vec3 blacklevel;
>   uniform float gamma;
>   uniform float contrastExp;
>   
> +uniform sampler2D lsc_tex_red;
> +uniform sampler2D lsc_tex_blue;
> +uniform sampler2D lsc_tex_green;
> +
>   float apply_contrast(float value)
>   {
>   	// Apply simple S-curve
> @@ -227,6 +231,12 @@ void main(void)
>   
>   	rgb = rgb - blacklevel;
>   
> +	#if defined(DO_LSC)
> +	rgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, textureOut).x;
> +	rgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, textureOut).x;
> +	rgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, textureOut).x;
> +	#endif

Any reason for not using a single texture? Feels to me that would be
more efficient? Am I missing why three separate ones are needed?


Regards,
Barnabás Pőcze

> +
>   	/*
>   	 *   CCM is a 3x3 in the format
>   	 *
> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag
> index 1b85196a..f0b9a6cc 100644
> --- a/src/libcamera/shaders/bayer_unpacked.frag
> +++ b/src/libcamera/shaders/bayer_unpacked.frag
> @@ -29,6 +29,10 @@ uniform vec3            blacklevel;
>   uniform float           gamma;
>   uniform float           contrastExp;
>   
> +uniform sampler2D lsc_tex_red;
> +uniform sampler2D lsc_tex_blue;
> +uniform sampler2D lsc_tex_green;
> +
>   float apply_contrast(float value)
>   {
>       // Apply simple S-curve
> @@ -130,6 +134,12 @@ void main(void) {
>   
>       rgb = rgb - blacklevel;
>   
> +    #if defined(DO_LSC)
> +    rgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, center.xy).x;
> +    rgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, center.xy).x;
> +    rgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, center.xy).x;
> +    #endif
> +
>       /*
>        *   CCM is a 3x3 in the format
>        *

Patch
diff mbox series

diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag
index 23747f78..7993ea1d 100644
--- a/src/libcamera/shaders/bayer_1x_packed.frag
+++ b/src/libcamera/shaders/bayer_1x_packed.frag
@@ -70,6 +70,10 @@  uniform vec3 blacklevel;
 uniform float gamma;
 uniform float contrastExp;
 
+uniform sampler2D lsc_tex_red;
+uniform sampler2D lsc_tex_blue;
+uniform sampler2D lsc_tex_green;
+
 float apply_contrast(float value)
 {
 	// Apply simple S-curve
@@ -227,6 +231,12 @@  void main(void)
 
 	rgb = rgb - blacklevel;
 
+	#if defined(DO_LSC)
+	rgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, textureOut).x;
+	rgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, textureOut).x;
+	rgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, textureOut).x;
+	#endif
+
 	/*
 	 *   CCM is a 3x3 in the format
 	 *
diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag
index 1b85196a..f0b9a6cc 100644
--- a/src/libcamera/shaders/bayer_unpacked.frag
+++ b/src/libcamera/shaders/bayer_unpacked.frag
@@ -29,6 +29,10 @@  uniform vec3            blacklevel;
 uniform float           gamma;
 uniform float           contrastExp;
 
+uniform sampler2D lsc_tex_red;
+uniform sampler2D lsc_tex_blue;
+uniform sampler2D lsc_tex_green;
+
 float apply_contrast(float value)
 {
     // Apply simple S-curve
@@ -130,6 +134,12 @@  void main(void) {
 
     rgb = rgb - blacklevel;
 
+    #if defined(DO_LSC)
+    rgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, center.xy).x;
+    rgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, center.xy).x;
+    rgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, center.xy).x;
+    #endif
+
     /*
      *   CCM is a 3x3 in the format
      *