[{"id":38171,"web_url":"https://patchwork.libcamera.org/comment/38171/","msgid":"<b7749518-3f0f-49a6-9b6e-3cd1f48dc026@linaro.org>","date":"2026-02-11T13:27:02","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":175,"url":"https://patchwork.libcamera.org/api/people/175/","name":"Bryan O'Donoghue","email":"bryan.odonoghue@linaro.org"},"content":"On 11/02/2026 13:17, Milan Zamazal wrote:\n> In GPU ISP fragment shaders, the black level is simply subtracted from\n> the pixel value.  This means the highest pixel values can never be\n> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n> this by spreading the resulting value to the whole 0.0..1.0 range.\n> \n> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n> than 1.0, preventing division by zero here.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>   src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>   src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>   2 files changed, 2 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 23747f78a..06ddc040b 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -225,7 +225,7 @@ void main(void)\n>   \t\t\tvec3(patterns.y, C, patterns.x) :\n>   \t\t\tvec3(patterns.wz, C));\n>   \n> -\trgb = rgb - blacklevel;\n> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>   \n>   \t/*\n>   \t *   CCM is a 3x3 in the format\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196ae..98dea512c 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -128,7 +128,7 @@ void main(void) {\n>               vec3(PATTERN.w, C, PATTERN.z) :\n>               vec3(PATTERN.yx, C));\n>   \n> -    rgb = rgb - blacklevel;\n> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>   \n>       /*\n>        *   CCM is a 3x3 in the format\nReviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>","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 1370EBD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 13:27:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C112D621B2;\n\tWed, 11 Feb 2026 14:27:05 +0100 (CET)","from mail-wr1-x433.google.com (mail-wr1-x433.google.com\n\t[IPv6:2a00:1450:4864:20::433])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EAE47620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 14:27:03 +0100 (CET)","by mail-wr1-x433.google.com with SMTP id\n\tffacd0b85a97d-4362197d174so1347733f8f.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 05:27:03 -0800 (PST)","from [192.168.0.40] (188-141-3-146.dynamic.upc.ie. [188.141.3.146])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-43783d58b4fsm4437795f8f.15.2026.02.11.05.27.02\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tWed, 11 Feb 2026 05:27:02 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"h3niPKqg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1770816423; x=1771421223;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=V2iaUMZ2bGMmXhHD4lPFn62VrFT6NTT9jub40oI1b5M=;\n\tb=h3niPKqgqEV5dNAj0+mCx0WQibYJh3X8wWVI+ctBpmmX4nio/JkjwbkjFJjc5kTg/K\n\tILJyxm0lFxFBgNw0NVV5K/WtzAkuP8t+xTHUlCxoamlnKP256nENp2eEYUnjor5qwhTx\n\tbTnj1T3sBYY+vHzcCsXe71KENGeOvMSVpQ7meTDkEq/cYCPN/WmzfHVwX8xnpBW7YPwv\n\t/9Bz31Jtjq36L/v4mx8t3vnNht1/BCnEWhRQ+EjcsTSU28ivDDIecimHTM7OJ/sOVI6m\n\tBrOGC414L+OKuk149cV1xEBdSM5dnlDnwPJ18R8+zSOCH0HZF/lXruYkzl7Zx7z5/UKs\n\ttzVA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1770816423; x=1771421223;\n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=V2iaUMZ2bGMmXhHD4lPFn62VrFT6NTT9jub40oI1b5M=;\n\tb=aYLA+iaJj3EqH900RXQeBCP5Ha+QfePA8pFbp2j63/tN9IswmELYCEpoO/lqLumU5D\n\tHz0Qqb9jZ8kHYNtMxPxqHn+og75X8xWYYsoAHQw6M0hODxyzImeXWmjfzUcezgiZFLYI\n\tkemj0u6WwWZV05pI/RFmldOk7I3SlUUYsLZX2uFulHTlWrQM85EBIYkKGTDMP0QsMk+a\n\tdP2++Td6mdns8o3i94QVfpSh/LoL/mzB/0ZruqRa7076tz/rCb4bHCUNMVMDCOhCrNOU\n\tPYsBVluHRZKpeppzOST65ZAuwl+fQTIZYgxdQaC3U1dvO1I9qXAlZWRZmCHMag8t/DyR\n\twfkQ==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCUOPla9i1TXfvsxCnAlMJMhwbhXWzFUB5LvWZUSTndF2wXrQQV0PwIo0RhkbpOO8EbTA8P+3lKNkOgFBrNgOKY=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YxJc0HNbksL9v5ib+9CCZjkqNe1PiNh7neUZm82zG5wRSeJlamO\n\tKP3gdzA6EMnN9sYMEsE4+l3VGAbJ9gC/4SVrDqGf1gLwRaV4sP9SlMGBJa0OEkZM617zaHRoScM\n\tQm/hV2Kw=","X-Gm-Gg":"AZuq6aJXzN4aXaaIeTVMQWkNRWuGM3VOXisue21O0yll6zf8fRBaE/fzCRyWLrw1HQC\n\t6XpJ4PiILcsosAdvkMOHvIx/9SiSeziYQHUlefWCIPcTPcPbGOLD+IxYbsD7zo5JobxDfvvVlCB\n\tGD93RNCCMiPr+3o3g+NpktoxE4466+MRjN5TUTubAkq+mTDqOPKfC61vtczCUH+ndKXZ9wp9YdG\n\tyA8Np+f7/aNEHrPMHBHS4GkMJBJENxLtPrW6/eo+nPPJXLLA7PUtHCFaOQWAdXyFQ9ahZ6grkFX\n\ti8dQ2YTjLin+39yDwpkzKb+zaGK+PJKKQLZvmXVhvee9p9NiKllc8m6TSpBf3Qv5qH5Zg0rs3VC\n\ttRrIz1WZXcXIYgOv3QXq2XGEzvSelcJ2Bi1FWOIFrMw8eJLBUbsuAmlC/17P2Wto18USLwOtS+S\n\t7aY/5bjoysuwlp8EPjLtwRjUdNZi8n3wLFRSrwA4ZGi1GUievPrtaVyFSXYMcTyx5N","X-Received":"by 2002:a05:6000:3101:b0:437:6c07:998f with SMTP id\n\tffacd0b85a97d-4376c079f9dmr17876607f8f.45.1770816423403; \n\tWed, 11 Feb 2026 05:27:03 -0800 (PST)","Message-ID":"<b7749518-3f0f-49a6-9b6e-3cd1f48dc026@linaro.org>","Date":"Wed, 11 Feb 2026 13:27:02 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>","From":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Content-Language":"en-US","In-Reply-To":"<20260211131728.96413-3-mzamazal@redhat.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>"}},{"id":38173,"web_url":"https://patchwork.libcamera.org/comment/38173/","msgid":"<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com>","date":"2026-02-11T15:05:17","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 02. 11. 14:17 keltezéssel, Milan Zamazal írta:\n> In GPU ISP fragment shaders, the black level is simply subtracted from\n> the pixel value.  This means the highest pixel values can never be\n> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n> this by spreading the resulting value to the whole 0.0..1.0 range.\n> \n> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n> than 1.0, preventing division by zero here.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>   src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>   src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>   2 files changed, 2 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 23747f78a..06ddc040b 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -225,7 +225,7 @@ void main(void)\n>   \t\t\tvec3(patterns.y, C, patterns.x) :\n>   \t\t\tvec3(patterns.wz, C));\n>   \n> -\trgb = rgb - blacklevel;\n> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n\nThis may be a dumb question, but how come this is not written as:\n\n   rgb = clamp(rgb, blackLevel, 1.0) / (1.0 - blackLevel)\n\nCan't negative values cause issues in later calculations?\n\n\n>   \n>   \t/*\n>   \t *   CCM is a 3x3 in the format\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196ae..98dea512c 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -128,7 +128,7 @@ void main(void) {\n>               vec3(PATTERN.w, C, PATTERN.z) :\n>               vec3(PATTERN.yx, C));\n>   \n> -    rgb = rgb - blacklevel;\n> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>   \n>       /*\n>        *   CCM is a 3x3 in the format","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 25613BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 15:05:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4AE2B621B0;\n\tWed, 11 Feb 2026 16:05:24 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1B649620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 16:05:22 +0100 (CET)","from [192.168.33.65] (185.221.141.206.nat.pool.zt.hu\n\t[185.221.141.206])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5632EC6F;\n\tWed, 11 Feb 2026 16:04:34 +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=\"OJGpE4mB\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770822274;\n\tbh=WXL7dxNpyy2K+C9glF4vXrO/3MvK8hwlUhsuYYOlhRM=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=OJGpE4mBQ49negpb42R9VR5rwtQVj5shCe3Lu8+xmiFEXtnfdh3Wzf8syhoD7A+SH\n\tbx+764bobESIDDD5UEKZHH6p8zkwdC/PcTqFHhiikl1Q037LZ3XYkmw9Ajsk+inlp6\n\t18kiHA8CKkG6FSGgyEU2fwOvGIQQ7Ip46tYUhesw=","Message-ID":"<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com>","Date":"Wed, 11 Feb 2026 16:05:17 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260211131728.96413-3-mzamazal@redhat.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":38175,"web_url":"https://patchwork.libcamera.org/comment/38175/","msgid":"<85pl6bwb60.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-02-11T15:29:59","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n\n> 2026. 02. 11. 14:17 keltezéssel, Milan Zamazal írta:\n>> In GPU ISP fragment shaders, the black level is simply subtracted from\n>> the pixel value.  This means the highest pixel values can never be\n>> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n>> this by spreading the resulting value to the whole 0.0..1.0 range.\n>> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n>> than 1.0, preventing division by zero here.\n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>   src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>>   src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>>   2 files changed, 2 insertions(+), 2 deletions(-)\n>> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n>> index 23747f78a..06ddc040b 100644\n>> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n>> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n>> @@ -225,7 +225,7 @@ void main(void)\n>>   \t\t\tvec3(patterns.y, C, patterns.x) :\n>>   \t\t\tvec3(patterns.wz, C));\n>>   -\trgb = rgb - blacklevel;\n>> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>\n> This may be a dumb question, but how come this is not written as:\n>\n>   rgb = clamp(rgb, blackLevel, 1.0) / (1.0 - blackLevel)\n>\n> Can't negative values cause issues in later calculations?\n\nCurrently not, because CCM may contain negative values and produce\nnegative pixel values anyway.  The resulting value is clamped later.  So\nin case rgb < blackLevel (not expected, but still possible), the most\nlikely result (depending on the CCM) is that it ends up being 0\neventually.\n\nThat said, I think yes, clamping the value here is better, to prevent\npossible future trouble once more functionality is added to the shaders.\n\n>>     \t/*\n>>   \t *   CCM is a 3x3 in the format\n>> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n>> index 1b85196ae..98dea512c 100644\n>> --- a/src/libcamera/shaders/bayer_unpacked.frag\n>> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n>> @@ -128,7 +128,7 @@ void main(void) {\n>>               vec3(PATTERN.w, C, PATTERN.z) :\n>>               vec3(PATTERN.yx, C));\n>>   -    rgb = rgb - blacklevel;\n>> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>>         /*\n>>        *   CCM is a 3x3 in the format","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 342F7C3292\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 15:30:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4B2A9621B4;\n\tWed, 11 Feb 2026 16:30:07 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 32F50620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 16:30:06 +0100 (CET)","from mail-wm1-f72.google.com (mail-wm1-f72.google.com\n\t[209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-205-xMqM8JR0M0iQiTQ3pjt15g-1; Wed, 11 Feb 2026 10:30:03 -0500","by mail-wm1-f72.google.com with SMTP id\n\t5b1f17b1804b1-480717a8ef9so9346015e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 07:30:02 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-4836131d48fsm9081785e9.24.2026.02.11.07.29.59\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 11 Feb 2026 07:30:00 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"YuRHG0Zp\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1770823804;\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\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=bSzJG3c0FaYCfRO/UKF7H2bFcqkwZHou+0cIMTAUy40=;\n\tb=YuRHG0ZpzNEX1XHaRBGNSmCtknSroWKKaJ4ld69A+rGTOMkWReqUd+qPfeMQHhZFQB7jgL\n\tH3COVNkwF/A+lEO1Z5mgcVdwel3se2tQc9QZerAfJGnCA5sBbwsWYBogEpmKobMoEa7K6K\n\tb7bWk0oFJjad72mpzgX5LZ7fdWIXONc=","X-MC-Unique":"xMqM8JR0M0iQiTQ3pjt15g-1","X-Mimecast-MFC-AGG-ID":"xMqM8JR0M0iQiTQ3pjt15g_1770823802","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1770823801; x=1771428601;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=7CV8HfWjaWHwD9ljmNCZVdj3xZMZZoF2PvOIgRXa2bM=;\n\tb=d/7CNZ46hFW6HsNI9GKlx/1LmuKxECRLzp0G5CDjRKHaEm/X2Pyx7svu0HcPxfXo1z\n\tTn3erDr7vudKIOsMTwqPbmcvuBIFAGH3OHG5A3lmECAsFum6C1wehfqnbGnf1HVUGM4L\n\tvoRkDwzpkWMeB/YIwzqoSd6yqGSO8VaEXO9GSzuxJKUbr1Sp42+J1MgozoxJAjY4sUEr\n\tEAi7HNU9sL4bqJ5bSfSJHR725yoG4iaHf5XgTpelJoUNucq7HqBVBHI6v9LJPB4mYWXZ\n\tk4GdwKGLGu1ivnacZ3G9CRPxwiOQW8wxZbj//+jFGNQ9NitjRniSO75Tx4mN1IVFlczy\n\tXv1g==","X-Gm-Message-State":"AOJu0YwrVo+/P3grCRDOqkdabO3LdtfR93NWcdZKxtWcyBoAlDAdgzz8\n\tMtEa1SfOuryJ6i5TyQX4QtVhuSkh4wMBcE+qMAYkRQ+Dz7tg3qWBztvHKedi2xMluRaF5yMRq8T\n\tpmwdpGO7ox4THavUNpbdRt3GlJ8KMQ3rpqjHpSKPsQrXUp49YK3wWGHlYNBmMr5iHbkMoRreEgZ\n\tR1quuDlKM=","X-Gm-Gg":"AZuq6aIU5wwpsLuqkLxtRcJ1C9TdnEO2vbw6mQMorGkdDRUHaVVf7JisYA16VSXBNSB\n\tDB80owliEVBLkYrJUCZOYEHZC5X4ceM0jx2P4+M5gIx2oCeVmvayeAQ1z0CCO5qs+8ubHBzPH5I\n\te7KV9grKLxsjOFpp3445Uvq4ja9ei00vqeRGOmyUz+jgk6oGvCrreCHw9y8vcfjZTTVkk/2R61R\n\tD+2olddHutFfPV2ezhwDWM5tjXtxKR7r+EgkQakcg+FjEmtvjy10cjaHf2/HwWThjGXy/attz7w\n\tAMZ3n+N6kN0ByTx+PBglb0KRJC4lDqGZiTDrK5t2ZdtlHH9Ytv0YvjTEJ1e+1NDO1Re736LQjXS\n\tAaLr78rs5PnIzwULRGes//AGg1+J3RwzL7pS1BYlxNPHVBj0ulNDJenOgjm+BFKMr6KolBii7vg\n\tI=","X-Received":["by 2002:a05:600c:6992:b0:46f:a2ba:581f with SMTP id\n\t5b1f17b1804b1-48350547ed6mr97491225e9.16.1770823801432; \n\tWed, 11 Feb 2026 07:30:01 -0800 (PST)","by 2002:a05:600c:6992:b0:46f:a2ba:581f with SMTP id\n\t5b1f17b1804b1-48350547ed6mr97490745e9.16.1770823800868; \n\tWed, 11 Feb 2026 07:30:00 -0800 (PST)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>,  Bryan O'Donoghue\n\t<bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","In-Reply-To":"<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com> (\n\t=?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Wed,\n\t11 Feb 2026  16:05:17 +0100\")","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com>","Date":"Wed, 11 Feb 2026 16:29:59 +0100","Message-ID":"<85pl6bwb60.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":"jwajA0ncdrYzeuhvXvfiMJ5voZqDNXuqvoV3R6wNzEQ_1770823802","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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":38176,"web_url":"https://patchwork.libcamera.org/comment/38176/","msgid":"<85ldgzwadm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-02-11T15:47:01","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Milan Zamazal <mzamazal@redhat.com> writes:\n\n> Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n>\n>> 2026. 02. 11. 14:17 keltezéssel, Milan Zamazal írta:\n>>> In GPU ISP fragment shaders, the black level is simply subtracted from\n>>> the pixel value.  This means the highest pixel values can never be\n>>> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n>>> this by spreading the resulting value to the whole 0.0..1.0 range.\n>>> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n>>> than 1.0, preventing division by zero here.\n>>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>>> ---\n>>>   src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>>>   src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>>>   2 files changed, 2 insertions(+), 2 deletions(-)\n>>> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n>>> index 23747f78a..06ddc040b 100644\n>>> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n>>> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n>>> @@ -225,7 +225,7 @@ void main(void)\n>>>   \t\t\tvec3(patterns.y, C, patterns.x) :\n>>>   \t\t\tvec3(patterns.wz, C));\n>>>   -\trgb = rgb - blacklevel;\n>>> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>>\n>> This may be a dumb question, but how come this is not written as:\n>>\n>>   rgb = clamp(rgb, blackLevel, 1.0) / (1.0 - blackLevel)\n\nBTW did you actually mean\n\n  rgb = (clamp(rgb, blacklevel, 1.0) - blacklevel) / (1.0 - blacklevel)\n\nor\n\n  rgb = clamp((rgb - blacklevel) / (1.0 - blacklevel), 0.0, 1.0)\n\n?\n\n(I don't think there is a simpler way to express it using common GLSL\nfunctions.)\n\n>> Can't negative values cause issues in later calculations?\n>\n> Currently not, because CCM may contain negative values and produce\n> negative pixel values anyway.  The resulting value is clamped later.  So\n> in case rgb < blackLevel (not expected, but still possible), the most\n> likely result (depending on the CCM) is that it ends up being 0\n> eventually.\n>\n> That said, I think yes, clamping the value here is better, to prevent\n> possible future trouble once more functionality is added to the shaders.\n>\n>>>     \t/*\n>>>   \t *   CCM is a 3x3 in the format\n>>> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n>>> index 1b85196ae..98dea512c 100644\n>>> --- a/src/libcamera/shaders/bayer_unpacked.frag\n>>> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n>>> @@ -128,7 +128,7 @@ void main(void) {\n>>>               vec3(PATTERN.w, C, PATTERN.z) :\n>>>               vec3(PATTERN.yx, C));\n>>>   -    rgb = rgb - blacklevel;\n>>> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>>>         /*\n>>>        *   CCM is a 3x3 in the format","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 F04A4BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 15:47:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 20C64621B2;\n\tWed, 11 Feb 2026 16:47:09 +0100 (CET)","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 3256A620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 16:47:07 +0100 (CET)","from mail-wm1-f69.google.com (mail-wm1-f69.google.com\n\t[209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-468-02aA7rpeN_6FerUA0iBwaQ-1; Wed, 11 Feb 2026 10:47:04 -0500","by mail-wm1-f69.google.com with SMTP id\n\t5b1f17b1804b1-4801d21c280so63134445e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 07:47:04 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-4835a627c96sm34349545e9.2.2026.02.11.07.47.01\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 11 Feb 2026 07:47:02 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"TvdwMqQg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1770824825;\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\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=RcgcQ3cKhSEghpfG4rQ7c8wWpBHFCEXyG4fVojAJiac=;\n\tb=TvdwMqQgxewJPV4xMRGMS8xfku1DR4XiVIoQZQFuKz2RzV27+1il5E7cKi8W9O0g7StuyY\n\tjM19MXkrK42muxk/kAiUr1XYC4j4Jj4mq8BbsSz6BwNIDcWNB49AwUKoszjzBLloxZpPye\n\tubVedgdBTZTqHVWPz+bhQX53y4fMQBk=","X-MC-Unique":"02aA7rpeN_6FerUA0iBwaQ-1","X-Mimecast-MFC-AGG-ID":"02aA7rpeN_6FerUA0iBwaQ_1770824823","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1770824823; x=1771429623;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=APA/XHb28oCav6+AxDsSS3IVCuU3jvwKKrMXuZX8tNo=;\n\tb=F+S0hPFRFc67LT85tnKz9hdy9AyEkCG6u6OhAUAwWxqEzaN3bX1RYEL0DIQrdD2ycn\n\ttH51bStHB9514IOetA7srb7i5RAecndVH4baivMU1Cy737CFVbXJlbu78zkOpP9nQRGd\n\thsd3Vq1p5yrkQSPKlOgazgTBKYGo0FAckDUo4zLSUVk6FhpeBFJriuNVLajXHa74rOcY\n\t9VOkTgDNYqeVCiMd3cRy/0E7pBjWbww+OQ9ABC+VEw0U22/IdtqL2VbWvTbwEiYOqgOm\n\tEqnlNCk+t3qRSFWFFH10lW81e9/zC86CxxmtAXMCKnb0w7Tl/zWTz46shVY9T87zYrF/\n\thmqw==","X-Gm-Message-State":"AOJu0YyTi63rgZeVxxzA1ACJVU93DhF7Pm4V8ZCaHheEpAnyWajppckD\n\t8N58604/2LOj5zG4KEd4mY1NZawD9Jojc3bbvWjBEIkWZcLEo/KCc+7JSyHzAiFg82H0Xx3Q6B/\n\tS30wHopGsxtFrDj6xamKnjYxbUvZ69t+FcbJXBLNmDtRAYDoYPtezXTGmBp7pVltxI83rDR7qIO\n\tE=","X-Gm-Gg":"AZuq6aLwGJvsWF7ugaE3rGl+CxJI5gMooAQjeTJ+gvrR4qTGwHCV/79djaao8rKAomV\n\todUiPcDeM5Ae/T7yuLkbeH6SsPmk8EyUrdo6FOU22NxmejwE1wmxwnfX6sFX8oDwP2JfzapbWxN\n\t886/r5O9/yr2wfvLF9bcTv0BPpkEgjBImPx8vJfUBMpDBIGvJIbt69T9Z7UYZkrVOzUAp/pr4Ei\n\t2abvz2TXSrr4ZVDxKnGmPJbcO9EzSkvF1dPecAFtlfjMow1MhcOhQIN86xiHDCBXA/FFwyvguLm\n\tuZzxWENT2jiCwsAJT8QWlrVI/51YgOM5DsU38zQOCNxJA5Z6FDP6oCLGSPv1xQcMTltAl8drKuA\n\tsnaAu7v5WgDCzrK1GH6SXYREKhfDhImixwzVWsh00/SdaKCcxcD4bK0hm5nNVlB9on3iao01xWJ\n\ts=","X-Received":["by 2002:a05:600c:8b65:b0:47e:e7e5:ff32 with SMTP id\n\t5b1f17b1804b1-4835d55d832mr40402775e9.34.1770824823058; \n\tWed, 11 Feb 2026 07:47:03 -0800 (PST)","by 2002:a05:600c:8b65:b0:47e:e7e5:ff32 with SMTP id\n\t5b1f17b1804b1-4835d55d832mr40402355e9.34.1770824822619; \n\tWed, 11 Feb 2026 07:47:02 -0800 (PST)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>,  Bryan O'Donoghue\n\t<bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","In-Reply-To":"<85pl6bwb60.fsf@mzamazal-thinkpadp1gen7.tpbc.csb> (Milan\n\tZamazal's message of \"Wed, 11 Feb 2026 16:29:59 +0100\")","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com>\n\t<85pl6bwb60.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","Date":"Wed, 11 Feb 2026 16:47:01 +0100","Message-ID":"<85ldgzwadm.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":"PtIBY-i_SkmZn43uxUEQmou2Rrs3Rhk0I14-4HbpG7M_1770824823","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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":38177,"web_url":"https://patchwork.libcamera.org/comment/38177/","msgid":"<a2c5c2bf-e82c-48f0-8661-d1d4e841ee2f@linaro.org>","date":"2026-02-11T15:49:26","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":175,"url":"https://patchwork.libcamera.org/api/people/175/","name":"Bryan O'Donoghue","email":"bryan.odonoghue@linaro.org"},"content":"On 11/02/2026 15:47, Milan Zamazal wrote:\n>    rgb = clamp((rgb - blacklevel) / (1.0 - blacklevel), 0.0, 1.0)\n\nThis one, as you can never be outside the 0.0-1.0 window then.\n\n---\nbod","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 99BB5BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 15:49:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E5C06620C9;\n\tWed, 11 Feb 2026 16:49:29 +0100 (CET)","from mail-wm1-x336.google.com (mail-wm1-x336.google.com\n\t[IPv6:2a00:1450:4864:20::336])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BEB49620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 16:49:28 +0100 (CET)","by mail-wm1-x336.google.com with SMTP id\n\t5b1f17b1804b1-4806dffc64cso60501035e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 07:49:28 -0800 (PST)","from [192.168.0.40] (188-141-3-146.dynamic.upc.ie. [188.141.3.146])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-43783d50f24sm5408566f8f.14.2026.02.11.07.49.27\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tWed, 11 Feb 2026 07:49:27 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"Vt1Tpofz\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1770824968; x=1771429768;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=nPolnrM9qRwbdfNEuZvsKwhR2tblpuDT25SnMk2sjbU=;\n\tb=Vt1TpofzJ9GIsonhxGvnhOt4sXB0PnGyjaqAl+uDNuG2ctiiBRvRE/OF8lolGIFIQH\n\tumzNHrUF11P10Aihv6VGg0dHpGqioQuJxB+VnscaK9ArSonshy+FfcAqC3sNf3pZ8BJa\n\ty+nNWTojs5SV2Nt68w+1uTPWf7svZKh1uuntZtKy70XBQeawv5lsdWOiMuNCYbjSEU06\n\td2Z9nHM2wBtxRHydREtn0ablVcaXzs1glhaTWk8wk761pRYl7e9QypVgL79ZUQI8bN6v\n\tDOIywqIZSNcsbRDiKGet+rHhcmY/CtKtifMpRjVuA6D5ce0HM8MC3VIjpg2m//eZUSYR\n\tBHlQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1770824968; x=1771429768;\n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=nPolnrM9qRwbdfNEuZvsKwhR2tblpuDT25SnMk2sjbU=;\n\tb=osvGTDYlhLMm2itydKfCDfxK1+DHhMOVxMceI4ukVWx5nMjFmEJRBu4qqlahsEvSDt\n\tn9AJEnOYp0zpKSEg7D0mRDs9VZL3VSDbPaelRiqzCZmuL6kltT1kCxwN0rzI9wEWJk2k\n\trwMFFaRq3ZOe6iT+H3/FpRSpRO+/bPQZTwbuoscUe4JMJygcMqvLMBp7HEk3yAHkE6GP\n\tfqqhPR4Pny8GIS553Fu3S0l/tosfiAFwT5l6SERB3saM7fLnkbUZFj3bHfehcQtUqPT5\n\tjQMrD7RCqkPZSNfg/WvNQVkpufHRGnZRk7m6reeyAbymCpqUyosWxdjwhz9ml122MNTf\n\tt4iw==","X-Gm-Message-State":"AOJu0Ywd3wimG9yzyV2sszGUX+KFJCDsUvmp8juxGtNk8dkYwnGnP5nh\n\tt4Jmpurm0E97rmcr6qoOTtm5C7OM6diBxJi/uHrj+H/d+2oJVd+SawFhby8ntvdh80g=","X-Gm-Gg":"AZuq6aL7e0z1L/LlHNsU4NmoO9HLXrrXpFYkpnWOpQLeHsZypo5ZSAJ2WplEpU8g9mn\n\tESlQvADKIQaTS9oKuqRzq1NseYQI2i2i+PCN51HA2+dsp2tG69bAC27QTElA0sIty80onzOhniw\n\tOe29DqX060Fz12FpcJhMZISurQK9mTeopUBGCbMc8YiM++xDOCRkoRd7w6K9fWjV2bh9kKlUbLm\n\t7k6JfGzabBd3nZ6uSn8yYhgZHlTBpu5/VOw1oVg9wCYWOeoQx4ylnnoi4r+Tbr5j5oXoXJQ0i/V\n\t1AbJmuNsYriEg5TzQEhLa8kuTR1DbPGLB6sBsc/oZReeq7mu64FcG/n4VjdJTDRPtiPMV0gP8b8\n\tLd4oDt8e3/wu8HPrnnqmLHgtjoP8WYHycuJEq6JlJ/OzqetldaHslslEMhfOLBpwJIDuaYOF/UM\n\tI7V7haFnHPd6dp1RNYROxYlmzlDmx4W8uZA7lf6p00mstT+qlBUJ5CDHBzcx980za3aptc1Y1a3\n\t2w=","X-Received":"by 2002:a05:600c:3f16:b0:47d:92bb:2723 with SMTP id\n\t5b1f17b1804b1-4835ebecc4cmr29948645e9.3.1770824968144; \n\tWed, 11 Feb 2026 07:49:28 -0800 (PST)","Message-ID":"<a2c5c2bf-e82c-48f0-8661-d1d4e841ee2f@linaro.org>","Date":"Wed, 11 Feb 2026 15:49:26 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>, =?utf-8?b?QmFybmFiw6FzIFDFkWN6?=\n\t=?utf-8?q?e?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com>\n\t<85pl6bwb60.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<85ldgzwadm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","From":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Content-Language":"en-US","In-Reply-To":"<85ldgzwadm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","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>"}},{"id":38179,"web_url":"https://patchwork.libcamera.org/comment/38179/","msgid":"<22bec716-4e19-4811-83ef-65cf23b39912@ideasonboard.com>","date":"2026-02-11T16:36:57","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 02. 11. 16:47 keltezéssel, Milan Zamazal írta:\n> Milan Zamazal <mzamazal@redhat.com> writes:\n> \n>> Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n>>\n>>> 2026. 02. 11. 14:17 keltezéssel, Milan Zamazal írta:\n>>>> In GPU ISP fragment shaders, the black level is simply subtracted from\n>>>> the pixel value.  This means the highest pixel values can never be\n>>>> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n>>>> this by spreading the resulting value to the whole 0.0..1.0 range.\n>>>> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n>>>> than 1.0, preventing division by zero here.\n>>>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>>>> ---\n>>>>    src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>>>>    src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>>>>    2 files changed, 2 insertions(+), 2 deletions(-)\n>>>> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n>>>> index 23747f78a..06ddc040b 100644\n>>>> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n>>>> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n>>>> @@ -225,7 +225,7 @@ void main(void)\n>>>>    \t\t\tvec3(patterns.y, C, patterns.x) :\n>>>>    \t\t\tvec3(patterns.wz, C));\n>>>>    -\trgb = rgb - blacklevel;\n>>>> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>>>\n>>> This may be a dumb question, but how come this is not written as:\n>>>\n>>>    rgb = clamp(rgb, blackLevel, 1.0) / (1.0 - blackLevel)\n> \n> BTW did you actually mean\n> \n>    rgb = (clamp(rgb, blacklevel, 1.0) - blacklevel) / (1.0 - blacklevel)\n> \n> or\n> \n>    rgb = clamp((rgb - blacklevel) / (1.0 - blacklevel), 0.0, 1.0)\n> \n> ?\n> \n> (I don't think there is a simpler way to express it using common GLSL\n> functions.)\n\nOops, yes, I have forgotten a subtraction. Assuming 0 <= blacklevel < 1,\nthe two seem to be mathematically equivalent. So I think either is fine,\nbut clamping at the end makes the intent clearer in my opinion.\n\n\n> \n>>> Can't negative values cause issues in later calculations?\n>>\n>> Currently not, because CCM may contain negative values and produce\n>> negative pixel values anyway.  The resulting value is clamped later.  So\n>> in case rgb < blackLevel (not expected, but still possible), the most\n>> likely result (depending on the CCM) is that it ends up being 0\n>> eventually.\n>>\n>> That said, I think yes, clamping the value here is better, to prevent\n>> possible future trouble once more functionality is added to the shaders.\n>>\n>>>>      \t/*\n>>>>    \t *   CCM is a 3x3 in the format\n>>>> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n>>>> index 1b85196ae..98dea512c 100644\n>>>> --- a/src/libcamera/shaders/bayer_unpacked.frag\n>>>> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n>>>> @@ -128,7 +128,7 @@ void main(void) {\n>>>>                vec3(PATTERN.w, C, PATTERN.z) :\n>>>>                vec3(PATTERN.yx, C));\n>>>>    -    rgb = rgb - blacklevel;\n>>>> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\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 C10D1BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 16:37:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AC242621C1;\n\tWed, 11 Feb 2026 17:37:02 +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 3A8B4620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 17:37:01 +0100 (CET)","from [192.168.33.65] (185.221.141.206.nat.pool.zt.hu\n\t[185.221.141.206])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CB7D2454;\n\tWed, 11 Feb 2026 17:36:12 +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=\"SVaw1i93\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770827773;\n\tbh=q9tOleEOAqn25ofiaNMdFngluGIr3HKiIaMkrBhZMSI=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=SVaw1i935RvlPor3mIVSyW45/4okq/0VZmem7HTUKoW2qYSyyu5mWV9nezponD2QP\n\t/w77DmJ5WeUqQghl6yVMUI0y+YjR6Tnmenxt53Y415jsFrVAVBj9MISeQJCjNis0GU\n\tlNia7BEAlXSQTC/WsMKXdI/dic9ycRcKzFtGnfZ4=","Message-ID":"<22bec716-4e19-4811-83ef-65cf23b39912@ideasonboard.com>","Date":"Wed, 11 Feb 2026 17:36:57 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<8bb2a522-be2f-4372-aa02-46993dadee16@ideasonboard.com>\n\t<85pl6bwb60.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<85ldgzwadm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<85ldgzwadm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","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":38182,"web_url":"https://patchwork.libcamera.org/comment/38182/","msgid":"<20260211175057.GG2553356@killaraus.ideasonboard.com>","date":"2026-02-11T17:50:57","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Milan,\n\nThank you for the patch.\n\nOn Wed, Feb 11, 2026 at 02:17:28PM +0100, Milan Zamazal wrote:\n> In GPU ISP fragment shaders, the black level is simply subtracted from\n> the pixel value.  This means the highest pixel values can never be\n> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n> this by spreading the resulting value to the whole 0.0..1.0 range.\n\nIt's expected though. Black level substraction is not the place where\nyou should perform histogram spreading, this is the job of tone mapping,\nfurther down the pipeline.\n\n> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n> than 1.0, preventing division by zero here.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>  src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>  2 files changed, 2 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 23747f78a..06ddc040b 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -225,7 +225,7 @@ void main(void)\n>  \t\t\tvec3(patterns.y, C, patterns.x) :\n>  \t\t\tvec3(patterns.wz, C));\n>  \n> -\trgb = rgb - blacklevel;\n> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>  \n>  \t/*\n>  \t *   CCM is a 3x3 in the format\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196ae..98dea512c 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -128,7 +128,7 @@ void main(void) {\n>              vec3(PATTERN.w, C, PATTERN.z) :\n>              vec3(PATTERN.yx, C));\n>  \n> -    rgb = rgb - blacklevel;\n> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>  \n>      /*\n>       *   CCM is a 3x3 in the format","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 874D4BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 17:51:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B40D4621C1;\n\tWed, 11 Feb 2026 18:51:00 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 56288620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 18:50:59 +0100 (CET)","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 UTF8SMTPSA id A9346C6F;\n\tWed, 11 Feb 2026 18:50:11 +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=\"da90Hth0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770832211;\n\tbh=9oNvQ2tDm29lqkF2am75bwQbToiVuZCi2qf/2PT+YzA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=da90Hth0CzC57QcMeH1eVGTFvxJumxCKVOqFpmaWABR0jkISyaN4k3NL2KD7aXRK5\n\tHVDkmg/Tctey0+pt51YIMfUSA74TwjOJYLeg5ubV2s7NRJMfXMgy1U/vuvoKT/FMAb\n\tTqzQDxgD0KUAdt0eZhD+OLPAM93QqewonJpHwvfk=","Date":"Wed, 11 Feb 2026 19:50:57 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","Message-ID":"<20260211175057.GG2553356@killaraus.ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260211131728.96413-3-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":38184,"web_url":"https://patchwork.libcamera.org/comment/38184/","msgid":"<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>","date":"2026-02-11T18:08:35","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":242,"url":"https://patchwork.libcamera.org/api/people/242/","name":"Hans de Goede","email":"johannes.goede@oss.qualcomm.com"},"content":"Hi,\n\nOn 11-Feb-26 18:50, Laurent Pinchart wrote:\n> Hi Milan,\n> \n> Thank you for the patch.\n> \n> On Wed, Feb 11, 2026 at 02:17:28PM +0100, Milan Zamazal wrote:\n>> In GPU ISP fragment shaders, the black level is simply subtracted from\n>> the pixel value.  This means the highest pixel values can never be\n>> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n>> this by spreading the resulting value to the whole 0.0..1.0 range.\n> \n> It's expected though. Black level substraction is not the place where\n> you should perform histogram spreading, this is the job of tone mapping,\n> further down the pipeline.\n\nAt the moment we are not correcting for this at all though. So I do\nthink this change makes sense.\n\nI do wonder if we cannot fold this into some future multiplication\nthough to reduce the amount of multiplications the GPU needs to do? \n\nE.g. multiply all values in the CCM by 1.0 / (1.0 - blacklevel) ?\n\nThen we get the same correction factor for free.\n\nRegards,\n\nHans\n\n\n\n\n\n> \n>> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n>> than 1.0, preventing division by zero here.\n>>\n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>>  src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>>  2 files changed, 2 insertions(+), 2 deletions(-)\n>>\n>> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n>> index 23747f78a..06ddc040b 100644\n>> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n>> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n>> @@ -225,7 +225,7 @@ void main(void)\n>>  \t\t\tvec3(patterns.y, C, patterns.x) :\n>>  \t\t\tvec3(patterns.wz, C));\n>>  \n>> -\trgb = rgb - blacklevel;\n>> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>>  \n>>  \t/*\n>>  \t *   CCM is a 3x3 in the format\n>> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n>> index 1b85196ae..98dea512c 100644\n>> --- a/src/libcamera/shaders/bayer_unpacked.frag\n>> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n>> @@ -128,7 +128,7 @@ void main(void) {\n>>              vec3(PATTERN.w, C, PATTERN.z) :\n>>              vec3(PATTERN.yx, C));\n>>  \n>> -    rgb = rgb - blacklevel;\n>> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\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 4C6B3BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 18:08:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8B91C621C1;\n\tWed, 11 Feb 2026 19:08:43 +0100 (CET)","from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com\n\t[205.220.168.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D9567620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 19:08:41 +0100 (CET)","from pps.filterd (m0279864.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t61BEu3292980438 for <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 18:08:40 GMT","from mail-qk1-f199.google.com (mail-qk1-f199.google.com\n\t[209.85.222.199])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c8uy68pmj-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 18:08:39 +0000 (GMT)","by mail-qk1-f199.google.com with SMTP id\n\taf79cd13be357-8c882774f0dso1602931185a.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 10:08:39 -0800 (PST)","from ?IPV6:2001:1c00:c32:7800:5bfa:a036:83f0:f9ec?\n\t(2001-1c00-0c32-7800-5bfa-a036-83f0-f9ec.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:c32:7800:5bfa:a036:83f0:f9ec])\n\tby smtp.gmail.com with ESMTPSA id\n\t4fb4d7f45d1cf-65a3cf4ccd0sm944851a12.27.2026.02.11.10.08.36\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tWed, 11 Feb 2026 10:08:37 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"M5RZynad\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"AC6/JlPu\"; dkim-atps=neutral","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\tYO45DoSXId9Zb7HX0cJCAmJmQwFPvnnzC9XBQUfD8TU=; b=M5RZynadwJWa/ZVT\n\tPxirst90pU53xC2Muc+axvHk6T4Arsbx1CwMkr+aIN/YAUz2ga7kGasO7qe7/Nj9\n\t00asi2Kd2gGmjiDRGzleeS/78/FCUp2D0oA7ze+FFcsmDr497rhnE58gG65Og1jv\n\t8ov6QPZf9cPowj51PY1u1IjbqrwpdPU42cOYhvJYcAWYcKSTwgX8eQHzooBseXrG\n\tFUwzNJBy/MIxtJwrHjm4cRgXtBwv1a39z7mDw9uWtSMjnxH0/lCttEUY+xMihFQO\n\tNGd/7XAdl0zWOA4BV5s6nN9vchM9zaX2NDmwLWSVEs0oVGGOUgSgxulimYb53MK9\n\tciIfvQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1770833319; x=1771438119;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:cc:to:subject:from:user-agent:mime-version:date:message-id:from:to\n\t:cc:subject:date:message-id:reply-to;\n\tbh=YO45DoSXId9Zb7HX0cJCAmJmQwFPvnnzC9XBQUfD8TU=;\n\tb=AC6/JlPuDQLCbY+Q1qa2TE/vpiRSgkU9lQRdfaAm+RN04QJucARmxTHbTpMf/m+++2\n\tfzUJYj0EN/Z2OiNs6dVfs3MrGUd5Ze5P8FIhyVVgq0ZA4sWDpaGtGnuApkkZUDbcaWYs\n\tZaK/4uE8+2M91id5YTeOAZ0cXXq8iVCDquariYoopjZ8aPbIC1OJ16nQWxZqHDIlTt8g\n\tbz9EOinjnyQH2sDfAU7P1v3lWbGYmQRCEF8dJYSrlZ79pKdADNmcx3bhM/9++U4Oe22b\n\t2//SsnB6eD5SXZNKzw43DFZF1FbxeVqMyzFmyo/X0YhcPMJ4G6adCdwoqYZS3DM3aBKN\n\tMNDA=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1770833319; x=1771438119;\n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:cc:to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=YO45DoSXId9Zb7HX0cJCAmJmQwFPvnnzC9XBQUfD8TU=;\n\tb=rXT3OVGXYlkEG5ASWFiA+Zw/PdzCxWgRaNgLNGtSAD+iA+yWTzxQ3Rfa3I5fcetM2o\n\t/pQa9sdrl2vnh5hZDCnPpdw0WmMOVVNaKcSILCaj3+ea5CHUz+WRWj/fdyjKgHG75aIR\n\teiFaKxRpXA/B7GtTZqFE8efr8UnScta46dJLDuSoE/mDab8QfO5p6E5WH9FbXhDKmmoi\n\tazYYO5cJ9M9iqPfy2TGD/Kd4MZGFD53Rm56Dn7PUkRQjN2FKSCJ02sgsxCJMNWHh5Lrq\n\tsCA7ZxSe4xe3PhveAE9OhDS/GWMc6PyIaPNy/tsMqhvRF3ph82tuoJcENMlVHjoE3VJy\n\tbe0Q==","X-Gm-Message-State":"AOJu0YyhZbwmLc4UZwVmYzx1dqWhMxVY5V+YKU7ryWiOuXCzei3VHAPi\n\t0SFt7eK9z0EnHD3TuSM2EUyWE18M4yP2ArW20sb4Y/wQuY5lT7Al8lqv6ELqYibhAwK1jXUiM3x\n\tQ9ADj3ig6/m0b4t7aKlOSmfYPVmnn2Xa0H+pMLP7xqQfFCKE95QnOlxIX6DpbhUJnsN9jA+MArn\n\t7G","X-Gm-Gg":"AZuq6aL2oZwVaM+U+rSe6Zr5hlfftGmpuE3nAYuHfuPY0HuIdS/dLovnqtRiddc8Nvw\n\tophcOL0J5pHJx0BXxOBuGSH6Ldu7XFIOl9LVrUOVwAljhAdVu7aO7ldVbJcgar7si9BEsaziixx\n\tNl2NFoT0636TtAXu9RWfbFByPt5ryAH1MMP1OlTS98dLW57hKWg8nqTJ//iLK7rCfhV6sM79kQk\n\tgi3taNMOyzX8LfVBmy49W4VLBXE8pYeTG2COMBCqwH3oaxy+l0R/9rnzVFr/dIlHm4VmFjQbA4m\n\tzQjH6mR5VtSdS0qxxkGzst9+1AAI4uL99EfGrmG0YTRns4fkCZCP6nTJXRFz4ZnWtIlFgRSkc/t\n\t2rBaR72QvojiWHDA5MQmRS0quxzKphLhT+KhrPS6gFhwHAWd1sfZP4yBwS6lvU78j3yzzHh7yz8\n\tFeB+etTDwvxnvlD9TQieOtBY1wKFyd5jC1vMEw/QY0kgwTztfdRLH3fhk8sD3fQeXaLns7RiJ7M\n\tqnbvUZNHYJhn3eC","X-Received":["by 2002:a05:620a:1a8d:b0:8c7:eb5:8528 with SMTP id\n\taf79cd13be357-8cb33061ba2mr12234485a.1.1770833318827; \n\tWed, 11 Feb 2026 10:08:38 -0800 (PST)","by 2002:a05:620a:1a8d:b0:8c7:eb5:8528 with SMTP id\n\taf79cd13be357-8cb33061ba2mr12229285a.1.1770833318284; \n\tWed, 11 Feb 2026 10:08:38 -0800 (PST)"],"Message-ID":"<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>","Date":"Wed, 11 Feb 2026 19:08:35 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","From":"johannes.goede@oss.qualcomm.com","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tMilan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>","Content-Language":"en-US, nl","In-Reply-To":"<20260211175057.GG2553356@killaraus.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwMjExMDE0MCBTYWx0ZWRfX5VYIQktqkI0G\n\t70IAej78Z98tUQRgkcv2tJ+h9VdwweuKW2kb76kgrP+6eL2yE+QstSezpioKLwZs5miTfbvRLqi\n\tA+8+wHAVWZdzAjXHfHJ/G8DMvgEEDiFktCUfkusSQfqaOPDdnFpGLHRn+fZP7Rpj01VFfDH/IcE\n\tnYw1PozJHtfBwffSzGUG6TesaLMDx5RLQhjl/NIookJDXVdMqUgFgMeBtihX3Gcuk/bXUgC3tFh\n\tUxEiLJVDjzSps7oBehnVZRH3xA091g5EJHCOg5vug0jUAJBYnlKYtImEh04a/sqdnR22d4bDVLi\n\teADE+lnfq5oGOVa3Df3brRvo9ZJTwo8WJiHV0qNrnR18yT0ofEpcoMLVepkj6j8PYzCWZ9OCect\n\t9u6gDE7ARjmMJaqjyhbltmziRj0fnrtaxJ3Ck304/yl0tmHvbOKQCWqAU7qIhLd1eQ4DEtNzOsw\n\tNsxkFTBuB9Zkhyl8eeQ==","X-Authority-Analysis":"v=2.4 cv=donWylg4 c=1 sm=1 tr=0 ts=698cc5a8 cx=c_pps\n\ta=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10\n\ta=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n\ta=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=20KFwNOVAAAA:8\n\ta=0Fy1ihDfTKrIr83mImUA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22","X-Proofpoint-GUID":"xoF7t29o4pYCBOd0DHTK1HXgWNVxG7KC","X-Proofpoint-ORIG-GUID":"xoF7t29o4pYCBOd0DHTK1HXgWNVxG7KC","X-Proofpoint-Virus-Version":"vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1121, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-02-11_02,2026-02-11_04,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n\tmalwarescore=0 suspectscore=0 phishscore=0 impostorscore=0\n\tadultscore=0\n\tclxscore=1015 lowpriorityscore=0 bulkscore=0 priorityscore=1501\n\tspamscore=0\n\tclassifier=typeunknown authscore=0 authtc= authcc= route=outbound\n\tadjust=0\n\treason=mlx scancount=1 engine=8.22.0-2601150000\n\tdefinitions=main-2602110140","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":38185,"web_url":"https://patchwork.libcamera.org/comment/38185/","msgid":"<20260211183948.GI2553356@killaraus.ideasonboard.com>","date":"2026-02-11T18:39:48","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Wed, Feb 11, 2026 at 07:08:35PM +0100, johannes.goede@oss.qualcomm.com wrote:\n> On 11-Feb-26 18:50, Laurent Pinchart wrote:\n> > On Wed, Feb 11, 2026 at 02:17:28PM +0100, Milan Zamazal wrote:\n> >> In GPU ISP fragment shaders, the black level is simply subtracted from\n> >> the pixel value.  This means the highest pixel values can never be\n> >> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n> >> this by spreading the resulting value to the whole 0.0..1.0 range.\n> > \n> > It's expected though. Black level substraction is not the place where\n> > you should perform histogram spreading, this is the job of tone mapping,\n> > further down the pipeline.\n> \n> At the moment we are not correcting for this at all though. So I do\n> think this change makes sense.\n\nI'm worried that we are adding quite a few changes that go in the\nopposite direction of the one we should be taking, and it will then be\nmore difficult to reverse course.\n\n> I do wonder if we cannot fold this into some future multiplication\n> though to reduce the amount of multiplications the GPU needs to do? \n> \n> E.g. multiply all values in the CCM by 1.0 / (1.0 - blacklevel) ?\n> \n> Then we get the same correction factor for free.\n> \n> >> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n> >> than 1.0, preventing division by zero here.\n> >>\n> >> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> >> ---\n> >>  src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n> >>  src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n> >>  2 files changed, 2 insertions(+), 2 deletions(-)\n> >>\n> >> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> >> index 23747f78a..06ddc040b 100644\n> >> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> >> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> >> @@ -225,7 +225,7 @@ void main(void)\n> >>  \t\t\tvec3(patterns.y, C, patterns.x) :\n> >>  \t\t\tvec3(patterns.wz, C));\n> >>  \n> >> -\trgb = rgb - blacklevel;\n> >> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n> >>  \n> >>  \t/*\n> >>  \t *   CCM is a 3x3 in the format\n> >> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> >> index 1b85196ae..98dea512c 100644\n> >> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> >> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> >> @@ -128,7 +128,7 @@ void main(void) {\n> >>              vec3(PATTERN.w, C, PATTERN.z) :\n> >>              vec3(PATTERN.yx, C));\n> >>  \n> >> -    rgb = rgb - blacklevel;\n> >> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n> >>  \n> >>      /*\n> >>       *   CCM is a 3x3 in the format","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 0BEB5BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 18:39:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 63BEE620C9;\n\tWed, 11 Feb 2026 19:39:51 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 82279620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 19:39:50 +0100 (CET)","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 UTF8SMTPSA id B03AD1574; \n\tWed, 11 Feb 2026 19:39: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=\"CHlM52BD\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770835142;\n\tbh=PRrA7PWraVLA2eVQQeXYC7F+csfm8FgzlS/oP094ZAY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=CHlM52BDoMOiBIyBDZ21Q5FJrwu7llZBPCKVE9c9IesYcO/NBPekr7CO82eWJseFE\n\tDx2RkomdZUYWd8inR56CBSoVizOZ3LIiRQ5KVC47C3uNzTfLJLk8ojgQWH4mAwZFm7\n\ta4t+b8uKbBbYEuPEzhDXhO0dOeuByTxJQyoOF8fY=","Date":"Wed, 11 Feb 2026 20:39:48 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"johannes.goede@oss.qualcomm.com","Cc":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","Message-ID":"<20260211183948.GI2553356@killaraus.ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>\n\t<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.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":38188,"web_url":"https://patchwork.libcamera.org/comment/38188/","msgid":"<851pirvtn2.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-02-11T21:48:33","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Laurent,\n\nLaurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n\n> On Wed, Feb 11, 2026 at 07:08:35PM +0100, johannes.goede@oss.qualcomm.com wrote:\n>> On 11-Feb-26 18:50, Laurent Pinchart wrote:\n>> > On Wed, Feb 11, 2026 at 02:17:28PM +0100, Milan Zamazal wrote:\n>\n>> >> In GPU ISP fragment shaders, the black level is simply subtracted from\n>> >> the pixel value.  This means the highest pixel values can never be\n>> >> reached, possibly resulting in wrong brightness or colour shifts.  Fix\n>> >> this by spreading the resulting value to the whole 0.0..1.0 range.\n>> > \n>> > It's expected though. Black level substraction is not the place where\n>> > you should perform histogram spreading, this is the job of tone mapping,\n>> > further down the pipeline.\n>> \n>> At the moment we are not correcting for this at all though. So I do\n>> think this change makes sense.\n>\n> I'm worried that we are adding quite a few changes that go in the\n> opposite direction of the one we should be taking, and it will then be\n> more difficult to reverse course.\n\nWhat would be the correct solution with the current state?  Do you mean\nsomething like step 8 in https://karaimer.github.io/camera-pipeline/?\nShould a histogram spreading be performed between CCM and contrast?\nClipping to 0.0 at bottom and determining an approximately maximum value\n(regardless of colour?) from the image and then dividing by that value,\nwhich can be any positive number?  Stuff for compute shaders?  Or doing\nsomething else?\n\nIn any case, when applying black level, we should still clip values\nbelow it since they are invalid, right?\n\n>> I do wonder if we cannot fold this into some future multiplication\n>> though to reduce the amount of multiplications the GPU needs to do? \n>> \n>> E.g. multiply all values in the CCM by 1.0 / (1.0 - blacklevel) ?\n>> \n>> Then we get the same correction factor for free.\n>> \n>> >> The preceding simple pipeline IPA patch ensures `blacklevel' is less\n>> >> than 1.0, preventing division by zero here.\n>> >>\n>> >> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> >> ---\n>> >>  src/libcamera/shaders/bayer_1x_packed.frag | 2 +-\n>> >>  src/libcamera/shaders/bayer_unpacked.frag  | 2 +-\n>> >>  2 files changed, 2 insertions(+), 2 deletions(-)\n>> >>\n>> >> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n>> >> index 23747f78a..06ddc040b 100644\n>> >> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n>> >> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n>> >> @@ -225,7 +225,7 @@ void main(void)\n>> >>  \t\t\tvec3(patterns.y, C, patterns.x) :\n>> >>  \t\t\tvec3(patterns.wz, C));\n>> >>  \n>> >> -\trgb = rgb - blacklevel;\n>> >> +\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>> >>  \n>> >>  \t/*\n>> >>  \t *   CCM is a 3x3 in the format\n>> >> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n>> >> index 1b85196ae..98dea512c 100644\n>> >> --- a/src/libcamera/shaders/bayer_unpacked.frag\n>> >> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n>> >> @@ -128,7 +128,7 @@ void main(void) {\n>> >>              vec3(PATTERN.w, C, PATTERN.z) :\n>> >>              vec3(PATTERN.yx, C));\n>> >>  \n>> >> -    rgb = rgb - blacklevel;\n>> >> +    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n>> >>  \n>> >>      /*\n>> >>       *   CCM is a 3x3 in the format","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 F3510BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 11 Feb 2026 21:48:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1E874621CD;\n\tWed, 11 Feb 2026 22:48:42 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5D2D6620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 22:48:40 +0100 (CET)","from mail-wm1-f70.google.com (mail-wm1-f70.google.com\n\t[209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-79-SU0L0f7kPx26_EVLU2_FWw-1; Wed, 11 Feb 2026 16:48:36 -0500","by mail-wm1-f70.google.com with SMTP id\n\t5b1f17b1804b1-48069a43217so69742005e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 11 Feb 2026 13:48:36 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-43783dfc2b0sm6871136f8f.21.2026.02.11.13.48.33\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 11 Feb 2026 13:48:34 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"bLyrUuM7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1770846519;\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=BQjAtshf3T/x/wxNeAl0rh1AWDx5Cjulfpsy75T2xEk=;\n\tb=bLyrUuM77+Z16b2mg3Detsad1xfc//uY9TyxKvjLb4YC6D0KBfd5HPPRxJee/lQfauLvP7\n\te998rnLypu1w5w8lL+ODxw90SW5tLgrIIo4+HWewTBkEHM+F2K+kneQryqgoiv1Fy7nRZ7\n\t9efehmUop8v6cX3wbpjoKUBpXl3xm8A=","X-MC-Unique":"SU0L0f7kPx26_EVLU2_FWw-1","X-Mimecast-MFC-AGG-ID":"SU0L0f7kPx26_EVLU2_FWw_1770846515","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1770846515; x=1771451315;\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=BQjAtshf3T/x/wxNeAl0rh1AWDx5Cjulfpsy75T2xEk=;\n\tb=Bw4/MYb2CQIqPcyeicKZNQdGpzmnOEkyg61k7rg6Xhcgb5KF7UaUGhVPDZYfn2hEWK\n\t69R1WxDYGuuc+jzTr6ppEgM1DVpXXFUTp9EHdGrNAAbvKhTAJcJK70zojATRsm+vRnS1\n\tNysjGrbptpbLEeUuKSA7YtBBRDXLGjUWmc0BpzDmqwbNXxdeX6dF3D+37tbMafagRr/k\n\tEhg/QD3EKC8i6nXWaCoD74/iiCzfH2ZeXyNDHaDdmd9+Pg0sR7L9YrfC7CFKq6c87Eex\n\t9g5RrsRv+HcHN4k8iE6jKhzt63WHSY2dmdTX3wxd6aFLQCkKXrvznohZyAvoa2Z0qzcH\n\tH2yw==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCVTQ53et9SE7cSJmrPLWhCTzu7SgF/Kd1wR3F+8mF0DC4Usu+d7nDUTkcT/1UGjj+No3FiUDqta7abngDQp3U0=@lists.libcamera.org","X-Gm-Message-State":"AOJu0Yzj5OTpV/4frS31t8BikzLW2LnAf8xXdIF9kaUdis2DNrn8QhdS\n\tUWzeFXSpCXbridcM2Z0o80J/pw+Aao8vHxSrBFZLbE9IhIdi3F+mCiNL7a4iNthXaAk+wVc+sJA\n\t/Ptv+EwJEA9tJZW+GrN/h8lvg1h4yXDLkkyYXuHlf9vxkUQ0cfue/uI1SjxVKHYPI8ltnP6fdYa\n\ts=","X-Gm-Gg":"AZuq6aJqKPFod+j29Qx9HXuM3tPbQ8yrQ+zQWkwgj5B6/XVJxxGVI7GxuPueDbpnftj\n\tjGuk7jUvN6OTNN7GmszarGVFZmnatvfWgfUNk1u33FKGLuEQB8rij5EYjZtBqz3WFYc0joYZVv0\n\t6CYJlmrRNuvTCjBs411J344MBuO3XHbQM1uHav96MS5KW0bX81wp/vLDm/kTz03ZJmLyhu605yU\n\tRpasQEHnyzd1iG40FTxKoY1cYt4agvT0OCygmi6FSShIoy64ugnlH2rUrkDL8CWDKXFbnhsPVUl\n\tCsHMh3V6UPuphmyWchm2semn1Lk4bZQzPRGTMmCHH4KyNfjpPAXEa8GVAsqDCWIJBpuxzEMerBQ\n\t3YKCcdXGDB2HHxhksh+gbrJDx7HWArEcNOreVC8rGL1WmsmpEMUS1AG/4t0rBFk2SEs11MUgvd5\n\tM=","X-Received":["by 2002:a05:600c:c4a7:b0:47f:1a8d:4f30 with SMTP id\n\t5b1f17b1804b1-48365716524mr7428065e9.26.1770846515255; \n\tWed, 11 Feb 2026 13:48:35 -0800 (PST)","by 2002:a05:600c:c4a7:b0:47f:1a8d:4f30 with SMTP id\n\t5b1f17b1804b1-48365716524mr7427835e9.26.1770846514838; \n\tWed, 11 Feb 2026 13:48:34 -0800 (PST)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"johannes.goede@oss.qualcomm.com,  libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,  Bryan O'Donoghue\n\t<bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","In-Reply-To":"<20260211183948.GI2553356@killaraus.ideasonboard.com> (Laurent\n\tPinchart's message of \"Wed, 11 Feb 2026 20:39:48 +0200\")","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>\n\t<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>\n\t<20260211183948.GI2553356@killaraus.ideasonboard.com>","Date":"Wed, 11 Feb 2026 22:48:33 +0100","Message-ID":"<851pirvtn2.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":"wc8cQj8UxfIhhv3CKJlQsBAPpmu2vzYWLSQh_EnTg4E_1770846515","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>"}},{"id":38197,"web_url":"https://patchwork.libcamera.org/comment/38197/","msgid":"<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org>","date":"2026-02-14T14:29:28","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":175,"url":"https://patchwork.libcamera.org/api/people/175/","name":"Bryan O'Donoghue","email":"bryan.odonoghue@linaro.org"},"content":"On 11/02/2026 21:48, Milan Zamazal wrote:\n> In any case, when applying black level, we should still clip values\n> below it since they are invalid, right?\n\nSo.\n\nHere is a simple fix which I have tested that applies the BLC before \ndemosiac - it also includes the clamping for the range.\n\nThe one thing I've not done here is differentiate between blacklevel.r \nblacklevel.g and blacklevel.b\n\n- Right now we use the same value for all channels\n- Complexity\n\nI can't say I can really \"see\" with my eyes a difference but, it is \nlogically closer to what Laurent is talking about.\n\n---\nbod","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 D5900BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 14 Feb 2026 14:29:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D7455621DC;\n\tSat, 14 Feb 2026 15:29:34 +0100 (CET)","from mail-wm1-x330.google.com (mail-wm1-x330.google.com\n\t[IPv6:2a00:1450:4864:20::330])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9944C62080\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 14 Feb 2026 15:29:32 +0100 (CET)","by mail-wm1-x330.google.com with SMTP id\n\t5b1f17b1804b1-4833115090dso16395925e9.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 14 Feb 2026 06:29:32 -0800 (PST)","from [192.168.0.40] (188-141-3-146.dynamic.upc.ie. [188.141.3.146])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-48370a52e5asm61543315e9.2.2026.02.14.06.29.29\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tSat, 14 Feb 2026 06:29:30 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"s0AuS4rN\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1771079372; x=1771684172;\n\tdarn=lists.libcamera.org; \n\th=in-reply-to:content-language:from:references:cc:to:subject\n\t:user-agent:mime-version:date:message-id:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=xhPljI0IY1u0lYaUvs/K6Dv3ZGURLsHCdUkVu0gXpk4=;\n\tb=s0AuS4rNWsYgIqU0h8v2sFIReCXlvhp6EObooMiF0W2p9+1YSESiTMKljTVY9PCH+E\n\tYzCbPnz64BVACgbbrDhtlSdjer2LL0bjX0JhnGJZpA2p1GeDbewgIzDQdlcjcUkbODJd\n\tyCNVTrPMy1o2sO0gsYrVflaXS3FM6E/ko/QFoUJvE6hzTzae0E3b6b8QxgSv1ObczIpI\n\tHJGtxmTcOyRARjsR1H+aUfpUu8GCFh5LVvBzVhJ46/rw+NY+GCN+52UwXGrGH4Tz+Max\n\t/3OcWgnIKTBYuLOVuyeTSWF2D991J0hQCuduW50gG5y2/DlR27ReKKP/vyOWi0NMbyQU\n\teJ7A==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1771079372; x=1771684172;\n\th=in-reply-to:content-language:from:references:cc:to:subject\n\t:user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=xhPljI0IY1u0lYaUvs/K6Dv3ZGURLsHCdUkVu0gXpk4=;\n\tb=lB0FHKSgu4LxhGhjhigSoyc9DQiHa1COUuGzDyfPAM+9OeaB31/B4CYjnRuE2up8F5\n\t/bnl/l0uMUNWrNfSrFY688mU195NkGBXhgK/G7yDz+08NJ+HrCbqrrFEK1bo+K6kFPe4\n\tKhoo3gFdcWf+tk2Bqgp5FOAAIlOZA3be60pcLL9KPdtIKCFbFLplwpxCT/w4XgrTHY3l\n\tj2WLHHkoIQpZGmCfFxuSYF5wkAmnZgXQncHB0I8uA45Z+jNHoP6Aek5dVR07XQXA9zGs\n\tLgD58Ya5Fetj46ilf7ZISOlbDsAnQmXRVTPHbyPVIdB1YdxaCUTLuYYXqga/s7MFSoTh\n\tfzmQ==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCVMjpkdaArUKQv8hn4iXAAe8J232WC8XsJ8eQBxGRZrufbQvfM04NNm2wEDMq1u2JJrkYDZuff2R+Ci89uxqM8=@lists.libcamera.org","X-Gm-Message-State":"AOJu0Yww2HyjjBD7ktsDeBP8AmPDCr0U0QM3U0VIvxE6uHiTPXqYIz4B\n\t+/rg6vnHiCC8N3TglUgaOEsig8yplldwFnACKdQx1jSB9W/XL95CtuC2PgpXA9ohcFM=","X-Gm-Gg":"AZuq6aI/KneN+4RjX7ayBIcMoElf1eMpPo53g/rb6p6z5SJHo6o7PI/+wAtZKOeB1tN\n\tpZvfV7Ja3mdPtGOsb2oyyx8Godamxs30yhTehTc8rwAU4A+rEZxqbfVt7p2UnsW98vUW0XaqDgI\n\tMP8OPfn4BOr8l5/k7FcIrFOOOv0Bs4+8TkwTEYinqud++H/eoevuTTZzqcKIhPLUb5S3xaFZoFE\n\tmw+RsfQgn8uEevM3yt3xLgIPU9iNAL4liGQStUl79Bx7DPZTmWvoUNxCAoODVSyy2HMQqy8SQGq\n\tqtkMLaKPD9rHidnSJuPRPHgrquNQ3iwUCQ3zLpll1u59vv2a6JsvS/QvAWlep0zrcsnvLc0xKks\n\t+nMGW6C4BAO5YN7u//Wg/cIHBBnCgpqsG+t9wLuoG6ecwwmBGH9h8c6PGRIH/dSTg3rg8PX0JQk\n\tKdhNevsI9jaeLjAKV7BRIh4MQ9YRFGO3yk30DaVVZNP3U/PocluAz4vRasdP1XYGLF","X-Received":"by 2002:a05:600c:3145:b0:471:13dd:bae7 with SMTP id\n\t5b1f17b1804b1-48373a74362mr86652055e9.30.1771079371998; \n\tSat, 14 Feb 2026 06:29:31 -0800 (PST)","Content-Type":"multipart/mixed;\n\tboundary=\"------------0nIv0GpcfC2pjnfT8PCpQMn3\"","Message-ID":"<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org>","Date":"Sat, 14 Feb 2026 14:29:28 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"johannes.goede@oss.qualcomm.com, libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>\n\t<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>\n\t<20260211183948.GI2553356@killaraus.ideasonboard.com>\n\t<Zd8INnikwyKvM9Y-CPh2iMT6bQGh2W-YN5cWS7Eb0AbESRKkm4pgcx-OIkjFgjhCfC_0MaU-ANxNaGehodgK0A==@protonmail.internalid>\n\t<851pirvtn2.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","From":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Content-Language":"en-US","In-Reply-To":"<851pirvtn2.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","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":38198,"web_url":"https://patchwork.libcamera.org/comment/38198/","msgid":"<1bb5c27b-723b-4b0f-ada3-24dc907ed7c2@linaro.org>","date":"2026-02-14T14:31:19","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":175,"url":"https://patchwork.libcamera.org/api/people/175/","name":"Bryan O'Donoghue","email":"bryan.odonoghue@linaro.org"},"content":"On 14/02/2026 14:29, Bryan O'Donoghue wrote:\n> - Right now we use the same value for all channels\n\nRight now SoftISP supplies the same value for r, g and b so it doesn't \nseem really worthwhile adding the additional code to account for \nseparate values until we actually start to supply that data.\n\n---\nbod","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 975ADBD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 14 Feb 2026 14:31:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 98F4A621EB;\n\tSat, 14 Feb 2026 15:31:24 +0100 (CET)","from mail-wm1-x336.google.com (mail-wm1-x336.google.com\n\t[IPv6:2a00:1450:4864:20::336])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 61F4A62080\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 14 Feb 2026 15:31:23 +0100 (CET)","by mail-wm1-x336.google.com with SMTP id\n\t5b1f17b1804b1-48069a48629so16846575e9.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 14 Feb 2026 06:31:23 -0800 (PST)","from [192.168.0.40] (188-141-3-146.dynamic.upc.ie. [188.141.3.146])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-43796ac8075sm12630653f8f.29.2026.02.14.06.31.21\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tSat, 14 Feb 2026 06:31:22 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"lpacosEM\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1771079483; x=1771684283;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=EVopgabx6aMpP5ULS0romAAw3TNOHXv3Ia79So1EiHk=;\n\tb=lpacosEMV/LnQ9AgQWn87QBJakGTQQJ0xTJmXYNxaxcPAv+XTStK3366ZFkqGgnMlg\n\ttjXiMWjpGxAlmOPH/dVJUca/vXRzdqjw9+mVDtHXLWozMqgqLAUhcUwDU3plC9wOp3o2\n\tVbjmoc6zAPCBnUgwI/MRAOIP4FUNjYFUVbJ4+A2tIcLT6DJ2jyqNbOUmdmFA6cfTGuqU\n\tlBHDAXusGirQQJvPPRfwuvoyXAyHxOUqNaNNlbtAEGwwMMRd3xwjI5ADbnqreQxKT8gw\n\tFtsSps2wFgycFTlBdMrSugYLYhpECmQz+4ileIeUWyjHDfGYHrj3UykWxsG+sq2dccg6\n\tzYtA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1771079483; x=1771684283;\n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=EVopgabx6aMpP5ULS0romAAw3TNOHXv3Ia79So1EiHk=;\n\tb=bpnI4WuEiw9fFDOmM1MOO/IFE/V9tD9xaPxWOz5+bRa+53Xfpx1Y2DT0R14aWjasU9\n\tnZhV70SHIzQjvHTQsE8zMZtQdOmJtpyxFcNq5YjBxslvvQO+uLaLzovpyPX+Ekx/0KSy\n\t5hcliGO9waJG17UffaEm4XWSPVm+wkU4b2g4uaN1SKe25wWRWIYptBMPpkmELK1M+osf\n\tN3CxI4Rw1rh/ji9Klhu5YO18ubBDlmTH+5cC2U2jM1GRQah7pZQRJOfd0LAOcct+ZtQK\n\tXZpryG3IY0Mx5/uaa9deysV6Xgeaud9A3Ds1QMllUnGGh4D4HG7m3m97/VTP77JP0GGv\n\tIePw==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCVsF5zNHe41xwdy3P2VW/3c+xJxpdEaJiUtm0kSlVFLQb6KqR7lJLALd65P/sdLO+wh1PeXE3KDq6v8JZFllxg=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YwkePBIPZUsnVz31PaPgDkulPdIn/7ItzF+yrKp8b5HDu8Gfg6i\n\tDBLIH582tbYaVnu460meWxrPhYi7Px8/NgFFjByZG33W6h3UTd2242V6aVjEXOOj1U3Yl0a9r06\n\tXwVNS4aY=","X-Gm-Gg":"AZuq6aI5PlsrdRugBPSDsgcLKyi+va5vByEyQ73xVUmGmPl41O5X7oTy1hVzsm4RLw4\n\tdDbO6TtZqq39DhGqJ/0pYmbuPDraM5Xs16q613RgQR6GPxPTBdrzBZxv7EehUFa9K29moWzG+//\n\t/3qzuIFBsxS+1zDsutWMcw5E2HyR2ZFxtDFHq8/O2Ct7kcA/E0jKIGsBlaXrk5017EIMTS5hzj5\n\tH5bPScrOyDCklKPlGknH01sJ71ZgmN2mdjBAk5+Ta6tatEsI1ZILL2xO+TUN8g8NRcfCqvwucQl\n\t5YNhbpMdksPi4ACV3fVhrqQ3ENCsCp4v823CdI+D+ps19V0ZlN58e/fx2BJAmoVuPzbusXPjRJL\n\t+kr1nDAexy4VTjiKWR2te/1yn+4FUaiXyq6UjWDrCoNBrv0PFqzMTa0w0YbbakVfB/4oLZecIDt\n\tNh+virWIgpIRBz01xBXw9EvIZyvAGssglVsV6iycxJ44L6xlBlk9awuKs4rgDv2v3aWBFrEny0N\n\tzc=","X-Received":"by 2002:a05:600c:5248:b0:477:a54a:acba with SMTP id\n\t5b1f17b1804b1-48373a3e98fmr90810345e9.17.1771079482650; \n\tSat, 14 Feb 2026 06:31:22 -0800 (PST)","Message-ID":"<1bb5c27b-723b-4b0f-ada3-24dc907ed7c2@linaro.org>","Date":"Sat, 14 Feb 2026 14:31:19 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"johannes.goede@oss.qualcomm.com, libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>\n\t<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>\n\t<20260211183948.GI2553356@killaraus.ideasonboard.com>\n\t<Zd8INnikwyKvM9Y-CPh2iMT6bQGh2W-YN5cWS7Eb0AbESRKkm4pgcx-OIkjFgjhCfC_0MaU-ANxNaGehodgK0A==@protonmail.internalid>\n\t<851pirvtn2.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org>","From":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Content-Language":"en-US","In-Reply-To":"<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org>","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>"}},{"id":38203,"web_url":"https://patchwork.libcamera.org/comment/38203/","msgid":"<855x7xt3r4.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2026-02-16T09:51:59","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Bryan O'Donoghue <bryan.odonoghue@linaro.org> writes:\n\n> On 11/02/2026 21:48, Milan Zamazal wrote:\n>> In any case, when applying black level, we should still clip values\n>> below it since they are invalid, right?\n>\n> So.\n>\n> Here is a simple fix which I have tested that applies the BLC before demosiac - it also includes the\n> clamping for the range.\n\nLooking at performance impact in my environment with the unpacked\nshader, which uses more fetch's per pixel (12 unpacked x 8 packed):\n\n- ~2% for the black level subtraction\n\n- additional ~7% for adding low bound clamping: max(pixel, 0.0)\n\nOnce we have multipass, I'm curious whether compute shaders might do\nthis faster, by avoiding applying the same operation 12-times per pixel.\n\n> The one thing I've not done here is differentiate between blacklevel.r blacklevel.g and blacklevel.b\n>\n> - Right now we use the same value for all channels\n> - Complexity\n\nIf we differentiated between black level colour channels now, we would\nlikely have a choice between complicated implementation or poor\nperformance.  Again, if we could do this in a preparatory pass, it would\nmake things easier and without that much additional impact.\n\nBTW I wonder why we use different debayering algorithms for packed and\nunpacked data.\n\n> I can't say I can really \"see\" with my eyes a difference but, it is logically closer to what Laurent is\n> talking about.\n>\n> ---\n> bod","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 75198C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Feb 2026 09:52:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A9FB7620FA;\n\tMon, 16 Feb 2026 10:52:08 +0100 (CET)","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 E2EC1620FA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 10:52:06 +0100 (CET)","from mail-wr1-f72.google.com (mail-wr1-f72.google.com\n\t[209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-284-9P_tfX_NNJiuGdyMzSIwag-1; Mon, 16 Feb 2026 04:52:03 -0500","by mail-wr1-f72.google.com with SMTP id\n\tffacd0b85a97d-43630b02fb4so3608232f8f.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 01:52:03 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-43796abc21dsm26954852f8f.20.2026.02.16.01.52.00\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 16 Feb 2026 01:52:00 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"ERUZ6VDW\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1771235525;\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=BLl2sIW0+ks3zRsSTA96PaYp8kQQKYRpO/fnXvG9qcM=;\n\tb=ERUZ6VDWO02IIusR1Imf/YJmXXOB5HLDvb/F/lFdnFTQEy+95wWMFi9vhzFxNNGrjAWFPb\n\tNS8aE0v15qJufYz9kOFf6Z9sRREIOL2wg5YtxhDDyoGmym0B0tEGhTVatOfK7VaLjxUb3E\n\tSr3T+5O49g5kyVz6w26EPka+EljLmKw=","X-MC-Unique":"9P_tfX_NNJiuGdyMzSIwag-1","X-Mimecast-MFC-AGG-ID":"9P_tfX_NNJiuGdyMzSIwag_1771235522","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1771235522; x=1771840322;\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=BLl2sIW0+ks3zRsSTA96PaYp8kQQKYRpO/fnXvG9qcM=;\n\tb=b+RDkpG9GMi5jKPmu2Qxt0ankd4iPr5xtztaGAnCI1Fq+xpRK1W3THCKKOSGiT8/Ks\n\tR5rPgrxBFst6KXWiR596SHo3CvYrGA9fvTONN53lcL+Mc1m29I6XzOdowCM1JmwCsHsq\n\tyh0epFo/W91mZTzxR/fRxLfMi1sDUTLDWZ008CqiEEyhHNKOp1SFNShL205+N867Wc+i\n\tXdLibwIBpDrw3qi6hjDL007QQOgL7/1vv3km+eoD1Peu7mBKvSNC/lHn5caXS34IDoSR\n\tQdrBrtv5eOu3vf1A7idN3e8bRBMRVaudqBBGINDyoRoDQ7RP23ge+vbFld45wN8yHWpr\n\tvHlQ==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCVYxIJbdtCUqEy78SVUAOsSbQJyWCjbOJwf9s7cD7PnXXJNNsI9dBOKUHX3xdFB9SQz+jgTLwRArTQdqUTQDsk=@lists.libcamera.org","X-Gm-Message-State":"AOJu0Yy8KnbJZCLvVSYuaHa55QvUYsiEGrBt9ONkiPwtKTxp0RftQlsc\n\tWFlrulFTFHTqrMoyavUytwl3MoKBdxUVLlzZanxfmAsByd3iKg0ni78rSEuhSn5NTj4IbSwFj4c\n\tUAGpday1U9qmQndtk5e5m6StDfyyzDSm5gCni3SdpH0WPGJHB1yxVDmo+0GSNaoEe0Cd9x4EZOP\n\tNyAD4IiY4=","X-Gm-Gg":"AZuq6aJvJ5VShqjQQ4vsYL5GoPpomzPsrOehTXO6TQwRmg0aNWUigSCw0J4eHdAA6Vr\n\teJyTUt4+ym9YNeZFGEa1tw/rr4HqPARcFM1lIl3mMow1KMzVBttk5q5S9i+JcfNS7OKTAvap/nn\n\ttbGe6WwEvVuwQvIHWpGoP+B2uU3/XP26LzRxIEU6hM7ypSm7OmQS/96hR6IzFmazCrDs0j0xEz1\n\tYBa1ggakFaYsltw60S9Y1oXobsbKh86WiPaIPwyTtfjSsQZmdq9MV6soXn/WcE1BIosAHOSIfXY\n\tCIcoOyNbi5pdV4V5eZWKp1YELUydyZjuY2v0krSIulezBTU//rlURFSAokhAdNA0CLJdfjx6+h7\n\tW0wvEXJDBcZAJhDnm6yt4yay0kIpBXejAfdygwC0Is10owkjd0Wgjm/rrpVaii37QbLdz7rx0X9\n\tI=","X-Received":["by 2002:a05:6000:2911:b0:435:9144:1417 with SMTP id\n\tffacd0b85a97d-4379791bc19mr16136504f8f.49.1771235521694; \n\tMon, 16 Feb 2026 01:52:01 -0800 (PST)","by 2002:a05:6000:2911:b0:435:9144:1417 with SMTP id\n\tffacd0b85a97d-4379791bc19mr16136470f8f.49.1771235521251; \n\tMon, 16 Feb 2026 01:52:01 -0800 (PST)"],"From":"Milan Zamazal <mzamazal@redhat.com>","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tjohannes.goede@oss.qualcomm.com, libcamera-devel@lists.libcamera.org, \n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level\n\tapplication in GPU ISP","In-Reply-To":"<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org> (Bryan\n\tO'Donoghue's message of \"Sat, 14 Feb 2026 14:29:28 +0000\")","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>\n\t<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>\n\t<20260211183948.GI2553356@killaraus.ideasonboard.com>\n\t<Zd8INnikwyKvM9Y-CPh2iMT6bQGh2W-YN5cWS7Eb0AbESRKkm4pgcx-OIkjFgjhCfC_0MaU-ANxNaGehodgK0A==@protonmail.internalid>\n\t<851pirvtn2.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org>","Date":"Mon, 16 Feb 2026 10:51:59 +0100","Message-ID":"<855x7xt3r4.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":"_otmyGbahY4Oo3SF1719QgtU08yTUwmUBQNtCzFHw6U_1771235522","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>"}},{"id":38204,"web_url":"https://patchwork.libcamera.org/comment/38204/","msgid":"<a1706e1b-a4cb-4848-b7a9-af751fd9f962@linaro.org>","date":"2026-02-16T09:58:33","subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","submitter":{"id":175,"url":"https://patchwork.libcamera.org/api/people/175/","name":"Bryan O'Donoghue","email":"bryan.odonoghue@linaro.org"},"content":"On 16/02/2026 09:51, Milan Zamazal wrote:\n> Bryan O'Donoghue <bryan.odonoghue@linaro.org> writes:\n> \n>> On 11/02/2026 21:48, Milan Zamazal wrote:\n>>> In any case, when applying black level, we should still clip values\n>>> below it since they are invalid, right?\n>>\n>> So.\n>>\n>> Here is a simple fix which I have tested that applies the BLC before demosiac - it also includes the\n>> clamping for the range.\n> \n> Looking at performance impact in my environment with the unpacked\n> shader, which uses more fetch's per pixel (12 unpacked x 8 packed):\n> \n> - ~2% for the black level subtraction\n> \n> - additional ~7% for adding low bound clamping: max(pixel, 0.0)\n> \n> Once we have multipass, I'm curious whether compute shaders might do\n> this faster, by avoiding applying the same operation 12-times per pixel.\n\nYeah for multipass what we would do is\n\n1. Run a BLC shader.\n    The job of this shader is to read the raw and write the BLC corrected\n    back per-pixel\n\n2. Render to texture\n\n3. Feed that texture into our existing bayer shader\n\nRender-to-texture and passing textures from one shader to the next is \nhow we don't have to care about having individual buffers per algorithm.\n\nWe just need the input/output buffers we have now, render to texture in \nthe intermediate stages and feed one texture into the next shader.\n\nSo then yeah @ the bayer sample stage we would be reading BLC corrected \ndata which has only run once.\n> \n>> The one thing I've not done here is differentiate between blacklevel.r blacklevel.g and blacklevel.b\n>>\n>> - Right now we use the same value for all channels\n>> - Complexity\n> \n> If we differentiated between black level colour channels now, we would\n> likely have a choice between complicated implementation or poor\n> performance.  Again, if we could do this in a preparatory pass, it would\n> make things easier and without that much additional impact.\n> \n> BTW I wonder why we use different debayering algorithms for packed and\n> unpacked data.\n> \n>> I can't say I can really \"see\" with my eyes a difference but, it is logically closer to what Laurent is\n>> talking about.\n>>\n>> ---\n>> bod\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 A4322C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Feb 2026 09:58:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D0EA6621F4;\n\tMon, 16 Feb 2026 10:58:36 +0100 (CET)","from mail-wr1-x429.google.com (mail-wr1-x429.google.com\n\t[IPv6:2a00:1450:4864:20::429])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B64CD620FA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 10:58:35 +0100 (CET)","by mail-wr1-x429.google.com with SMTP id\n\tffacd0b85a97d-43590777e22so1753370f8f.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 01:58:35 -0800 (PST)","from [192.168.0.40] (188-141-3-146.dynamic.upc.ie. [188.141.3.146])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-43796ac8209sm27681986f8f.30.2026.02.16.01.58.34\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tMon, 16 Feb 2026 01:58:34 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"YxNTZ3CA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1771235915; x=1771840715;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=ChWO09TPQl2LMt949JkJUogwYShSjAgfeeXk0gIZda8=;\n\tb=YxNTZ3CAKPUmZPm+1OSdmzOHqkLLOf0JinIs8nFkc8K/pNQyiB2k3FQoFMiHBGL3sb\n\tWiDg11fUhafvTWO0RQ8dCKnd9Iv8w9ACVVGtolU0xZPoWF0d2QX3vbI30IIrSQQPUBvC\n\thQdCh5ySht7OYBZ+9mTxLY0Wk1rLN6VYsu3viT+sZURVOpYPnacbHBB2guAsGjnap1Hi\n\tcKq3e9l/Ene+lwDXZm27CbBtJOX2omHdfrWCHS+rWOGky8l2bT2j7p0RfCutESFg2tqO\n\twi8O6t64vkqxT1PHU0AKan0wN3JkCTBiDV0T+/KGnKxf06wah1Rs5RRtp4gT15IoqMyY\n\t6rTQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1771235915; x=1771840715;\n\th=content-transfer-encoding:in-reply-to:content-language:from\n\t:references:cc:to:subject:user-agent:mime-version:date:message-id\n\t:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=ChWO09TPQl2LMt949JkJUogwYShSjAgfeeXk0gIZda8=;\n\tb=Y9xuTzXgZOKOkntujekrjmIlcNe/1dllqs5SPBzfwbO4I/shRQo3y8Yx64YT6vigj1\n\tkhu9zgiyWXoP6zBGnWXDseJW3Vu1Y54/2BDVWq9t0J6VLWElZ65OPm/HFPrzIjIgEqUb\n\tLWj3ndVwHLOJn66nvw8kZyv+JxmrxFHHR979Q2epW9few2C4ppE/Bjr8SY5y9RTPyO3Q\n\trNSMwRjG3FKtgVb62XgjcfEVQ2mv9F8zPdLWzbHgkMuQ/6wjnaBpqSg8ubLrqWduH4J0\n\tMD4Q5d9bY02UL3T7N+yuiEKMjy8S+Yn9jZAkupy6i1/JK406d3HOVIkxdTyay6C5C6yg\n\t1E1w==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCUMNHSUzJITqjjTpmpJfHT+C1gmyHcwcSM8PVM8UcI92USu2Je64RV0vjbjdyHZ5jBVAdvK2gYuc+9Z6gFE1Wg=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YwQALw9vtmSAN99cVZR6Jj3SpB7qH1faPeF0Z1pghdA/+rJ8U7J\n\tQW1f9lVR1SloLLwsKmSpQ1x+NK0qsf8227q8hcSZUjmMOYJR7jswhTzmWUXEUMbPsje2+VcLMVO\n\tljEUGOeQ=","X-Gm-Gg":"AZuq6aLxhfTwteOPXXvDDhCxKCppCaLjIRY6ROtonYspiumbuQkZrac4JZdpRvOhyxA\n\tFzgR+WLVSJOPuveZw7QdvyDKsFh21vCtp5pp4yTsp7xxgY2Fkf1gAVqysq6P82E3s59MUT/LQI4\n\tMp/ynI457XX8wmcxLOy5y+oSNO5iYYc2fXpuGSNYCXZg8NMiaCQq7+5mB5fevowhHaJly3NhY8l\n\t+AbtBaz3q668Im0ELVNy5PBWvL0Gq/nKyVcwAGZEXRDZMixehKj5MfJiH9Ge/RSf3YfAwYPgw6T\n\trIfGI8OrvPM/d4ak7c4NEihezaiuTodAbfoBeeQHKKR4o+drmnUoAiWh2OmPpur4RIUOAfRG529\n\tQF10KNBo7QEDIvzuq9OvLjUoEytL3IZ5R/LkmmW5kRHr6zYIhxQq6jGFeGevn6wy/Qd81wCD/0E\n\tbzbVAOw8OZkLI9yDgKm9sw5jqz482PTTtmWMyCqcrzNNfz2h+1LhDV6NbdjH6tHZxd","X-Received":"by 2002:a05:6000:2406:b0:425:769e:515a with SMTP id\n\tffacd0b85a97d-4379db98589mr15255100f8f.42.1771235915155; \n\tMon, 16 Feb 2026 01:58:35 -0800 (PST)","Message-ID":"<a1706e1b-a4cb-4848-b7a9-af751fd9f962@linaro.org>","Date":"Mon, 16 Feb 2026 09:58:33 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 2/2] libcamera: software_isp: Fix black level application\n\tin GPU ISP","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tjohannes.goede@oss.qualcomm.com, libcamera-devel@lists.libcamera.org, \n\tKieran Bingham <kieran.bingham@ideasonboard.com>","References":"<20260211131728.96413-1-mzamazal@redhat.com>\n\t<20260211131728.96413-3-mzamazal@redhat.com>\n\t<20260211175057.GG2553356@killaraus.ideasonboard.com>\n\t<aa65669c-5fb0-469e-81f5-d27bec5de2d8@oss.qualcomm.com>\n\t<20260211183948.GI2553356@killaraus.ideasonboard.com>\n\t<Zd8INnikwyKvM9Y-CPh2iMT6bQGh2W-YN5cWS7Eb0AbESRKkm4pgcx-OIkjFgjhCfC_0MaU-ANxNaGehodgK0A==@protonmail.internalid>\n\t<851pirvtn2.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<c987cea1-d1c1-4c72-8600-14bcc6b06b61@linaro.org>\n\t<855x7xt3r4.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","From":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Content-Language":"en-US","In-Reply-To":"<855x7xt3r4.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","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>"}}]