[{"id":37940,"web_url":"https://patchwork.libcamera.org/comment/37940/","msgid":"<0e2d6b19-853c-4b44-a833-0f76c6187bca@ideasonboard.com>","date":"2026-01-26T11:30:37","subject":"Re: [PATCH 4/7] libcamera: shaders: Add LSC support","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2026. 01. 26. 11:42 keltezéssel, Rick ten Wolde írta:\n> From: Xander Pronk <xander.c.pronk@gmail.com>\n> \n> Apply LSC after black-level and before CCM operations.\n> \n> Co-authored-by: Rick ten Wolde <rick_libcamera@wolde.info>\n> Signed-off-by: Rick ten Wolde <rick_libcamera@wolde.info>\n> Signed-off-by: Xander Pronk <xander.c.pronk@gmail.com>\n> ---\n>   src/libcamera/shaders/bayer_1x_packed.frag | 10 ++++++++++\n>   src/libcamera/shaders/bayer_unpacked.frag  | 10 ++++++++++\n>   2 files changed, 20 insertions(+)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 23747f78..7993ea1d 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -70,6 +70,10 @@ uniform vec3 blacklevel;\n>   uniform float gamma;\n>   uniform float contrastExp;\n>   \n> +uniform sampler2D lsc_tex_red;\n> +uniform sampler2D lsc_tex_blue;\n> +uniform sampler2D lsc_tex_green;\n> +\n>   float apply_contrast(float value)\n>   {\n>   \t// Apply simple S-curve\n> @@ -227,6 +231,12 @@ void main(void)\n>   \n>   \trgb = rgb - blacklevel;\n>   \n> +\t#if defined(DO_LSC)\n> +\trgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, textureOut).x;\n> +\trgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, textureOut).x;\n> +\trgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, textureOut).x;\n> +\t#endif\n\nAny reason for not using a single texture? Feels to me that would be\nmore efficient? Am I missing why three separate ones are needed?\n\n\nRegards,\nBarnabás Pőcze\n\n> +\n>   \t/*\n>   \t *   CCM is a 3x3 in the format\n>   \t *\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196a..f0b9a6cc 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -29,6 +29,10 @@ uniform vec3            blacklevel;\n>   uniform float           gamma;\n>   uniform float           contrastExp;\n>   \n> +uniform sampler2D lsc_tex_red;\n> +uniform sampler2D lsc_tex_blue;\n> +uniform sampler2D lsc_tex_green;\n> +\n>   float apply_contrast(float value)\n>   {\n>       // Apply simple S-curve\n> @@ -130,6 +134,12 @@ void main(void) {\n>   \n>       rgb = rgb - blacklevel;\n>   \n> +    #if defined(DO_LSC)\n> +    rgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, center.xy).x;\n> +    rgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, center.xy).x;\n> +    rgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, center.xy).x;\n> +    #endif\n> +\n>       /*\n>        *   CCM is a 3x3 in the format\n>        *","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 9502DC3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 26 Jan 2026 11:30:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 53D2661FCC;\n\tMon, 26 Jan 2026 12:30:40 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 664E261A35\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 26 Jan 2026 12:30:39 +0100 (CET)","from [192.168.33.36] (185.221.142.123.nat.pool.zt.hu\n\t[185.221.142.123])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 38FC422F;\n\tMon, 26 Jan 2026 12:30:02 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"mGSdtMlG\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769427004;\n\tbh=6ZHpX+He+NKxiKi+gaZdfWc/AlBq9twiH6n0swCU14w=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=mGSdtMlGC5FJip1R5lmWFaB2O8Ki+bXr0HXxVYOMZ2Bh6z5OhFNHztd/CtQphhHgq\n\tGAePC3zHY/O4x4cA/2ktLPEWhbjdvjx+oxrF9aewTaYYGnK7GYb1fbHRpYX38tnUB+\n\t6YFdLbKOpsvS8hQc4KnjAk9GCFXiKLxfCZVws5u4=","Message-ID":"<0e2d6b19-853c-4b44-a833-0f76c6187bca@ideasonboard.com>","Date":"Mon, 26 Jan 2026 12:30:37 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 4/7] libcamera: shaders: Add LSC support","To":"Rick ten Wolde <rick.w.ten.wolde@gmail.com>,\n\tlibcamera-devel@lists.libcamera.org","Cc":"xander.c.pronk@gmail.com, derekgielen@outlook.com,\n\t22012540@student.hhs.nl, johannes.goede@oss.qualcomm.com,\n\tRick ten Wolde <rick_libcamera@wolde.info>","References":"<20260126104256.119697-1-rick.w.ten.wolde@gmail.com>\n\t<20260126104256.119697-5-rick.w.ten.wolde@gmail.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260126104256.119697-5-rick.w.ten.wolde@gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38079,"web_url":"https://patchwork.libcamera.org/comment/38079/","msgid":"<f1608c7a-e880-450b-af7d-7455606f37fa@nxsw.ie>","date":"2026-02-04T15:12:49","subject":"Re: [PATCH 4/7] libcamera: shaders: Add LSC support","submitter":{"id":226,"url":"https://patchwork.libcamera.org/api/people/226/","name":"Bryan O'Donoghue","email":"bod.linux@nxsw.ie"},"content":"On 26/01/2026 10:42, Rick ten Wolde wrote:\n> From: Xander Pronk <xander.c.pronk@gmail.com>\n> \n> Apply LSC after black-level and before CCM operations.\n> \n> Co-authored-by: Rick ten Wolde <rick_libcamera@wolde.info>\n> Signed-off-by: Rick ten Wolde <rick_libcamera@wolde.info>\n> Signed-off-by: Xander Pronk <xander.c.pronk@gmail.com>\n> ---\n>   src/libcamera/shaders/bayer_1x_packed.frag | 10 ++++++++++\n>   src/libcamera/shaders/bayer_unpacked.frag  | 10 ++++++++++\n>   2 files changed, 20 insertions(+)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 23747f78..7993ea1d 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -70,6 +70,10 @@ uniform vec3 blacklevel;\n>   uniform float gamma;\n>   uniform float contrastExp;\n> \n> +uniform sampler2D lsc_tex_red;\n> +uniform sampler2D lsc_tex_blue;\n> +uniform sampler2D lsc_tex_green;\n> +\n>   float apply_contrast(float value)\n>   {\n>   \t// Apply simple S-curve\n> @@ -227,6 +231,12 @@ void main(void)\n> \n>   \trgb = rgb - blacklevel;\n> \n> +\t#if defined(DO_LSC)\n> +\trgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, textureOut).x;\n\nA little bit of description about the calculation here would be nice.\n\nAlso since you do the same thing three times, consider a method.\n\n> +\trgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, textureOut).x;\n> +\trgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, textureOut).x;\n> +\t#endif\n> +\n>   \t/*\n>   \t *   CCM is a 3x3 in the format\n>   \t *\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196a..f0b9a6cc 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -29,6 +29,10 @@ uniform vec3            blacklevel;\n>   uniform float           gamma;\n>   uniform float           contrastExp;\n> \n> +uniform sampler2D lsc_tex_red;\n> +uniform sampler2D lsc_tex_blue;\n> +uniform sampler2D lsc_tex_green;\n> +\n>   float apply_contrast(float value)\n>   {\n>       // Apply simple S-curve\n> @@ -130,6 +134,12 @@ void main(void) {\n> \n>       rgb = rgb - blacklevel;\n> \n> +    #if defined(DO_LSC)\n> +    rgb.r = rgb.r + rgb.r * 3.0 * texture2D(lsc_tex_red, center.xy).x;\n> +    rgb.g = rgb.g + rgb.g * 3.0 * texture2D(lsc_tex_green, center.xy).x;\n> +    rgb.b = rgb.b + rgb.b * 3.0 * texture2D(lsc_tex_blue, center.xy).x;\n> +    #endif\n> +\n>       /*\n>        *   CCM is a 3x3 in the format\n>        *\n> --\n> 2.51.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id A7A8CC31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  4 Feb 2026 15:12:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0956262039;\n\tWed,  4 Feb 2026 16:12:57 +0100 (CET)","from tor.source.kernel.org (tor.source.kernel.org\n\t[IPv6:2600:3c04:e001:324:0:1991:8:25])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C1EFC61FBF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Feb 2026 16:12:55 +0100 (CET)","from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby tor.source.kernel.org (Postfix) with ESMTP id 53161600C4;\n\tWed,  4 Feb 2026 15:12:54 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 58C9FC4CEF7;\n\tWed,  4 Feb 2026 15:12:52 +0000 (UTC)"],"Message-ID":"<f1608c7a-e880-450b-af7d-7455606f37fa@nxsw.ie>","Date":"Wed, 4 Feb 2026 15:12:49 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 4/7] libcamera: shaders: Add LSC support","To":"Rick ten Wolde <rick.w.ten.wolde@gmail.com>,\n\tlibcamera-devel@lists.libcamera.org","Cc":"xander.c.pronk@gmail.com, derekgielen@outlook.com,\n\t22012540@student.hhs.nl, johannes.goede@oss.qualcomm.com,\n\tRick ten Wolde <rick_libcamera@wolde.info>","References":"<20260126104256.119697-1-rick.w.ten.wolde@gmail.com>\n\t<Y_Gmgc_mbg9iU-V5rJIhtDU2dLzM-v3FI7GBrrZlQ-u-OLeI8OUHRmckd4DUt9PJdwdG6HgbyGf6afpu3gMzMg==@protonmail.internalid>\n\t<20260126104256.119697-5-rick.w.ten.wolde@gmail.com>","From":"Bryan O'Donoghue <bod.linux@nxsw.ie>","Content-Language":"en-US","In-Reply-To":"<20260126104256.119697-5-rick.w.ten.wolde@gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]