From patchwork Thu Nov 20 23:33:33 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: 25133 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 3FE07BD80A for ; Thu, 20 Nov 2025 23:34:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C2B5D60AB1; Fri, 21 Nov 2025 00:34:12 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Wv3AWEi1"; dkim-atps=neutral Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B74F560A8A for ; Fri, 21 Nov 2025 00:34:09 +0100 (CET) Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-42b31c610fcso1230216f8f.0 for ; Thu, 20 Nov 2025 15:34:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1763681649; x=1764286449; 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=suq5XMZu0qhDPnhx2EUi5HyBXr7OCjnwhdm8i1aWyHM=; b=Wv3AWEi1xY+eJUeom6gFKowaKJmWXX9fe/N/wEdYNW937Q35cR5hzgPpofpaARnoUc S3Qs23kVDtmLQKw+bKowslq23vx/lnnPjhSJb8AR8NtG3xZh6vFjRvx/RiE09WgfgEd3 fCXhR7dOC1B2ZLvaNf6kFvrO+Vp31+Gq3RN8b8jZg5zZ7G5cRJt56i+yRoidF1McRUaX 3kl8QmGuEPa/LXeL6obU4Si2lkFBH9L9Y+wpsO/THuPar8a7Z7e6woPcYM9Ctl7XAR/y NDBxiWBV83VMD7h6lK7QiW7ONNKsrK6qc936GliH4+b22xt8lXuhndDWgZ0zyWCalOw+ 35hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763681649; x=1764286449; 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=suq5XMZu0qhDPnhx2EUi5HyBXr7OCjnwhdm8i1aWyHM=; b=Vaw+REP1UD+jp+iHmhDXRj3KqM91TWVFKPEIjM1cDnJLJQiAZ8FoY6b8uyZMTFC6tq tUoCGB3tHzPzLqjctulRqFgMqR4Eyze0gXO8/zH2amTZjYD+yzleDPBlpkOIyWQw71jO ug4ti0A+qW0VQxGTMYAxP1kHcMgJkkKUHQe482pqJ/Q5IHZzhPYXIJC7zSFjZQqDNYXI iL/N4rhhu7FYopgFpt7hP+ubNqvewoOKE7AGZg32JeBXAuCu7Oj6bm59/4qAE1cnnXWH oxS1xCqGCshMgESE3ZVDtZp7BVZUFe6ok7MYa6Le8GIY9xzfQKNemgGznx4PqTbD26vM Aogg== X-Gm-Message-State: AOJu0Yzq+Fi9EGcFPfRs3ZRCGsH9YoVZA8lB/ok7n4Ffg6K8Gu9DVN7/ azeMltvNdMUbKRmL8g5CZ3rjG8jTVUbXSP7Ae2NLaCeiiE9U7RPvaTrrRUQzivX1vYrmz/fZBc0 yJvO0oJs= X-Gm-Gg: ASbGnct8A4ql2BxdZefWTwooMq9GMY9bA4lTeM4Q/dh7fRm+iKr8H7nOHN47Mn34PWC RQ4ECbqubSrD3AcYkK9oM/yM4QBQeS8PxvPSqDjrm/5qQ+G6vdssQFP71yeB0ognMv5aMzb5Ygz qBYTAwae89tX0RWfcrzt6TFrw+aDRVHfY1rSI9GlL+p4nduoKweZgMmud8UZ8tpXV6qQllHnImM gYPp45d4wLJrAPMXDRVlDKm384R2o+HoOtn5Od6yQlmqPIdlLmGkFH6uuyhZ5Rog3X6/IAErwCl UlxwV5YBd9qXYI8fOUGyrCdFrjZpnSN8JF+WM1m46/o7n/nH8Mz15HNEMAIZf7K/UysCgnr9rAY 4gIMJFfx3oh+R+IuDAaDpGsuCwJmDu2LgYwo0E4/kQgw94U/wbidd0EZw9lBgXHVQIiy1Kz4PQA NARJbSEG8eKGfvoVoH/ImXoB6eNkP83d/R5gc2fKjrf+r6Lz7XvOAY9DqUI9x8HTTHKv8= X-Google-Smtp-Source: AGHT+IGvvPlhCTahDkElwU2H00SFfjpQXLJaaMWSkfr7p6Fweyasl5rfR04ivoIjgW/ok4TPImS9tg== X-Received: by 2002:a05:6000:2f86:b0:42b:32a0:3490 with SMTP id ffacd0b85a97d-42cc1d19ed4mr87002f8f.49.1763681649078; Thu, 20 Nov 2025 15:34:09 -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-42cb7fa3a81sm7984139f8f.26.2025.11.20.15.34.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 15:34:07 -0800 (PST) From: Bryan O'Donoghue To: libcamera-devel@lists.libcamera.org Cc: pavel@ucw.cz, Bryan O'Donoghue , Milan Zamazal Subject: [PATCH v4 09/23] libcamera: shaders: Add support for Gamma Date: Thu, 20 Nov 2025 23:33:33 +0000 Message-ID: <20251120233347.5046-10-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251120233347.5046-1-bryan.odonoghue@linaro.org> References: <20251120233347.5046-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 compentation 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 --- include/libcamera/internal/shaders/bayer_1x_packed.frag | 4 ++++ include/libcamera/internal/shaders/bayer_unpacked.frag | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/include/libcamera/internal/shaders/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag index 6bca07b6e..069b880ff 100644 --- a/include/libcamera/internal/shaders/bayer_1x_packed.frag +++ b/include/libcamera/internal/shaders/bayer_1x_packed.frag @@ -70,6 +70,7 @@ uniform sampler2D green_param; uniform sampler2D blue_param; uniform mat3 ccm; uniform vec3 blacklevel; +uniform float gamma; void main(void) { @@ -265,6 +266,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)); + #elif defined(APPLY_RGB_PARAMETERS) /* Apply bayer params */ rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r; diff --git a/include/libcamera/internal/shaders/bayer_unpacked.frag b/include/libcamera/internal/shaders/bayer_unpacked.frag index ae214a9ae..950a4733e 100644 --- a/include/libcamera/internal/shaders/bayer_unpacked.frag +++ b/include/libcamera/internal/shaders/bayer_unpacked.frag @@ -29,6 +29,7 @@ varying vec4 yCoord; varying vec4 xCoord; uniform mat3 ccm; uniform vec3 blacklevel; +uniform float gamma; void main(void) { vec3 rgb; @@ -160,6 +161,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)); + #elif defined(APPLY_RGB_PARAMETERS) /* Apply bayer params */ rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r;