From patchwork Tue Dec 2 13:45:29 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: 25318 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 C0884C32EA for ; Tue, 2 Dec 2025 13:46:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 42EA860D36; Tue, 2 Dec 2025 14:46:13 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Dlw2tWJG"; dkim-atps=neutral Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2C60D60D22 for ; Tue, 2 Dec 2025 14:46:06 +0100 (CET) Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-477632b0621so34570105e9.2 for ; Tue, 02 Dec 2025 05:46:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1764683165; x=1765287965; 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=20MMXTnFm6SHHWDjaqh8aMbgaaC551tC4RzFJEsLOHE=; b=Dlw2tWJGShfvohzQBYBoyrKvcKs2TZBmoMydxdQYHWFsGQNZmCDwSPT8wLICmOIB/0 BbgGlNAPXSsAqJWwWWBIvfop/Yu7VGZBDi4tx+HsM7iDAQGptCbkKD02HOU8wLqVY7+f UHoPJyojEPdFO3jUfTp+KlioxwVsfhmybHMw5jpE/P8geV4qE3nTTJR3ZrPSnsQ6tqug 3nCunlBwWnnmU7KPYH7amlVaw1jPJFYtrn4zYw6FQeUNxqwPEQ1s6L3Se9zG2nz4i98+ 2GXiIP3RbbRN5TfCWz82vvcLLAelaFyTQ74wNGv6DMD7qRew+nap9poSByCXgiZAFJB8 LcGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764683165; x=1765287965; 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=20MMXTnFm6SHHWDjaqh8aMbgaaC551tC4RzFJEsLOHE=; b=ST1PrtvROM38bKu/aQ9BciHjmWIsYnmBlch5/cGiFaOs7ef150GV6OHhlmkPf2NQ9V MyghuCLTriyWQTJgWwdZutd0zwRKXimA4k7h9nyZKHLwIPEa+sva4If/wRPwKwZsblKk M1R0hixSIoYF/k7bgeTsJbb3R2Uoy1TdP+UVGbVuFGjBSK+l+1j5o9y2E++8rXqmDr3Q CC0jlRueGiSRZ9/2U7E2yBpnrcLYQRA6hzMgUsRg6VCsVwD4Zm8BzH46cgX3147uI3Ld C0qOp/QEY/+BvGHkvVnvxm/5DP5FJaqTNdBXfAoMY3PVrYDdldOVJOf4yk4Wb/A8M3KG ZYSw== X-Gm-Message-State: AOJu0Yzn4qcGAj4U8lqoFGTiwNokSqvxDAS3DkwnUoC1QwjQH/U35sKs gK+jyCYpJzAS+3JuDCgy7L/+am13AHgHr2bhZG5B3BJA1JZ2kZQoSz7F5IW2Uk1IcPY46nDLfnN lrtj+ X-Gm-Gg: ASbGncuklPwLeFpVhQ7HGlw+d3+z1He39A2GwbnhAM4o0mVC/iB3OZF8yTTXD+2hPjA M9O8a2e//Wk+4H4nhonwdwJaeh0D+63k1Q7u7COItuEjbT5O9vhsNjF6CKbG2mY26lTVWORfo0+ r+7D+6ALh5RuWtbIbPk6O74BKGbzD85I+0b9URAXd6/oiaSJi73OX6DMMFiSsWCGYNl8l34vCNx gErbJiYfgtTFGI1xRBgc5W9uH8tKl2ftWaRYq8GsYIIO7p18DhobjPjR3nCScx+Ud+V+JC1/1ht wbIoC9ZJhj9ttyLa3PIrQes/iHukGp2loE1SX+IkkpNuyX8lmvDAkCo9WLrW2B6kamnjbbycJQr gBhN1KcDrlqR9P2tmafUF+E7miZHjoZvKacn+1hRLTZlX+tjUz1xPaY+zkn9f3hogrpZZMhOC+K liKn2IIknvGfnkya6JTlFDBCFKgICHL7cusY5adWA7GCryDPO1iF7JWnDvNuaRiHxqayY= X-Google-Smtp-Source: AGHT+IE7R4Mk2WORyE6WCzL0gC4n4l6u7b5fRXJ7te7IFUqRB8+Dn/Azkx6S6/7ZWc4qF7pS8z7Wwg== X-Received: by 2002:a05:600c:46cd:b0:475:dc5c:3a89 with SMTP id 5b1f17b1804b1-477c1136b7fmr414976585e9.34.1764683165396; Tue, 02 Dec 2025 05:46:05 -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-47926f0ec69sm19383375e9.1.2025.12.02.05.46.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Dec 2025 05:46:04 -0800 (PST) From: Bryan O'Donoghue To: libcamera-devel@lists.libcamera.org Cc: pavel@ucw.cz, Bryan O'Donoghue , Milan Zamazal Subject: [PATCH v6 09/24] libcamera: shaders: Add support for Gamma Date: Tue, 2 Dec 2025 13:45:29 +0000 Message-ID: <20251202134544.662446-10-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251202134544.662446-1-bryan.odonoghue@linaro.org> References: <20251202134544.662446-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 --- 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