{"id":27000,"url":"https://patchwork.libcamera.org/api/1.1/patches/27000/?format=json","web_url":"https://patchwork.libcamera.org/patch/27000/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260621-kbingham-awb-saturation-v1-4-b91ea59c6cfb@ideasonboard.com>","date":"2026-06-20T23:00:31","name":"[4/7] libcamera: software_isp: Fix black level application in GPU ISP","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"f73b45806611f6872f7f9cd3f109243995a33796","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/1.1/people/4/?format=json","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/27000/mbox/","series":[{"id":6009,"url":"https://patchwork.libcamera.org/api/1.1/series/6009/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=6009","date":"2026-06-20T23:00:27","name":"softisp: Fix Saturation and Black level handling","version":1,"mbox":"https://patchwork.libcamera.org/series/6009/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/27000/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/27000/checks/","tags":{},"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 41EE9C3305\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 20 Jun 2026 23:00:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1DE45656EB;\n\tSun, 21 Jun 2026 01:00:43 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A565656DF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 21 Jun 2026 01:00:36 +0200 (CEST)","from [192.168.0.240]\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7A5A9145C;\n\tSun, 21 Jun 2026 00:59:59 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"FHfKSjj2\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1781996399;\n\tbh=1Dsd99PDsCvYk3wseluybJJFhnPM+XvVCmzr+tTgNsc=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=FHfKSjj2RNDxoDIaLdZQg/tAEpMoNtLz25m082TPAQPUTaRYFknlDVDUnim+rfeX3\n\thPPl29sqa5hKC3gxJwoReoNHlyQ66fHdWTHXh2VnOwbvqCdU5FUvCukBSeV3ZZgcFR\n\t19lxlhkKsWh8kmvbJXjNlPJkM3B7hEc9SMdHI9uE=","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Date":"Sun, 21 Jun 2026 00:00:31 +0100","Subject":"[PATCH 4/7] libcamera: software_isp: Fix black level application\n\tin GPU ISP","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260621-kbingham-awb-saturation-v1-4-b91ea59c6cfb@ideasonboard.com>","References":"<20260621-kbingham-awb-saturation-v1-0-b91ea59c6cfb@ideasonboard.com>","In-Reply-To":"<20260621-kbingham-awb-saturation-v1-0-b91ea59c6cfb@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>, \n\tMilan Zamazal <mzamazal@redhat.com>, \n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","X-Mailer":"b4 0.14.2","X-Developer-Signature":"v=1; a=ed25519-sha256; t=1781996434; l=2107;\n\ti=kieran.bingham@ideasonboard.com; s=20260204;\n\th=from:subject:message-id; \n\tbh=HO351AQHr9+o9JwpNlbZtGFYAw5B+ZtR08q33yD8XDY=;\n\tb=ym43Y/VEniUySN+wjKKPYTwnM+Cq+4G5XHRhUqMzTvq3i3NYtfTb4w5nMqPyjCiNIDf5tNz4s\n\tp4f2FVb5iSVAjmA+BH7S4l0WzVnwS6Zm2byy6GrrUvJN+suMQtrJ9vb","X-Developer-Key":"i=kieran.bingham@ideasonboard.com; a=ed25519;\n\tpk=IOxS2C6nWHNjLfkDR71Iesk904i6wJDfEERqV7hDBdY=","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>"},"content":"From: Milan Zamazal <mzamazal@redhat.com>\n\nIn GPU ISP fragment shaders, the black level is simply subtracted from\nthe pixel value.  This means the highest pixel values can never be\nreached, possibly resulting in wrong brightness or colour shifts.  Fix\nthis by spreading the resulting value to the whole 0.0..1.0 range.\n\nThe preceding simple pipeline IPA patch ensures `blacklevel' is less\nthan 1.0, preventing division by zero here.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\nReviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n---\n src/libcamera/shaders/bayer_1x_packed.frag | 6 +++++-\n src/libcamera/shaders/bayer_unpacked.frag  | 6 +++++-\n 2 files changed, 10 insertions(+), 2 deletions(-)","diff":"diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\nindex 23747f78a6313503a46b61ed5bae6e7c178c5745..fbd15b32e5b3b510ba0dd5a75704f9ff3942e00c 100644\n--- a/src/libcamera/shaders/bayer_1x_packed.frag\n+++ b/src/libcamera/shaders/bayer_1x_packed.frag\n@@ -225,7 +225,11 @@ 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+\t/*\n+\t * \\todo: Black level normalising, AWB and digital gain could be\n+\t * reworked into a single multiplication.\n+\t */\n+\trgb = (rgb - blacklevel) / (1.0 - blacklevel);\n \n \t/*\n \t *   CCM is a 3x3 in the format\ndiff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\nindex 1b85196ae16130670eb3d1c077ab4884119ae63c..0f85e9a4ded7f43ce4fdabf1e045275ae2bc8f53 100644\n--- a/src/libcamera/shaders/bayer_unpacked.frag\n+++ b/src/libcamera/shaders/bayer_unpacked.frag\n@@ -128,7 +128,11 @@ void main(void) {\n             vec3(PATTERN.w, C, PATTERN.z) :\n             vec3(PATTERN.yx, C));\n \n-    rgb = rgb - blacklevel;\n+    /*\n+     * \\todo: Black level normalising, AWB and digital gain could be\n+     * reworked into a single multiplication.\n+     */\n+    rgb = (rgb - blacklevel) / (1.0 - blacklevel);\n \n     /*\n      *   CCM is a 3x3 in the format\n","prefixes":["4/7"]}