From patchwork Tue Jan 6 17:00:45 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bryan O'Donoghue X-Patchwork-Id: 25663 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 BE0A7BDCC0 for ; Tue, 6 Jan 2026 17:01:20 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5E5B962019; Tue, 6 Jan 2026 18:01:20 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="FNKauIS/"; dkim-atps=neutral Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9AC6A6200C for ; Tue, 6 Jan 2026 18:01:15 +0100 (CET) Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-42e2ba54a6fso452688f8f.3 for ; Tue, 06 Jan 2026 09:01:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1767718875; x=1768323675; 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=FNKauIS/0dsSJ14v1qXPu6hy/xqD5CDby92U9OEV5hjxK+fm8iCrpp143ubGRhDN1+ G1iU770ii5gWvC+Fwr/YVhUb9CIB7v99wJjwU3rwRPH3v8tukuDFW4Qn0WkFNzaacUkw OvTJDdat6jtitPTf7h+srb2NKsqhjRzcdibOcqZmGK2iPG+pX9i/ZHG3MasZG2r9Sbh/ 7Tp2EBjPrYkBtu9/gcK/NOQJpFrOomCKGiyiLcNQcxWc9afx9jeCPhiZ5wUreyllmhHa aZqIpsZWAg5qeGWrBeZR7PzDszffpmyMlPU8PYGFw8Eh8WiXSCR2X1TRIJMASCmOw5Uj inaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767718875; x=1768323675; 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=NTrMgg3I4Ff2FKvxKEKlD3iMXndt7Akowa0adO6niobRqYePlxncMcS1qxfWwy3hMp 4gTg+JB0ZT1YVBXNEI0icfkzxjbWKgixo5Pr6kS9kfRcbOorM65U4dbYwzBAlgEAhK6A Tb4cbFaeSYLJrw7CVpK3a8hVRPfjn75QrEFHT36VJ4ifUK8ZY6OF+4n8/QBXBkEMVlcj 3agJlX4ruwm3cB6yJL9KPWi07MYm4yCCnfR8QcLHSly12s3YAY2loVT0T8pwC23wBmP1 7tCbB+4i6QmU8MS66dbeFlI7ZRMGKrmH1jNn8NU9V1GH8CpHxLSrofo0ePI2yZvl0iDK /Vzg== X-Gm-Message-State: AOJu0YyZ8cKqjJvLbaIWcfWEw+KW6RMdhEy03ISlHuWdD2ll5002rxMP gpqm74fhLG6CcSJRci1UbE8MDk4eggXKvhTOvzIQuTo/LE6shYyQlX8g+vOARFFSsD9+9s7fpVJ 2cTYCjL0= X-Gm-Gg: AY/fxX4jSE7ttjnDFSD08Si6+fK0Yvm6X8OC4ZWfEDiZCYhpbiHGjUuqHewC+LhLv7Q yeuni1gP8M7cnlTY08JsEkNrpiij3klzzBSieDs3gqfZR8rFPP7NiXL0mX/5FnAapZpu39/twEL S5waAv9tCt+nPqboVPmzribMkzQq/thWI7at72SJmoS3vNFR0Gdfa39WpNnmLYBL4ApHDUTEZAn wWcApTiS5ETdbkmyMTv1cKwfeu7RerxkpHmopuMhBlUl6BUQZ0oW8E5hjj7PQVYvlQr9YETOnpx QhkZ+SJjNuebGhThmS5TFIZdvSTJAxcrlOVL16MXfyD4EaDWr/4gacTgOnhU6WhLu6f1hPCE02a LQ7lCvhl75sevqvrYzzkwB6kvrGshc25Hc6URd16ke9tgvtpTaObzB6uCWStfXZF6SZQ75WwaMM 2iunfZNM/1RwGnKDDfCgBw+fjzm9K/m3tXExmRFSkgIWQCkaHofr8hswD9Sya2Om5buwQ= X-Google-Smtp-Source: AGHT+IHjztrKp6NRVqwM91T18D8N7dDx7S3P1yh7Osny7IqH5lH71GasDNyTKcn2cFJMkDzvNtqL0Q== X-Received: by 2002:a05:6000:4014:b0:431:a0:7de0 with SMTP id ffacd0b85a97d-432bca4867cmr4894735f8f.35.1767718874737; Tue, 06 Jan 2026 09:01:14 -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 ffacd0b85a97d-432bd0dadcfsm5515322f8f.3.2026.01.06.09.01.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jan 2026 09:01:14 -0800 (PST) From: Bryan O'Donoghue To: libcamera-devel@lists.libcamera.org Cc: pavel@ucw.cz, Bryan O'Donoghue , Milan Zamazal Subject: [PATCH v11 10/24] libcamera: shaders: Add support for Gamma Date: Tue, 6 Jan 2026 17:00:45 +0000 Message-ID: <20260106170059.56193-11-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260106170059.56193-1-bryan.odonoghue@linaro.org> References: <20260106170059.56193-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