From patchwork Fri Dec 12 00:29:20 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: 25524 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 DE4A7BD1F1 for ; Fri, 12 Dec 2025 00:33:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 906236166C; Fri, 12 Dec 2025 01:33:53 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="G+Ua28eg"; dkim-atps=neutral Received: from mail-pj1-x102c.google.com (mail-pj1-x102c.google.com [IPv6:2607:f8b0:4864:20::102c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3695C61635 for ; Fri, 12 Dec 2025 01:33:52 +0100 (CET) Received: by mail-pj1-x102c.google.com with SMTP id 98e67ed59e1d1-34374febdefso695891a91.0 for ; Thu, 11 Dec 2025 16:33:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1765499630; x=1766104430; 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=G+Ua28egfZ4IoQ0wIgUNMbJuI6rby+BqYfBD3+fvpjfYD4jGZxHXDvrskIzoXFCIGP 2plQwVJCSuGjt9Uvx9vHyEKQyV2mzpbiLIKY3REkniejoA7omNUzPu0SYXE+HFEygtIH FPV1zmsqFpY78TSjywL0+/vrqBLAxUpxEmUrxWlZ8MO2+zz8xq+TlgxZlVZfRbPzkx10 zAsK4QtNhQLOZdoBQeCBNjSKEU1HPN/saXJ5UahKtEa1GX9qBJSd7DzcgF/wt6dLx+aK /Y4l+pTJ6MuwvzGR7NIz34RuSR5bT9U622f/jLrxOEDycrmyce0iH3v91+i1GzXxsSju FKyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765499630; x=1766104430; 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=FMr6esA/a+HaXWVScOdq/bZe4rlrPICdbCT/PmYQ+HUy1kNy/DfBw4yKwZJjL+vkkD f1S5tB5vCL9aNyqK4pU3WboDXUTvD4RKBTp49egl3xC61/1prtNcxHxvnwWwepdqmZvw hZXhQQ/UDxnIJz+BQHs+SqjPEBm7yDzOcB+GOXMfMtF//ohDL0LDWpToEzPbVM4ZAgZs a1IYKecPvc+2jI237pXQ62v/o8Ppu9A8tGyt5/3joC3LMGAFI7QwudusMSBd0cJUj1Hb W9etZ1DVtKOidmvInOPgqzcSLjd5CsY9vCJxsG+mN/JR77LGT0KKvFsmlHSpbyGaXpQA Ke0g== X-Gm-Message-State: AOJu0Yxxp8CgECVYq0Ya6HdvdhgG3rnvCAzIVvxvMWxEA5ayTwoES4LS 5Udf8HhrH9PLu+z/JWSM2rjxIAFdiMqV5kTgNh2mRit+UwYl7xmsFQDMyRSCZ/pe00Th/JoWy3c 1o/1y X-Gm-Gg: AY/fxX7ZfyJ54/73n8h2pwzV3q8KsSr4nowWD9i6k9Et/8Cu6QWb9h9qLTssgnjRd2W P8Tfs1yWdfVHtPhRv19iMk0evH9QVnq+uiwHAoorC8FT9utHatsdlA495lOW0uZjS7RLS/pI+sO M0NZ8wZzNkmAGks3tGbL2n4vexxDk2ggihWfJ+0Kl1G8dLDmqguHK5A8tINwLrMuhEWtVEI2aYd j+SUUH0AYao6zYkBElK04CuACgYMzdw2yzLvj180t0umgrU4DfINKQ6fz5YUy5r426t4Z4cjT8g XCzPQfYB6uANJo3QA+Nn1FTm08AyqPp22wkSB8b16uXnYaLtDOUGK+ORMIydYzgCA16ny4jv8gt E5O2+zzxJrjtGZpUeh6rUomGtJFTBfR57UTF1DYZXcwwqJbN7mP7aMQ9+N6P9BTgmzLoywfSmKX zw33ZMjUPhd0mpJD6wf/EORqeq7KV5wJLjN1w8NqbVjTl1pHPwTsyAES3QMo0= X-Google-Smtp-Source: AGHT+IHcFukGZ9huue0rHLReGc2lU4rqvel/uXgSOmeSJMnjzEXcI7Wf4OOEGyfNxZpKZKTRAlAhhg== X-Received: by 2002:a05:6a21:328a:b0:350:ee00:3cc1 with SMTP id adf61e73a8af0-369ae3977f7mr302450637.30.1765499630517; Thu, 11 Dec 2025 16:33:50 -0800 (PST) Received: from inspiron14p-linux (p99250-ipoefx.ipoe.ocn.ne.jp. [153.246.134.249]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c0c26eb0f6bsm3317282a12.14.2025.12.11.16.33.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Dec 2025 16:33:50 -0800 (PST) From: Bryan O'Donoghue To: libcamera-devel@lists.libcamera.org Cc: pavel@ucw.cz, Bryan O'Donoghue , Milan Zamazal Subject: [PATCH v8 09/26] libcamera: shaders: Add support for Gamma Date: Fri, 12 Dec 2025 00:29:20 +0000 Message-ID: <20251212002937.3118-10-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251212002937.3118-1-bryan.odonoghue@linaro.org> References: <20251212002937.3118-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