[{"id":38652,"web_url":"https://patchwork.libcamera.org/comment/38652/","msgid":"<20260424211221.GC3219146@killaraus.ideasonboard.com>","date":"2026-04-24T21:12:21","subject":"Re: [RFC PATCH v3 5/7] libcamera: shaders: Add LSC support","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Apr 24, 2026 at 10:02:51PM +0200, Milan Zamazal wrote:\n> From: Xander Pronk <xander.c.pronk@gmail.com>\n> \n> Lens shading correction should be applied after black level\n> subtraction (in order to make the computations with meaningful values)\n> and before white balance (especially before white balance stats are\n> computed).\n> \n> Note that lens shading correction depends on temperature, which depends\n> on white balance, so there is a chicken-egg problem.  Currently, we\n> determine white balance and temperature from the preceding frame.\n\nWhy is there a chicken-egg problem specific to LSC ?\n\n> Co-developed-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> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/libcamera/shaders/bayer_1x_packed.frag | 9 +++++++++\n>  src/libcamera/shaders/bayer_unpacked.frag  | 9 +++++++++\n>  2 files changed, 18 insertions(+)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 23747f78a..dfa787c22 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> +#if defined(APPLY_LSC)\n> +uniform sampler2D lsc_tex;\n> +#endif\n> +\n>  float apply_contrast(float value)\n>  {\n>  \t// Apply simple S-curve\n> @@ -227,6 +231,11 @@ void main(void)\n>  \n>  \trgb = rgb - blacklevel;\n>  \n> +\t#if defined(APPLY_LSC)\n\nLet's align that to the left column.\n\n> +        /* Transformation of the lsc_tex value range: 0.0..1.0 -> 1.0..3.0 */\n\nMix of tabs and spaces for indentation. Is there a good linter for GLSL\nthat we could use in CI ?\n\nI assume this is meant to obtain gains from x1.0 to x4.0. The range\nseems fine, but the comment would benefit from explaining it more\nclearly. Maybe something like\n\n\t/*\n\t * Map lsc_tex RGB values from the [0.0, 1.0] range to [x1.0, x4.0]\n\t * gains.\n\t */\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\trgb = rgb + rgb * 3.0 * texture2D(lsc_tex, textureOut).rgb;\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 1b85196ae..e10d55c0a 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> +#if defined(APPLY_LSC)\n> +uniform sampler2D lsc_tex;\n> +#endif\n> +\n>  float apply_contrast(float value)\n>  {\n>      // Apply simple S-curve\n> @@ -130,6 +134,11 @@ void main(void) {\n>  \n>      rgb = rgb - blacklevel;\n>  \n> +    #if defined(APPLY_LSC)\n> +    /* Transformation of the lsc_tex value range: 0.0..1.0 -> 1.0..3.0 */\n> +    rgb = rgb + rgb * 3.0 * texture2D(lsc_tex, center.xy).rgb;\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 4A64FBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Apr 2026 21:12:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7CFAF62F86;\n\tFri, 24 Apr 2026 23:12:24 +0200 (CEST)","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 40AE462E6A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 23:12:23 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-703d-e500--2a1.rev.dnainternet.fi\n\t[IPv6:2001:14ba:703d:e500::2a1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D85061283;\n\tFri, 24 Apr 2026 23:10:42 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"JZaQ44RW\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1777065043;\n\tbh=OdmW8+3iLSpqD7EaixQxO0pI4N5Cl9tb3+L9OyLq9WA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=JZaQ44RWMmmMMJQQi+ZtdzzqPWd9c6NeMyX7Xx5/t9cc1RzZH7TIQyicDhZhzLH73\n\thbMV7QMAbs1lT1/EINswCEZ/ElylVlYHD8QRJVAp8Erew6odFIHPHQgv31RhfeSbh7\n\tyFTxtrOKbizZzo8qkfitKqRi1Ja4qS5IKf2e02SA=","Date":"Sat, 25 Apr 2026 00:12:21 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tXander Pronk <xander.c.pronk@gmail.com>,\n\tBryan O'Donoghue <bod.linux@nxsw.ie>,\n\tHans de Goede <johannes.goede@oss.qualcomm.com>,\n\tRick ten Wolde <rick_libcamera@wolde.info>","Subject":"Re: [RFC PATCH v3 5/7] libcamera: shaders: Add LSC support","Message-ID":"<20260424211221.GC3219146@killaraus.ideasonboard.com>","References":"<20260424200255.356798-1-mzamazal@redhat.com>\n\t<20260424200255.356798-6-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260424200255.356798-6-mzamazal@redhat.com>","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":38719,"web_url":"https://patchwork.libcamera.org/comment/38719/","msgid":"<85340758sb.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-05-04T18:28:20","subject":"Re: [RFC PATCH v3 5/7] libcamera: shaders: Add LSC support","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n\n> On Fri, Apr 24, 2026 at 10:02:51PM +0200, Milan Zamazal wrote:\n>> From: Xander Pronk <xander.c.pronk@gmail.com>\n>> \n>\n>> Lens shading correction should be applied after black level\n>> subtraction (in order to make the computations with meaningful values)\n>> and before white balance (especially before white balance stats are\n>> computed).\n>> \n>> Note that lens shading correction depends on temperature, which depends\n>> on white balance, so there is a chicken-egg problem.  Currently, we\n>> determine white balance and temperature from the preceding frame.\n>\n> Why is there a chicken-egg problem specific to LSC ?\n\nI reworded the paragraph.\n\n>> Co-developed-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>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/libcamera/shaders/bayer_1x_packed.frag | 9 +++++++++\n>>  src/libcamera/shaders/bayer_unpacked.frag  | 9 +++++++++\n>>  2 files changed, 18 insertions(+)\n>> \n>> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n>> index 23747f78a..dfa787c22 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>> +#if defined(APPLY_LSC)\n>> +uniform sampler2D lsc_tex;\n>> +#endif\n>> +\n>>  float apply_contrast(float value)\n>>  {\n>>  \t// Apply simple S-curve\n>> @@ -227,6 +231,11 @@ void main(void)\n>>  \n>>  \trgb = rgb - blacklevel;\n>>  \n>> +\t#if defined(APPLY_LSC)\n>\n> Let's align that to the left column.\n>\n>> +        /* Transformation of the lsc_tex value range: 0.0..1.0 -> 1.0..3.0 */\n>\n> Mix of tabs and spaces for indentation. \n\nAnd packed x unpacked shaders use different styles (tabs x spaces)...\n\n> Is there a good linter for GLSL that we could use in CI ?\n\nI don't know.  There are some linters,\ne.g. https://github.com/evanw/glslx, but I couldn't find some available\nin distros.\n\n> I assume this is meant to obtain gains from x1.0 to x4.0. The range\n> seems fine, but the comment would benefit from explaining it more\n> clearly. Maybe something like\n>\n> \t/*\n> \t * Map lsc_tex RGB values from the [0.0, 1.0] range to [x1.0, x4.0]\n> \t * gains.\n> \t */\n\nI switched to float eventually.  We may switch back to bytes if it\ndoesn't work across different environments but hopefully it's not\nneeded.\n\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>\n>> +\trgb = rgb + rgb * 3.0 * texture2D(lsc_tex, textureOut).rgb;\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 1b85196ae..e10d55c0a 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>> +#if defined(APPLY_LSC)\n>> +uniform sampler2D lsc_tex;\n>> +#endif\n>> +\n>>  float apply_contrast(float value)\n>>  {\n>>      // Apply simple S-curve\n>> @@ -130,6 +134,11 @@ void main(void) {\n>>  \n>>      rgb = rgb - blacklevel;\n>>  \n>> +    #if defined(APPLY_LSC)\n>> +    /* Transformation of the lsc_tex value range: 0.0..1.0 -> 1.0..3.0 */\n>> +    rgb = rgb + rgb * 3.0 * texture2D(lsc_tex, center.xy).rgb;\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 C0028BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  4 May 2026 18:28:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 665B563038;\n\tMon,  4 May 2026 20:28:27 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 27A0463030\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  4 May 2026 20:28:26 +0200 (CEST)","from mail-wr1-f71.google.com (mail-wr1-f71.google.com\n\t[209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-184-NOab9aakO_-CdC3WOyC3GA-1; Mon, 04 May 2026 14:28:24 -0400","by mail-wr1-f71.google.com with SMTP id\n\tffacd0b85a97d-43d789cebcfso3422151f8f.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 04 May 2026 11:28:23 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-4.net.vodafone.cz. [77.48.47.4])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-48d14d1b19fsm885075e9.26.2026.05.04.11.28.21\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 04 May 2026 11:28:21 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"cg9jOq4R\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1777919305;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=BcHXcUFHtjGVbm5nqtBwm+9GGGwdY/oGW5ysDxaxLH8=;\n\tb=cg9jOq4RDq48939+Zo6BNc2A8pGa0E3jly4FhcJ88LQ8f6HBei4Mz6PSuhosCHU+Zt86Sf\n\tAqrJbhbCfHVERZYUTRBvP+JC1zB3WwJwuXWao2UZhUa3HnMGy0BVX2CsJDMNcLTf2TxFcL\n\tubDw/+h5OvYF9tn6gRbOlYWeo5gk79c=","X-MC-Unique":"NOab9aakO_-CdC3WOyC3GA-1","X-Mimecast-MFC-AGG-ID":"NOab9aakO_-CdC3WOyC3GA_1777919303","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1777919303; x=1778524103;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=BcHXcUFHtjGVbm5nqtBwm+9GGGwdY/oGW5ysDxaxLH8=;\n\tb=hLeiBjc23ZkX64GP73aAF3kxbQS2dqgpb1hEom35Qu42Vz7dVxiSShuAoC+8C3zLH0\n\td/78RBSw6zbwCambGNTjZr9mfo++yY5OHYmWOUc5q8jvycXY2+x90u8khe+eFmRvfzsd\n\tqtykyC7NVo5KqtBRyKCXdv0dciXAiLRuImZ8cJVtku0gXqHruxLI5yBC3lJO2wpzURMx\n\tnE4dcScxDyidz0IreJaIarWBKOxjAKVMCM2WZKVoPlVilX/n9EXpDcBPY2rjouyr/kO9\n\tEdlMNuOt/cOIVx50SlQctKWjnxpl5jWUIyFacYUZMetY2GsgbEkGtAwxzTkaEZ3Ujv/S\n\t9t4w==","X-Gm-Message-State":"AOJu0Yw4AspSYnxJvPsOWp7WtbKEwGodSe6s5PvuzWCCdbGJYU38Pp8r\n\tLJhaiUrzFNjXoQFh3mWmdzl0H3/pIhOfk3IbGSpHUEDWCBNDR9CsLr41MGf3lJVLjVpNidBJ3bc\n\tWjAf3+3MphhXOX7sz+dvv2BNdu9pMLsqO0nAYsCeUAD/lPqGcUxF9MT9ul7W7Z9pXY4qHSyn671\n\t0=","X-Gm-Gg":"AeBDievWztvoPys3lj+3EcF7TRG322uEFZDlgMHwxgJskxOJKmky3Cia7Pg8x609MxO\n\ta9dvU5jhTRbI2g+k1FdJuagzGYKnd7lwAw6irbtiOSUQLxkjDSn+QpWN7amvDrboNMg9F8td8H6\n\tEOVBvLNrrDNxEH4ypUMoFwxEaX/7Ge2TkXkFioa9q9eHJiysjIcqGKJlIFoYdIA6i0B7GUW9B2/\n\tYsc11wgdKUn1xC8yTyO0JQT8jhaDHzaIl2tX8u1/ywLoVsuJbeFxYhEuBlsOdvCu5uxKAwq6WXK\n\tmwnEpJTXocwvbVQVMrV8mn4iS+lsvZ8143CqWE+SBemwRL4RzvytF3k9t1m7cgw4sBcRzlfQM4h\n\tR+CtUu9BCPXj9VIPLybPw2+i8A7PWoYLwkkmYhTPVua8vuXtnP7za8Bji+jAvWzvBqHrp1Kh/tM\n\thRBmEimbE/5w==","X-Received":["by 2002:a05:600c:528f:b0:48a:79d8:a8d6 with SMTP id\n\t5b1f17b1804b1-48d14243e52mr10811695e9.7.1777919302787; \n\tMon, 04 May 2026 11:28:22 -0700 (PDT)","by 2002:a05:600c:528f:b0:48a:79d8:a8d6 with SMTP id\n\t5b1f17b1804b1-48d14243e52mr10811435e9.7.1777919302400; \n\tMon, 04 May 2026 11:28:22 -0700 (PDT)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Xander Pronk\n\t<xander.c.pronk@gmail.com>, Bryan O'Donoghue <bod.linux@nxsw.ie>, Hans\n\tde Goede <johannes.goede@oss.qualcomm.com>,  Rick ten Wolde\n\t<rick_libcamera@wolde.info>","Subject":"Re: [RFC PATCH v3 5/7] libcamera: shaders: Add LSC support","In-Reply-To":"<20260424211221.GC3219146@killaraus.ideasonboard.com> (Laurent\n\tPinchart's message of \"Sat, 25 Apr 2026 00:12:21 +0300\")","References":"<20260424200255.356798-1-mzamazal@redhat.com>\n\t<20260424200255.356798-6-mzamazal@redhat.com>\n\t<20260424211221.GC3219146@killaraus.ideasonboard.com>","Date":"Mon, 04 May 2026 20:28:20 +0200","Message-ID":"<85340758sb.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"Z9gU8EmT5ctZmmdM3oWKqHeTPQAtq5bkUd3VmXOGuJM_1777919303","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]