From patchwork Wed Dec 10 00:53:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bryan O'Donoghue X-Patchwork-Id: 25426 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 38FF5C3257 for ; Wed, 10 Dec 2025 00:54:43 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0085461473; Wed, 10 Dec 2025 01:54:43 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="AOH8BfSc"; dkim-atps=neutral Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1D5056144D for ; Wed, 10 Dec 2025 01:54:41 +0100 (CET) Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-34381ec9197so5405066a91.1 for ; Tue, 09 Dec 2025 16:54:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1765328079; x=1765932879; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RJJStRXEZYCXo1I2NiOJvRenJYpqtZFEk2eWTmXAnZI=; b=AOH8BfScsydTcKix+Sg/vwMZM0MTxfCmqLKgazUiUWyJpkpcjeKSJwh6njm9hG/aUU /LTM+gb7W3cOL8Uu+Cm/FhJIUA+TmXo/+E678gj5CDCLE9mZ+Irl7Dwzf1osHauVU+rN dEVqzmJNAWlt2/963U8ahUnzbV9sj9Jp0xME10ZvVQFqGJ2mDV0HZE+Pq9wgg/1Uf+hu ocJxM2icFTzN8XdnsTup0aURT9x1RvN9VeZery2QwHhL962DhdtMidZaYYv5Py4ekgV/ 0OwB7zXLe+/UCIXqEHluouzCnQK9XzZF5DNPk+6eRRXZLRV7i2kNJni325mzR4GFI1+5 UvQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765328079; x=1765932879; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RJJStRXEZYCXo1I2NiOJvRenJYpqtZFEk2eWTmXAnZI=; b=R8KnPAI0053zUsDatMLMaCMPlfgs/wwPfbnIvUMqZYbPmFUbF1J1OcFq1DmUTnwFBA wQXc6axG4fW06sxHed0ZhcQCDAF1hMirretBj6iF7e1uldYQT5LODQzA4/FAfieb63BE 7a5Rb3EtlQ59QBdiijCq+1b4drvEUGMElEF71DsrJJ4ou+pCB+Sk9apXF/9oNw+tfj5P i82o1CqIT+T+9Hk7AC+yyW4Ypyo2Ss9GHknqtUmNcDzohQovPliUzw+M8SRtFH3b/4xj JNL+00Ns8LDM8LC5TB5ynRreQezFXeqswwVfbDB1889UY1i8MngUHKPmtDALVwZUrMOE oHXA== X-Gm-Message-State: AOJu0YwmU/vdaevLFAryPf0LWg39j4PqqdiRtJIQoIKGDprtePD803vV ZvjmV8stN6piEBzBZVLtg/SQCU9XooyQQRkWStBr2vFuF8G9eIGfVSDBHmM/Wzcn9X5CWTJakTY OZorH X-Gm-Gg: AY/fxX4cVtA/XMjnPeAjs57G878MoYnlwAiGlM0pEPhIx+n2MxgblFdlaI7iByZG5vc ZKhnwDMU/BKyuX4/0xfmUiXIvvoFnwEsl7XiOHTg3U5SVZQHUnfM+jRRvThFbigCbP+0etk16w1 6NBahytUN8/JKZ3cCErye2GQphRdQtF2j1ixOrEs1IaNTuTex+2I2YMgRmm/0+oQ8kehBjvBiMV 2DV/B4YB9YIW7y22Z1MsvKGcUCQKsOgt3dORp4pmNnNJv0MCOSfSHSTnW38XhAbFfYQnhK7yZdh vzHWusMUvuSCSLIAdIiBhvn6TQ3kcbo1e2hw0m5njLxgao7csIAyMretKIsPtQ24ZeM4yQJRjjE kLAbHL/ickhbOyM3Y4qYqzAWX6stjPbev4uAmCSxZzjoZqcS2oRyuWgPTKNqshD95AjzcG/Nd7g LiFT7XU/BQu29cE0lXuIHKupXxQVkj9X8tkCi//3tEENS/qjwyNHXp2hezVgvAqJKo X-Google-Smtp-Source: AGHT+IHERH7FkIpRUMhsXyTI2AwkDTxPd7kwURcn8LdsMuHsL38B090/HW36yr1nDws/7N/Jja2CBA== X-Received: by 2002:a17:90b:258b:b0:340:54a1:d703 with SMTP id 98e67ed59e1d1-34a728d52ffmr566068a91.35.1765328079482; Tue, 09 Dec 2025 16:54:39 -0800 (PST) Received: from inspiron14p-linux (p96936b06.osaknt01.ap.so-net.ne.jp. [150.147.107.6]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-bf6875cc8eesm16057762a12.16.2025.12.09.16.54.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Dec 2025 16:54:39 -0800 (PST) From: Bryan O'Donoghue To: libcamera-devel@lists.libcamera.org Cc: pavel@ucw.cz, Bryan O'Donoghue , Milan Zamazal Subject: [PATCH v7 09/26] libcamera: shaders: Add support for Gamma Date: Wed, 10 Dec 2025 00:53:37 +0000 Message-ID: <20251210005354.44726-10-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251210005354.44726-1-bryan.odonoghue@linaro.org> References: <20251210005354.44726-1-bryan.odonoghue@linaro.org> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add gamma compensation to the debayer shaders after colour correction is applied. Similarly only apply the calculated Gamma curve when using the CCM as the lookup tables already contain the data. Suggested-by: Milan Zamazal Signed-off-by: Bryan O'Donoghue --- src/libcamera/shaders/bayer_1x_packed.frag | 4 ++++ src/libcamera/shaders/bayer_unpacked.frag | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag index 7036fe278..77d9fbfa7 100644 --- a/src/libcamera/shaders/bayer_1x_packed.frag +++ b/src/libcamera/shaders/bayer_1x_packed.frag @@ -67,6 +67,7 @@ uniform vec2 tex_bayer_first_red; uniform sampler2D tex_y; uniform mat3 ccm; uniform vec3 blacklevel; +uniform float gamma; void main(void) { @@ -260,6 +261,9 @@ void main(void) rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); + /* Apply gamma after colour correction */ + rgb = pow(rgb, vec3(gamma)); + #if defined (SWAP_BLUE) gl_FragColor = vec4(rgb.bgr, 1.0); #else diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag index f0d8cd1e2..aba11a87f 100644 --- a/src/libcamera/shaders/bayer_unpacked.frag +++ b/src/libcamera/shaders/bayer_unpacked.frag @@ -26,6 +26,7 @@ varying vec4 yCoord; varying vec4 xCoord; uniform mat3 ccm; uniform vec3 blacklevel; +uniform float gamma; void main(void) { vec3 rgb; @@ -155,6 +156,9 @@ void main(void) { rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]); rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]); + /* Apply gamma after colour correction */ + rgb = pow(rgb, vec3(gamma)); + #if defined (SWAP_BLUE) gl_FragColor = vec4(rgb.bgr, 1.0); #else