From patchwork Wed Dec 17 10:01:21 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: 25582 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 81D5AC32AF for ; Wed, 17 Dec 2025 10:02:06 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 037C361D64; Wed, 17 Dec 2025 11:02:06 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="cVscKM/w"; dkim-atps=neutral Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9017E61A36 for ; Wed, 17 Dec 2025 11:01:53 +0100 (CET) Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-47a8195e515so45229425e9.0 for ; Wed, 17 Dec 2025 02:01:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1765965713; x=1766570513; 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=ZRuITSMve+FWc8iDUneEG5zb0QDixsRjAIi5XBQ3RYM=; b=cVscKM/wCKvJFUVK5ppjBtSmlzVPnwFzuOtRowv78mP35qlpYYh6E/o7VM6Ph9VpSz AgkUL1dUlCWqaNZevlC6W03TICFb5XQbJt4+SHyQBNvAClpt+xaW+wL8I5P3Dc3fOjIF go43CNc6o3DGSY0Y9a+d+z1vwoKi8Q2V2xt9bTFTPx9vrhKmjzDpMYzyJ4XbD5PSTnMM McE5LcuufD3Qh2oN/jGtAmqENb/HAJusR7SQDzYch7sp8p5eb/5FwFxgW/xAl6zxmlsM YV4yml9WxodzIx8dnZ03vCPxqeqzm6i3rkZtSL4Ax+XCWu5vEn7BUB+Jb4cd4DR/ihM5 k3xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765965713; x=1766570513; 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=ZRuITSMve+FWc8iDUneEG5zb0QDixsRjAIi5XBQ3RYM=; b=gC9mAKwXpVLD8Pk+0cVLkIPLq0J0GXR28kxZD9R2c+u7XqTW2rnVWFKSd2JAlEu3CT 88VVzpcX6IBOPYw0aF8OB0wr9b/gEROFMJVHDKly3ruQo1PSDVZ00qIBDLFdTDUaGQkc 52Eii2snQfLaysqjK/YL3bBJoy/H8HZeGeSgETUJbOnIPEOy5QKIaiyC6FbezUq0NYIT z0WwW+TOth0zj+4Awg7WioeN0LyWN/s+YMPy5HfEZtoDn8qrWKLRdLsrMAU1iYVrkJnL jHgvNtJq+tkgP60ID5GHWd09wYyyHlzJZ7dw4D11qgpa8EHTucOD3t0auIF4dK7XvM6g RqwA== X-Gm-Message-State: AOJu0Yy3jax0DZC875/n8APHAU4uamKKO6cHeaKAzkjD28V84KzA1doK sP58ZAwIvzdI4xOCJt5pigdamlt1qb52Axo4ca1EHC9FhUbQvJfWAztqnCQBi8fQQMBM9z3Y0d4 3cr1/ X-Gm-Gg: AY/fxX5227xr6LvdmD8irZUg/f3GqNQCUDSUUHk5bl6oiCaDRd2v/N7O9Fpm+y7xvty z6ETBrvq20rkBQnVdeLKQiQdnxYdSB7AlXHROjj0DAiX1Xfzjh/9Trd4mS8lYDA6EaoE+kJs7bu D4sdCAX+fT3LsLrDKqp366z+npbk4IYIlcQ2NHXdncvacrZDAC3qyA16MlDj6QsrMpcaYfamil2 loF/MR+MpoiVN9mWD2h/dHjeVbI/cNPXkbzRTqMijIsfBoKuUgjFH5gu7RhjdokY4MN62Frp/FY U3UXJDzWu4FAuqSKjPrwEsfTdVEi0UAUpKmukKF4RBFx28wQ3j8koBJkUPfSLQ/f9a1vO5xsSQ9 hr+XaoaPfydjkInlvvzXDdM3rCqH/jKP1I0yxUMZwpVEnQNeI94kVHhPR0OFqKezbXWxWWVFzK8 O8DgxtpdYmpupvXSz4HqeviqD67eDEFW7HXzC7mbh4X+HJwpSw/NcpDGkvA9MbkYbIGm8= X-Google-Smtp-Source: AGHT+IGT+CwgvaidH/6C7tpMUBsaACFuTtFglAX2FPTKT1yXK+w++FjF+HHhb5YwSBDY6AvUBBwIJg== X-Received: by 2002:a05:600c:6290:b0:477:63db:c718 with SMTP id 5b1f17b1804b1-47a8f8ce390mr222333985e9.16.1765965712753; Wed, 17 Dec 2025 02:01:52 -0800 (PST) Received: from inspiron14p-linux.ht.home (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47bdc1583fbsm32292585e9.0.2025.12.17.02.01.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 02:01:52 -0800 (PST) From: Bryan O'Donoghue To: libcamera-devel@lists.libcamera.org Cc: pavel@ucw.cz, Bryan O'Donoghue , Milan Zamazal Subject: [PATCH v9 09/26] libcamera: shaders: Add support for Gamma Date: Wed, 17 Dec 2025 10:01:21 +0000 Message-ID: <20251217100138.82525-10-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251217100138.82525-1-bryan.odonoghue@linaro.org> References: <20251217100138.82525-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 Reviewed-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