From patchwork Sun Aug 24 00:48:13 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: 24184 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 6EA89BEFBE for ; Sun, 24 Aug 2025 00:48:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4D7CA692E3; Sun, 24 Aug 2025 02:48:41 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ZF5XWgfU"; dkim-atps=neutral Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 84634613BE for ; Sun, 24 Aug 2025 02:48:37 +0200 (CEST) Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-3c73d3ebff0so331524f8f.1 for ; Sat, 23 Aug 2025 17:48:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996517; x=1756601317; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=A2QV3Xi0zvxKKZetBfhOP6WxBrmYNONGtzIFCbwcjQ0=; b=ZF5XWgfU4vr1UT5n2aw9t3Z4dl32yBo5nTwHhWChBZAJcap4FRu4uZzEulbNAtcyBO 0HcwOhT13YbKFB9IltWOSB+bU8oBq8buiOiTIRBGm4kAEcJ2kq1OrLNc/GCJ1JI6Tzqp L4tvZfu3HK2AkFgVcmauoKVxECB3jWxi/AL+z85OwRImXSy0LUBhEvg9cAmk5LxWCwMs WmVtze//WTvhZ1uEte0QjOUTJw5CvGnkjqmfoGXUH6shenxh6undvaLWjcn3IRqlviJ5 +ek9ODsci9OjlGpzp5l650QonHl+c19T3DqV0V+jYM8XYve0s+Cx3fQ4OpGEwQ+qzRfT BbXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996517; x=1756601317; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=A2QV3Xi0zvxKKZetBfhOP6WxBrmYNONGtzIFCbwcjQ0=; b=l2lAj7/TBeM4wJVv0q5B+zoyGVsNJnHhdDy/knAAkMUQHC6cek/14Qin19rsoHdlwL ulS1gazAN7ji6yZdQ81wDWc2gIrY2H+oyoYXQIuCe0Mp6G55W/S8/5lpNKSskvH1Noe1 2YvXfzN70/3vufw/9rQzfbC49T8BVIJrF4ov9qKaH173MilWwX9Qp7hUnYTY1xjeLxz5 QkvGw4QSXTQeKwzysQ/TIV7idij1YFvSOjAzDQVpbqf2yA2O4lQ2GvIbYfEyeQ/N76je y/j90nyfhSUB1SNrKZY2T5QK87O72mGXBjViQCvZLLiHn7GMdg3Fb/tLSIlDOkRWk+WO ByfA== X-Gm-Message-State: AOJu0YzzjGfS2h/1F1wby5nGD4HxlQhsrNY/4IrZLKYUjpO22bsAWZKq +kIzb82FJcelgnijwr0LNqR2np0Ghu6voLcUz0shvKZjxvDsnBuyZZzOFEYoOCt4xCc= X-Gm-Gg: ASbGncsazRNDtsK75eHkCklfCJeZUBxKRRmSnA4/xueAL7MfTMtos3aTEXd6kqdtfhu QPtV4uX/d6IaGjtsskoX49IE1LKk2yCk66hVBijaFFpB15a309spPqvnNVFEMV+9h1LdP6lZ9Hv nb9oAqOjpVQ/JxOWFVwei+gMJdx8BL92pJ5OY9vgbKrl1/A8bxR+AnHucfXtT1PfWAImKNcFyyL CvNemTKoVkI9u4tCBVMi75Uh2xgNuUkh5FDgX+8ljg9jnfXJvjXaJjB9BPoYy5yjF1wAms5MmzR 8AWrl/eB48eHnUrQUly/ZGLTK2VLY1NW2jp8Qd9KSSfKMfe8k5yfm2mpP89ZTmJCI9L0/XTCrJt ezRDloouv1CsRaVXfe2QunyMSlB5z0q8lAnB1a2htVle5d+BzUn8nQXEUKwLfky+KCY+JA2ypqQ P4/cLU9fbT7P9eF7ji2E6c X-Google-Smtp-Source: AGHT+IGqNc95uZgVXXUY+a2YFwixVur9G8WntrhqTsH394odXap6stboHVsoapVURYYMKNVoSEVxXw== X-Received: by 2002:a05:6000:4012:b0:3c6:bd96:214e with SMTP id ffacd0b85a97d-3c6bd962408mr3997788f8f.3.1755996517083; Sat, 23 Aug 2025 17:48:37 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:36 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:13 +0100 Subject: [PATCH v2 01/37] libcamera: swstats_cpu: Update statsProcessFn() / processLine0() documentation MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-1-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Hans de Goede , Kieran Bingham , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2741; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=/+EKzkBop6oezwtSfNAh6oy5GCPuwOMLNKUoZnCfH3Y=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFcSqKJ9kiawPypZmpCkMFCEEwiua7AeBBro nqPTQYQXuWJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXAAKCRAicTuzoY3I OgNWD/9WUz7TCT0OfX0OhQ7SoIPAShQB9pfiAwDbPf9xPdOOQ3p9wjXdn/JDME6Ob3fUUqz54Yt Ek9xj0i1ktwYVyRvHhRxhLnIykQybU/NtIgDgn8dhGrJ3ai9UuYNakhRI9bdJ05nYJF2DaBF4cP J88sp4FOO+WZxIFB1eARic7f36AForaigbkLaDEbO6a+HN+X0ULgzwd/AkNdYCGkFshcokrDfiQ +uvDytp/bQTGbdPc+aHNeyh+RRRsB8biiOTTEFy67hDuct0wsSZDDXkBp6AEaJ+Ou185IaYEWbW zr0Kt9Y5tNoxo+wuj8WRdqdDWKV/BUeJ7z0tYHCuGkLFSIk6TV++vxBTx3SjQAki6Dnjbfo2wSO d1BoU0/rzQtJaE88pIhjsxaVk12JG87m14kXp60cCFcdjUvVCBgl+mBTm/eoLxsFQC7LHJCjpv6 JdRGfTd4b6Sjvnhvr2jZRdYx6Je05jT9S0CTpDQJG1cB1EMMN6FLua3E+5HbY/k8xAGWTsnqFkG SCxik6a6LdRy0oEFA30J5B1HkiPDOnzxY3SxCDGeX+9nP/5+Isev0lFAjPvpAeTn9BtkU91Dl1V sY2HC2ObE0wywRV+JEk4gXl8UUzwcJMBUymC+Sev3GfEVA74chba3J1wK3L02oN4wVQGuU00VD4 WyBfAtz+cTDgd0g== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Hans de Goede Update the documentation of the statsProcessFn() / processLine0() src[] pointer argument to take into account that swstats_cpu may also be used with planar input data or with non Bayer single plane input data. The statsProcessFn typedef is private, so no documentation is generated for it. Move the new updated src[] pointer argument documentation to processLine0() so that it gets included in the generated docs. Reviewed-by: Kieran Bingham Reviewed-by: Milan Zamazal Signed-off-by: Hans de Goede Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/swstats_cpu.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp index 4b77b3600e3c74d739e12e54aa96dc1660c25b99..4c078cc26d9d23daab5358a920a473cd09f123b3 100644 --- a/src/libcamera/software_isp/swstats_cpu.cpp +++ b/src/libcamera/software_isp/swstats_cpu.cpp @@ -71,6 +71,19 @@ namespace libcamera { * patternSize height == 1. * It'll process line 0 and 1 for input formats with patternSize height >= 2. * This function may only be called after a successful setWindow() call. + * + * This function takes an array of src pointers each pointing to a line in + * the source image. + * + * Bayer input data requires (patternSize_.height + 1) src pointers, with + * the middle element of the array pointing to the actual line being processed. + * Earlier element(s) will point to the previous line(s) and later element(s) + * to the next line(s). See the DebayerCpu::debayerFn documentation for details. + * + * Planar input data requires a src pointer for each plane, with src[0] pointing + * to the line in plane 0, etc. + * + * For non Bayer single plane input data only a single src pointer is required. */ /** @@ -89,20 +102,6 @@ namespace libcamera { * \brief Signals that the statistics are ready */ -/** - * \typedef SwStatsCpu::statsProcessFn - * \brief Called when there is data to get statistics from - * \param[in] src The input data - * - * These functions take an array of (patternSize_.height + 1) src - * pointers each pointing to a line in the source image. The middle - * element of the array will point to the actual line being processed. - * Earlier element(s) will point to the previous line(s) and later - * element(s) to the next line(s). - * - * See the documentation of DebayerCpu::debayerFn for more details. - */ - /** * \var unsigned int SwStatsCpu::ySkipMask_ * \brief Skip lines where this bitmask is set in y From patchwork Sun Aug 24 00:48:14 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: 24185 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 14627BEFBE for ; Sun, 24 Aug 2025 00:48:47 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CA075692F1; Sun, 24 Aug 2025 02:48:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="fxbN69N0"; dkim-atps=neutral Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E984613BE for ; Sun, 24 Aug 2025 02:48:38 +0200 (CEST) Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-3c607029266so1163906f8f.3 for ; Sat, 23 Aug 2025 17:48:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996518; x=1756601318; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=UIYO3EkjhnRwMnWRgND5s05n9C0e5DjPX83wUdOOlmw=; b=fxbN69N0gzN/UAuN1AJQskcNMZsBWP6tkXmoAcpFzZA2kcL8PGVhyq6VJC9U5OK/eQ ppnRqKfGxAGCmd3uwvi+81i5CLKzRL4JflZCD/PUWTOqC8uWnp/CuVRmq6lXxXH9ZP5O baMF5lRcXSlvZyntJ3pHugUayXwQhxZCRtaOB3Yz3XLDixNCvcE30LWO2S3f1c8Qlc0Z FPKy4lbKngIcFs89P5T3h/VGmKB6GCnJRma1qO/ioO+RdrRlLMLDgJGNMp0jRyfQnyXz WUggKhHCut0FlisL468GbnDbYj6hvZLj4lNYpnaDvVpJE53sQluK6RqI2Ds2HPVl76iH L+Gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996518; x=1756601318; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UIYO3EkjhnRwMnWRgND5s05n9C0e5DjPX83wUdOOlmw=; b=lz0IVEvcwzWH8rOHeNmsuI4SilI+3lK/6XBQxb74hoMw3fRfUVvAx4e6wwCsbnhHI7 p5zAUn63kj4QW153GbXa6mvmStppw1yLdj0TVDtJGnjeLhGq4v/9cvU0tjXpaM6wANYl kNL3+cQ9JYWV922BBgnxZG5MF30lVpMsk6UOvPhDPZbn5WIbPCKANinEp1064n+YADAl ejVO8YphLuIoJ8nhsSFRuG/N8Rp5DzKotlC+l+CLl54TTj18vbdcdirEd+KwQeW+5ISZ rg2xvtBeYi4vjzWLZ5veFCJo73euSI8+RCFFafcE3b1Wna4+drKrwQAfPWGi4tRVkF+J vKEQ== X-Gm-Message-State: AOJu0Yw4cK+bejN40jiwS6LqsM9hj/RSjHndVxoG4Bznv1QvAVAUy/sL JfNTZtSJmLBixnvd2ae681YS1B6GYDSlze+zbbF4wZqOMPFRXGgV8D581iLiVrAqkbI= X-Gm-Gg: ASbGncuWD5rLKwMzniD7XHcFhVHUb66oCi21VPFP3cZPNRH51Fq6Wyhqh/J26Tqs1wl I256rYbmRpkXYyvZulzVBkLLP06O/swbEVwiKVuJrEu8STqXIOdfIvSKfJsu6nmo4bqmzfvCXRT PK38xuIRYHkLMLyjUlZD2wfOKLtan5IxGCy9gH1AuwX7h6+gMYBsaFq4cwgO3QPe9hZaWborjpX ZJh438ZARTjOFHh8EfjGFHSc9YFI/uaNIf/mAmC8SThQeZCY568/7H5KgzEv3dRfrYwok7pWQOi +rnm3/ylMAmL4GWkRoZBx/KZueIzrxTA3IeViWCfZm5DIxDV0q00tNSK3r2ujqDgZiN6vptECle tw/GIUXWq/EItY1cHcM5ESsdjFWRZ0s+gNf22XFGFDC1+trIgeJfojDKUCfT0WiOZraLik6uSiO DqcdYJQ25h+l/VgRnq7LbL X-Google-Smtp-Source: AGHT+IFyH6/ACHzITJmeU3+cfUPSt5xWwgI6+oM38eA/CLNZr+RuxEJI7PDZTxjIId2EmXOLIe8FHA== X-Received: by 2002:a05:600c:1f1a:b0:459:dde3:1a3d with SMTP id 5b1f17b1804b1-45b517cc0e3mr56337735e9.26.1755996517958; Sat, 23 Aug 2025 17:48:37 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:37 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:14 +0100 Subject: [PATCH v2 02/37] libcamera: swstats_cpu: Drop patternSize_ documentation MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-2-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Hans de Goede , Kieran Bingham , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1644; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=AUh7v0KwOEfEEf8ZmV0YJu3Q4see9tGXXz688gMGyT4=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFcQyG95YbDig9N3x6S4Tf9y5UX1ZWRRkehw fsHvc20SDSJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXAAKCRAicTuzoY3I OsGHD/9AcAnRlWsmrCx2r/9WQp42mP1Z25eBZBB47ZufmvYvSTmgz12BDmnYIUhDWqVm+RunDzr hqD8o2lBj5y+hUF9k6osN8E+IjpSvSZoH75ZwggGPHzW2UseWuEjWLkzDZdigcpH1+w+5KgwAOE dC29ytZbLMr00rTibZQ9gRufwagixrdx7pZtBbp0skhIgmF1D8O4MdKVwq+kM51Uwf4BWsp2j6D 0wTjlnhbxOOnJwCb81NuRVL+NUMG9ZBhg2b8Dg4quMoWE+MgvF7miWHQi2hUvTeKzp9rgU9HGR2 q2d+5XDAFf1dY7EQ6xeBCsAaSjIkvBMTAP7+mQLlmq4l8oEPKX51rBZAecXs/+thrFCkG7IAVm+ fXqbfLR5NU68Q6lp4Svd3Cxn7WNrTQYU8D1ugC84KfqHl6T+1xnpvBVEdIXC4Bj6aMudVMzeiej J09aZVepBn44jhfGmy48vDvC51JcGkRpO7BU5QXGEeDTgBF6bdLJ9eYfOZ/RP72sgdadw0y94zi koMNtvTpy+FHn1bATVU7Yz2n3z7G0zNdO+ti4efEKVFk4BvmBhL9Is05yvixpbnvUalZsnxAuHi MnzC559hDNDO5lDAsEbyVgZsMmODwjn1PT3xWWKhxOYPGm62xxaewXP8W6bKUSkyrLikiPsY6tn aHUjeHgti/WjV9g== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Hans de Goede patternSize_ is a private variable and its meaning is already documented in the patternSize() getter documentation. Move the list of valid sizes to the patternSize() getter documentation and drop the patternSize_ documentation. While at it also add 1x1 as valid size for use with future support of single plane non Bayer input data. Reviewed-by: Kieran Bingham Reviewed-by: Milan Zamazal Signed-off-by: Hans de Goede Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/swstats_cpu.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp index 4c078cc26d9d23daab5358a920a473cd09f123b3..98c23389d7ebf08ba492e610e5775e500420fde6 100644 --- a/src/libcamera/software_isp/swstats_cpu.cpp +++ b/src/libcamera/software_isp/swstats_cpu.cpp @@ -58,6 +58,8 @@ namespace libcamera { * also indicates if processLine2() should be called or not. * This may only be called after a successful configure() call. * + * Valid sizes are: 1x1, 2x2, 4x2 or 4x4. + * * \return The pattern size */ @@ -112,13 +114,6 @@ namespace libcamera { * \brief Statistics window, set by setWindow(), used every line */ -/** - * \var Size SwStatsCpu::patternSize_ - * \brief The size of the bayer pattern - * - * Valid sizes are: 2x2, 4x2 or 4x4. - */ - /** * \var unsigned int SwStatsCpu::xShift_ * \brief The offset of x, applied to window_.x for bayer variants From patchwork Sun Aug 24 00:48:15 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: 24186 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 9A726C32BB for ; Sun, 24 Aug 2025 00:48:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CF607692FA; Sun, 24 Aug 2025 02:48:43 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="zKf5jHU5"; 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 B6348692E1 for ; Sun, 24 Aug 2025 02:48:39 +0200 (CEST) Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-3c68ac7e238so724678f8f.1 for ; Sat, 23 Aug 2025 17:48:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996519; x=1756601319; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=T0R10jCOl1OfGMKNabkYcbxUBrgnPS+zoPeFhpdXKG8=; b=zKf5jHU5bsbul7wosyo+5lt10xNRILTrYlBqW8L3y3Z+G5Y6D/ibOof5povlwVkPZX ttBvUHKkkG88lUFEeSA5VVacE+hHQGOCH4Roxx6tL+wl3+X/yzZ6s5tB4YEZv+wbeM8I CTHMBojwBYRf57Uf9v8I2cEdiIs7P32SgETOZhfs7SvT5VgH4VWZMCFkHBpq4NFz1xrl 2wTU9OP00Mu0QV9UlLK4NYRQaKrxF2KjNicYZTOqWdu0J0WwldZO50E7Bg45947EHbiF BIkKQ1gOyG+3q5S0gUQsbRulRm8LCcq2Z2OmHLOsZCVxUoDKSEQLeQqmIWxEn4Y2DB5q F8Dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996519; x=1756601319; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T0R10jCOl1OfGMKNabkYcbxUBrgnPS+zoPeFhpdXKG8=; b=K6wtWXNhlfnN2pSdQ+6ZO06es+jVlcQ/S1k68NMMf6LSBWAphgVy8HT3QVjK7Vq8Mp sLjCByiRCbfbmsNDHN5fjAWOmwcgqkhuFP4uQEd/zZ7DANZRRSO0Owz6Fagi8NY1phCz KHd5qqugYm0k2zd5wFjAR6grHOHpsw7NYBUcNJwJiAscMIjvWLFsYgui3x6fFerrRzE3 phF2sIb12Jr/XxdRwOx6zhiGonOkPg83NZRrGQtcrztPZvjtCicuB3VvutXXexQPeniI s7ihcRKlYW4/0SfyD3ASCng6EPQzyQmRiPH8qTFHNEvTSGamz2SAUyUH2YmefqkfVdmC Rb9Q== X-Gm-Message-State: AOJu0YxhBn1Yw0s4O+nC/xcyZXMabJlYm6c2/qJpdUI8jWR99pHDBMMI UCva8ofpQFX1LowfktbyvzWbf1tuIFy7bWiL7SbF+YbwVZTwNlpKzY+XIixMXyl+JZzHXMGSH2C 2QyQ31yU= X-Gm-Gg: ASbGncuRRzo5XsjiYWTWxqx7HqVDMS3xn2ErBen1mUxZx5nG5Y3+Bn23O8XiCSLGk71 y5yEw3rRMgLK/On9HQ9klHukghRUScBB2Cq8HqVqAFk++vDRmtKZlaPOjN3YfBpGL+qk0wX6F9G l1zhFsmfOMhCb1/ukDS5T8VksJohr+H4uu4VP1tdNfDTsYKIN0ykviSNVxttn0Iq0sAzZDX0JIq uRj+9kVVt8PzjUVwcshiPGu2EAQWtWkCq6OlAwNNGTXII8JzJbFbcD+gX2bXmgd1r3Df8BHsJUr 9xhu2LBkJy/cyGsr9WT5ODaqCZMNzEMtarDqGsGR74TfQV27PIksinN0XnxZ/ewHJ4Pd14WXZwt 5aNfvQ836V6MaCOyyxNLlbaMh4ERUMky7F0SzCCWSvYUZcluCDJb8xMgoghSqcj5udmC9ww4+Ru E2hLruBLnh51R7kB7hOGHE X-Google-Smtp-Source: AGHT+IGiletKpudODUAyIFxEZznk+RF00BR0VVhUVuFi8DiBwOjXSauEBLV0ulHq5qWFwoAi+87qUQ== X-Received: by 2002:a05:600c:4ed0:b0:459:dfde:3323 with SMTP id 5b1f17b1804b1-45b517cfb81mr60477375e9.27.1755996518904; Sat, 23 Aug 2025 17:48:38 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:38 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:15 +0100 Subject: [PATCH v2 03/37] libcamera: swstats_cpu: Move header to libcamera/internal/software_isp MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-3-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Hans de Goede , Milan Zamazal , Kieran Bingham X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2554; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=2rdUDAhdfZe/ubguZGc0LUD2lQlnka3azHdWPVQighs=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFc8mJUcYmBq/8FwZ7FeUiYQuFdumKZRiIfi odv4k4o0ZKJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXAAKCRAicTuzoY3I Ol6XEACcDFVflAbVSuiQSxG+a0Sq2DWx2FfoeEt08edUZ4oPUKB7lPhWIXdxY5J2ipDh+ZaKYLI mNYcx7RZQ3rCa8JV4XQqV3fMaMYk0+qSKVoLfvSH3PsGklwx5LuAaoJ/hOQaAodOXUzkcf8lIiP cLSJj8XLxF9d8ekU8eX5A1x2hDZKeHygiElzx3OKoLU/lARZaSkh2+1txPLWtNN2t0R1hIiaZP1 dLNY+jJCnE8yACwRnqTJnlNkDlVHdtZCTu0nMVuZymmkZvl6lDMm5vFrRYwRuCdX2ki76mJfaJ5 LC8hin8KGoSgMqLSnDMFmYKgbCQHUOA9IHQRw8le9+hP0Hcgt4xn5ko5HnIyeWyR+puqShAt1Ve pss/gn64hWiD6kR3sdZjBIye80+j14JO4PyyWHL0nuAu/PoTC/XQ2udiBcvS4eSK11wz51u7ED6 daIVWUPz/Pv/UUdHDMb48xQI5vMnAr1lFwmkYnO/Qr/HwdMiUlnxt+IEDGJ3suDFbwkZviLbRO5 cn0E1Yo2iBZUuiZL0TApK2JYKyHjeWDJjxGDNsds7f47eGHxk73KA+yG7zUkST2gR1lXiHxTcoL mz4QoGlaBu0JpMeMnrGT3Be1aZNy1iYqkSiOTg914UJP5iU/NqlkZZefxtL09lmNxvC9VdaHUU4 NoD9KplSgFf4CjQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Hans de Goede Move the swstats_cpu.h file to include/libcamera/internal/software_isp/ so that it can be used outside the src/libcamera/software_isp/ directory. Reviewed-by: Milan Zamazal Reviewed-by: Kieran Bingham Signed-off-by: Hans de Goede Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/software_isp/meson.build | 1 + .../libcamera => include/libcamera/internal}/software_isp/swstats_cpu.h | 0 src/libcamera/software_isp/debayer_cpu.h | 2 +- src/libcamera/software_isp/swstats_cpu.cpp | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/libcamera/internal/software_isp/meson.build b/include/libcamera/internal/software_isp/meson.build index 508ddddca69212161000a4d28707fd4add78b8fc..ea3f3f1c1dfb3a9e87921416d471b96dc2fcf992 100644 --- a/include/libcamera/internal/software_isp/meson.build +++ b/include/libcamera/internal/software_isp/meson.build @@ -4,4 +4,5 @@ libcamera_internal_headers += files([ 'debayer_params.h', 'software_isp.h', 'swisp_stats.h', + 'swstats_cpu.h', ]) diff --git a/src/libcamera/software_isp/swstats_cpu.h b/include/libcamera/internal/software_isp/swstats_cpu.h similarity index 100% rename from src/libcamera/software_isp/swstats_cpu.h rename to include/libcamera/internal/software_isp/swstats_cpu.h diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h index 926195e980186a4d9a83526524bcd563c14c22c5..89a89893d6c039a8d8df4ba87519becfd8fccfa3 100644 --- a/src/libcamera/software_isp/debayer_cpu.h +++ b/src/libcamera/software_isp/debayer_cpu.h @@ -18,9 +18,9 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/software_isp/swstats_cpu.h" #include "debayer.h" -#include "swstats_cpu.h" namespace libcamera { diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp index 98c23389d7ebf08ba492e610e5775e500420fde6..347fc32db13d81cef3d6d1bb7d64241e06d4ad0e 100644 --- a/src/libcamera/software_isp/swstats_cpu.cpp +++ b/src/libcamera/software_isp/swstats_cpu.cpp @@ -9,7 +9,7 @@ * CPU based software statistics implementation */ -#include "swstats_cpu.h" +#include "libcamera/internal/software_isp/swstats_cpu.h" #include From patchwork Sun Aug 24 00:48:16 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: 24187 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 0BECCBEFBE for ; Sun, 24 Aug 2025 00:48:51 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AECE5692FB; Sun, 24 Aug 2025 02:48:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="EKjrcheU"; dkim-atps=neutral Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 49E74692E2 for ; Sun, 24 Aug 2025 02:48:40 +0200 (CEST) Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-3c68ac7e238so724682f8f.1 for ; Sat, 23 Aug 2025 17:48:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996520; x=1756601320; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=64YAzBv08eBeUOixco+cD2i/qSqZ5vgWsysXTG4pROE=; b=EKjrcheUbihDK7Iw65qZfuG3M9BsgV6S6dFvMfMy5/ZVwEr+TiCUecHMgdK65C4+Xl 7vPrPCdPAagbSRMTQ1oPbIkykw0FJcf723oiq0us19IDGoDDmc7sBU21SL4MiGhhbyiR m4OalZl5/XdrbiDrXQWjv2+EKO0HKwu/dH1u0MNh+MgfnAPxKXzF0xqpv7hi7mcXWbK/ 6rRj8UASeqe9y0erS4A7RCAuIuWj5EVjH7mRCRq545dFAEZlqRnGrMQXQ1EhmzPrmsI1 3RzOGbtx7PUQknEcJduP1hQtyoTjQNhcGuvMsFQ2ZIkaGJf3BSdCOr4EYybwsVV/Ymzz 71Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996520; x=1756601320; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=64YAzBv08eBeUOixco+cD2i/qSqZ5vgWsysXTG4pROE=; b=XNPctcnAxVnkGhGf03BwP23XC4heTaHYENk6FCx9DIEDyCzIE/UwX2xUdSMxxAiixV 34RMQkLK4buhgCVq8+nFQfcJNYCpBsQoMrSxzdSmX2/TFJ+RvEFlXSwEPbeWJkxCViA9 a3Bxfbx4aLIWU4REU2TOP5ECV3c/sY329BLfab8tqSLIcjvKO/xNxkORkDhhyKW6ahyO 6BOs9pgsqJ1d4asewdjrWvYHRCEP8yspk3bHErHJVSpuQTOl2Htl3xkjImFqh3rX9gi8 yGTMEcIdi1b2U8qNbhzIoCmplBghmghQn/kJNlsitXRxTV4uvxd2NyHDZlw9JqkVsICb kG/w== X-Gm-Message-State: AOJu0Yw7aWufK1BEm1+qiizTaLzMkXbZ1ZYeqtw7Kx0+d/iNDQiDwcVh mPw/xvhiuMtR1dd+l5+vCTJn9VnCmC+zL1WL8gn8kSreycsk2gFUcWuWKL2EveN/Soc= X-Gm-Gg: ASbGncuAQ6R4hUP93Pmm775B2fSkFb1ParQQz/Wpd6Q67eBJB3/5smj1ZUaJb27fKsU bqWRPiEZyDfGCvq9LTfO+iBacbJy8BkgFJBqGG3B4W1zRMHjOf9o3VzK0ku9jQxnWa3EZ1m6hVk LKW5RU16H/Yw1rIv5qaPyJbaUWGbVsT+h1R/BeRp6A6oHbpH2ZmXnCkDA/x9HjmBA3xljl402se IlgUVqyVYWehxJrcVTdWsHgEyXvbdcsPqO7O/LzFl0hahMgC4jSP+v/1OldkYoLAWsWiRIH2OvP 9ZkP3FMptc1mCHJCKc4KYENWWPKRR7+hbQszJJzquOpmYeCCtLuxEWKixCQj6agtBf/V2QzMPxH 95XPZsA5E80YlPvsDUgFSPJxIC+rKMNw2yPe4vadLCzOU4TVKKNcH2g3j1EKsMwTIBS2uk00HS7 5Pv0saAXVtMZBhyRc0rYXe X-Google-Smtp-Source: AGHT+IFJNIUqhlrANMlkLrEGqlViKR2DG9eRyz7KNLreD23B70r06CWz1YfBxtmn3iz4BXNA0kQEtQ== X-Received: by 2002:a05:600c:45d0:b0:459:e025:8c5a with SMTP id 5b1f17b1804b1-45b517d4b94mr71756715e9.33.1755996519743; Sat, 23 Aug 2025 17:48:39 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:39 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:16 +0100 Subject: [PATCH v2 04/37] libcamera: software_isp: Move benchmark code to its own class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-4-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Hans de Goede , Kieran Bingham , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8718; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=DQzuBIbeoz7dvkzWgdJFlHALQxDxAg4mmCseoMwhdBA=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFdA4vLSqqaY/cxt5GM1N5E8a7ni9aglLSfF p5o/p8j+V2JAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXQAKCRAicTuzoY3I OjNRD/4seRhRzNzaH7P8IOOtfOwEuI3CMbhdhJ1YRt1lcKpat9hgl+z1ZaaSS6Qn36x5K7dHEFj 77OZHsr+pVuyXv0KoY9IK2NDloPZP36kSE05Aoei/zP4+TpIyzB1H6Ks4FRheLjo7GGMOtnbRP8 kKwbKCPp9vPArX1vc4oZJu+Qug4fCl6oNfXKM7e9qYxROb5xBJVGUz4YlRsENQ9JYEfvTZNXu4d Js0vKTP0/Q17JcE4xFH6cN6BWryNkvP6OXL0kcn+nvGVGYVFwjGN6P2FWsq3DjYTkjZuomGAxJ0 w3MinEuOSaWcEp4UjirMuOMBgJcUJb0Q61B7VTHllgTS+uUoXKhB2E3I1A86Bzy1+HlXB0ko9i1 aXENzgBfDsct0lSALXQbu8LDTMXq5P3QWUeqjjPuGiEOXy2LvC2wjtO/WtNsRYNRFriO5hE+qkl LB6PGVYJgLbK/UJMKq7h40X7D0KNQVJdNUrByHWGU2dVnnp+ilWZq5j1m3/As0nKSQoY9mnUUkL LJS/LP6khpv5TGfRtlNSRwRZHpXmjNeyPiDoNO1VJUpXWzNI5X6dPuLAr+cl2EO9WBs4guSwCWJ d0xjUQkcnaVLAPPemCR6P0V0WvoLPyhIYF2WA3Xhf16BKPOw0CoGlbkGgL4DWOjsPcRECsUPpVs AuSAT59vOWC61aA== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Hans de Goede Move the code for the builtin benchmark to its own small Benchmark class. Reviewed-by: Kieran Bingham Reviewed-by: Milan Zamazal Signed-off-by: Hans de Goede Signed-off-by: Bryan O'Donoghue --- .../libcamera/internal/software_isp/benchmark.h | 36 +++++++++ .../libcamera/internal/software_isp/meson.build | 1 + src/libcamera/software_isp/benchmark.cpp | 93 ++++++++++++++++++++++ src/libcamera/software_isp/debayer_cpu.cpp | 36 +-------- src/libcamera/software_isp/debayer_cpu.h | 7 +- src/libcamera/software_isp/meson.build | 1 + 6 files changed, 135 insertions(+), 39 deletions(-) diff --git a/include/libcamera/internal/software_isp/benchmark.h b/include/libcamera/internal/software_isp/benchmark.h new file mode 100644 index 0000000000000000000000000000000000000000..8af2501548d75e1d0bd2043c0a83e96b3af9bd52 --- /dev/null +++ b/include/libcamera/internal/software_isp/benchmark.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Red Hat Inc. + * + * Authors: + * Hans de Goede + * + * Simple builtin benchmark to measure software ISP processing times + */ + +#pragma once + +#include +#include + +namespace libcamera { + +class Benchmark +{ +public: + Benchmark(); + ~Benchmark(); + + void startFrame(void); + void finishFrame(void); + +private: + unsigned int measuredFrames_; + int64_t frameProcessTime_; + timespec frameStartTime_; + /* Skip 30 frames for things to stabilize then measure 30 frames */ + static constexpr unsigned int kFramesToSkip = 30; + static constexpr unsigned int kLastFrameToMeasure = 60; +}; + +} /* namespace libcamera */ diff --git a/include/libcamera/internal/software_isp/meson.build b/include/libcamera/internal/software_isp/meson.build index ea3f3f1c1dfb3a9e87921416d471b96dc2fcf992..df7c3b97dbca7f0b645a985c857ea138a10ab402 100644 --- a/include/libcamera/internal/software_isp/meson.build +++ b/include/libcamera/internal/software_isp/meson.build @@ -1,6 +1,7 @@ # SPDX-License-Identifier: CC0-1.0 libcamera_internal_headers += files([ + 'benchmark.h', 'debayer_params.h', 'software_isp.h', 'swisp_stats.h', diff --git a/src/libcamera/software_isp/benchmark.cpp b/src/libcamera/software_isp/benchmark.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b3da3c4169f907bfe9cae93fe4cafac6428f54c2 --- /dev/null +++ b/src/libcamera/software_isp/benchmark.cpp @@ -0,0 +1,93 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Red Hat Inc. + * + * Authors: + * Hans de Goede + * + * Simple builtin benchmark to measure software ISP processing times + */ + +#include "libcamera/internal/software_isp/benchmark.h" + +#include + +namespace libcamera { + +LOG_DEFINE_CATEGORY(Benchmark) + +/** + * \class Benchmark + * \brief Simple builtin benchmark + * + * Simple builtin benchmark to measure software ISP processing times. + */ + +/** + * \brief Constructs a Benchmark object + */ +Benchmark::Benchmark() + : measuredFrames_(0), frameProcessTime_(0) +{ +} + +Benchmark::~Benchmark() +{ +} + +static inline int64_t timeDiff(timespec &after, timespec &before) +{ + return (after.tv_sec - before.tv_sec) * 1000000000LL + + (int64_t)after.tv_nsec - (int64_t)before.tv_nsec; +} + +/** + * \brief Start measuring process time for a single frame + * + * Call this function before processing frame data to start measuring + * the process time for a frame. + */ +void Benchmark::startFrame(void) +{ + if (measuredFrames_ >= Benchmark::kLastFrameToMeasure) + return; + + frameStartTime_ = {}; + clock_gettime(CLOCK_MONOTONIC_RAW, &frameStartTime_); +} + +/** + * \brief Finish measuring process time for a single frame + * + * Call this function after processing frame data to finish measuring + * the process time for a frame. + * + * This function will log frame processing time information after + * Benchmark::kLastFrameToMeasure frames have been processed. + */ +void Benchmark::finishFrame(void) +{ + if (measuredFrames_ >= Benchmark::kLastFrameToMeasure) + return; + + measuredFrames_++; + + if (measuredFrames_ <= Benchmark::kFramesToSkip) + return; + + timespec frameEndTime = {}; + clock_gettime(CLOCK_MONOTONIC_RAW, &frameEndTime); + frameProcessTime_ += timeDiff(frameEndTime, frameStartTime_); + + if (measuredFrames_ == Benchmark::kLastFrameToMeasure) { + const unsigned int measuredFrames = Benchmark::kLastFrameToMeasure - + Benchmark::kFramesToSkip; + LOG(Benchmark, Info) + << "Processed " << measuredFrames + << " frames in " << frameProcessTime_ / 1000 << "us, " + << frameProcessTime_ / (1000 * measuredFrames) + << " us/frame"; + } +} + +} /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 66f6038c1e765b351871b69e915fbeea23324329..8d30bf4a2115137939f01378e8af594170d4d459 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -554,9 +554,6 @@ int DebayerCpu::configure(const StreamConfiguration &inputCfg, lineBuffers_[i].resize(lineBufferLength_); } - measuredFrames_ = 0; - frameProcessTime_ = 0; - return 0; } @@ -746,24 +743,9 @@ void DebayerCpu::process4(const uint8_t *src, uint8_t *dst) } } -namespace { - -inline int64_t timeDiff(timespec &after, timespec &before) -{ - return (after.tv_sec - before.tv_sec) * 1000000000LL + - (int64_t)after.tv_nsec - (int64_t)before.tv_nsec; -} - -} /* namespace */ - void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params) { - timespec frameStartTime; - - if (measuredFrames_ < DebayerCpu::kLastFrameToMeasure) { - frameStartTime = {}; - clock_gettime(CLOCK_MONOTONIC_RAW, &frameStartTime); - } + bench_.startFrame(); std::vector dmaSyncers; for (const FrameBuffer::Plane &plane : input->planes()) @@ -817,21 +799,7 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output dmaSyncers.clear(); /* Measure before emitting signals */ - if (measuredFrames_ < DebayerCpu::kLastFrameToMeasure && - ++measuredFrames_ > DebayerCpu::kFramesToSkip) { - timespec frameEndTime = {}; - clock_gettime(CLOCK_MONOTONIC_RAW, &frameEndTime); - frameProcessTime_ += timeDiff(frameEndTime, frameStartTime); - if (measuredFrames_ == DebayerCpu::kLastFrameToMeasure) { - const unsigned int measuredFrames = DebayerCpu::kLastFrameToMeasure - - DebayerCpu::kFramesToSkip; - LOG(Debayer, Info) - << "Processed " << measuredFrames - << " frames in " << frameProcessTime_ / 1000 << "us, " - << frameProcessTime_ / (1000 * measuredFrames) - << " us/frame"; - } - } + bench_.finishFrame(); /* * Buffer ids are currently not used, so pass zeros as its parameter. diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h index 89a89893d6c039a8d8df4ba87519becfd8fccfa3..182607cda870be6f650368479b30865c7457880e 100644 --- a/src/libcamera/software_isp/debayer_cpu.h +++ b/src/libcamera/software_isp/debayer_cpu.h @@ -17,6 +17,7 @@ #include +#include "libcamera/internal/software_isp/benchmark.h" #include "libcamera/internal/bayer_format.h" #include "libcamera/internal/software_isp/swstats_cpu.h" @@ -160,11 +161,7 @@ private: unsigned int xShift_; /* Offset of 0/1 applied to window_.x */ bool enableInputMemcpy_; bool swapRedBlueGains_; - unsigned int measuredFrames_; - int64_t frameProcessTime_; - /* Skip 30 frames for things to stabilize then measure 30 frames */ - static constexpr unsigned int kFramesToSkip = 30; - static constexpr unsigned int kLastFrameToMeasure = 60; + Benchmark bench_; }; } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/meson.build b/src/libcamera/software_isp/meson.build index aac7eda7b5b3636e1a580ddb095a0ffd512e86ea..59fa5f02a0a5620fa524d8a171332f04e0f769b2 100644 --- a/src/libcamera/software_isp/meson.build +++ b/src/libcamera/software_isp/meson.build @@ -8,6 +8,7 @@ if not softisp_enabled endif libcamera_internal_sources += files([ + 'benchmark.cpp', 'debayer.cpp', 'debayer_cpu.cpp', 'software_isp.cpp', From patchwork Sun Aug 24 00:48:17 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: 24188 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 4404EC32BB for ; Sun, 24 Aug 2025 00:48:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2B6A069309; Sun, 24 Aug 2025 02:48:49 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="PJbSxArD"; dkim-atps=neutral Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 45E58692F3 for ; Sun, 24 Aug 2025 02:48:41 +0200 (CEST) Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-45a1abf5466so20830845e9.0 for ; Sat, 23 Aug 2025 17:48:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996521; x=1756601321; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=NGF5nV7Z4LkgV9ObL3ETdEhX8lK4F6LQvhvfeDnOBfA=; b=PJbSxArD/SsTkpXr+eqv5iYxg4D6Bl8YUkCBIqfKsYoUKx4GsvN2H/8XKrFaRrcV2q /SaU8k//1u+5feEI0FW7mVyTU75t0BHQa1bfJTeIWjfRW+4NaPcNmOloKrkZFlepOvsc aTjM7C5I9ETumIhOT1VHrewiEm9LX5M8JS3VBJ5U2pfxzqT/5XAhQbSM0BeWXS9lLrEn Ku2yEazw47kM7snk68p1fHeq1csyI3xDNfBPXarE+cGR7vu1nCndyOjyM1IC/C/Z5DDj OA7TBQa+43rrXpAgA7lunHafkHdp5gesACKwGjZ7nkKjUu1+Itce2CNSaLazlQ6cKzjE G8uA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996521; x=1756601321; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NGF5nV7Z4LkgV9ObL3ETdEhX8lK4F6LQvhvfeDnOBfA=; b=BSSVT6dqWtElUNwoJ1zv+m6p37bzLf7bT3qaS/sT2lXttRgvWoVYrWVRDm98fwhmn3 3pqOu1cQf6oaOrgp9+bGj7XQK6Ry5Q/B1HfF7X7sxlKgP2z2a2hyOsAuiIBONameIPlg il/UFvlVjzr2GefKI8+u70dD0fx8TqNIwxhHPjwkXmBxX4lXvCOr6WVobjQ1ipkHXKUD nordR6MVENTBZep4U4KgviyQ68oG/GHbSdJnrn38lbwtlJ8Rwm0V60NQaNlR+s2j8vVR y1QEWBoDJKWv0TUYGSX5kubS7Dlnle0G/mTTRw72RDTV0uzx/oy6eabw/220lCm6aP3N Iiqw== X-Gm-Message-State: AOJu0YwEKDx4aMddP8XVh8CxIXaCAd3fZcbZHfttKbEz+btEF4qf9WDl IVMJ6sAPSmvelZCGFJbwC3DyyswQqKMveLYV4Y57W8v8wBimlpoDrR5kzb4gqCqlcvo= X-Gm-Gg: ASbGnctrqYFvqCCLXYB2K97Ns9uLvh9XOILPn2mNybqPORDgkF2fogCR8XIlsZUC/ET kGPVDzqAX3xQfm+qbJdpUgCtcUTfEANuC7IfrKnckg8/aIrw7xIXwHR20iufwCcF+4mXVvuyhPV lck3LeDa+Chu1gNLocf7rZZ20e4RZoz9h2sWQDLijcFE8NFTUohDgu8cr3QFETPrI6exT5FYjyx zdMyL2K+m90cHIYqKPicjHfO6iUSx49lriyBtSUXVLG5MtBJMTzlpTF18bGnYSWAo/Ze6+U8In6 E+D/Pffi2JVwkFhDBs07qty8lzI9KIXIbUsC7UpUgI4mFwdafi3HEYehhhrsnIYVYj7qG1+or3u GEdhl9wLLbyUzAB5QJK8mIvfWWDxVYdYv09WVY8tpcGOS57vJpkykdnkuHPpXx/TKwLQvNm2IWF +tYr6uzc7gp1K39ywHqv1u X-Google-Smtp-Source: AGHT+IHTdKzlMZ1KCyfSfv2B7hl+zgpJ22W49Sj/JfBJaM9/aWUBEg6d6VQiHgX+WLbSXoE+404ViQ== X-Received: by 2002:a05:600c:4f49:b0:439:4b23:9e8e with SMTP id 5b1f17b1804b1-45b5416dc42mr54925125e9.3.1755996520728; Sat, 23 Aug 2025 17:48:40 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:40 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:17 +0100 Subject: [PATCH v2 05/37] libcamera: swstats_cpu: Add processFrame() method MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-5-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Hans de Goede , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5199; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=b8XaxNg/2llfAP9VuIKy9JajGNNOdI7TmUN8CE9bpcg=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFdjy28eG4IZmQ/67ozOeNtrQeQh4BmR1eMP MPvnRSm2eOJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXQAKCRAicTuzoY3I Otk2EACpX6lb3Y4doEhNEyZh6f3uLD2IvSaC/WUgj/ZC4CAp7tXtGUR+4wEsOy6QDDNotb86jB/ Rb28uKMmsHEhMuTBFCFP2zaw/uHScaXvV70zJSmfhH53oIbT9uB3ZfdxvLBqqUpROyY6sVOC0qz WeW/Z22rcJIUJq2AFm8mUtEAo2aF7dOH6Cc0T85p1KZ1GPeYmCiqa99NrzIdDCsD07Hbk4DNSaR n5AQLPqEFm5eNqlLKaGgA9/V9pbhZLWrY05pskXQL8FQyZUf+1OFjsDNpmambAyecQMmjxa2KF6 Rz+afwrbyLI1UgGcblJ30/N3gEiQmo0djCv0NcL+d/XuKLB9B6XTxVIGXtKtvBuSRa420vil43C VTV8eEdCHwPOWr5KhVjfbOOZiSXHpcwybTVNVw4AyxV1mliCWF8nTa0w+y6y2iNoumA8mVQ9bCh ZKmt08q9t74neOfbtTy8KGV0ntDFwmMPAa1oe6faUDyjOFGu5Q6rhev3GDth3A20SEjLT+wJXYi HDA79HKZSWMY0QdGWBGQ5JxNi9Sg8fPxoyNZb/ta8SNWYykcVqJKMxzDSVjnKQwfnGvY0ay211v pUqDylIY2vNpUpy/41Bu5cJI5tw2acHXE+OkoQpiNM72pmrBWIC+JtUXHbteOmRfJp79aO40MqB sMpCtRIPhu2tpLA== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Hans de Goede Add a method to the SwstatsCpu class to process a whole Framebuffer in one go, rather then line by line. This is useful for gathering stats when debayering is not necessary or is not done on the CPU. Reviewed-by: Milan Zamazal Signed-off-by: Hans de Goede Signed-off-by: Bryan O'Donoghue --- .../libcamera/internal/software_isp/swstats_cpu.h | 12 +++++ src/libcamera/software_isp/swstats_cpu.cpp | 51 ++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/include/libcamera/internal/software_isp/swstats_cpu.h b/include/libcamera/internal/software_isp/swstats_cpu.h index 26a2f462eb1eea359abbb9366e3eba5704ee293f..fa47cec91c1ffce28f9a212bc7a29499daed8be5 100644 --- a/include/libcamera/internal/software_isp/swstats_cpu.h +++ b/include/libcamera/internal/software_isp/swstats_cpu.h @@ -18,12 +18,16 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/framebuffer.h" #include "libcamera/internal/shared_mem_object.h" #include "libcamera/internal/software_isp/swisp_stats.h" +#include "benchmark.h" + namespace libcamera { class PixelFormat; +class MappedFrameBuffer; struct StreamConfiguration; class SwStatsCpu @@ -42,6 +46,7 @@ public: void setWindow(const Rectangle &window); void startFrame(); void finishFrame(uint32_t frame, uint32_t bufferId); + void processFrame(uint32_t frame, uint32_t bufferId, FrameBuffer *input); void processLine0(unsigned int y, const uint8_t *src[]) { @@ -65,6 +70,7 @@ public: private: using statsProcessFn = void (SwStatsCpu::*)(const uint8_t *src[]); + using processFrameFn = void (SwStatsCpu::*)(MappedFrameBuffer &in); int setupStandardBayerOrder(BayerFormat::Order order); /* Bayer 8 bpp unpacked */ @@ -77,6 +83,10 @@ private: void statsBGGR10PLine0(const uint8_t *src[]); void statsGBRG10PLine0(const uint8_t *src[]); + void processBayerFrame2(MappedFrameBuffer &in); + + processFrameFn processFrame_; + /* Variables set by configure(), used every line */ statsProcessFn stats0_; statsProcessFn stats2_; @@ -89,9 +99,11 @@ private: Size patternSize_; unsigned int xShift_; + unsigned int stride_; SharedMemObject sharedStats_; SwIspStats stats_; + Benchmark bench_; }; } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp index 347fc32db13d81cef3d6d1bb7d64241e06d4ad0e..9d45d228e343621605cf5085711c3af9a6915ea4 100644 --- a/src/libcamera/software_isp/swstats_cpu.cpp +++ b/src/libcamera/software_isp/swstats_cpu.cpp @@ -16,6 +16,7 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/mapped_framebuffer.h" namespace libcamera { @@ -360,11 +361,14 @@ int SwStatsCpu::setupStandardBayerOrder(BayerFormat::Order order) */ int SwStatsCpu::configure(const StreamConfiguration &inputCfg) { + stride_ = inputCfg.stride; + BayerFormat bayerFormat = BayerFormat::fromPixelFormat(inputCfg.pixelFormat); if (bayerFormat.packing == BayerFormat::Packing::None && setupStandardBayerOrder(bayerFormat.order) == 0) { + processFrame_ = &SwStatsCpu::processBayerFrame2; switch (bayerFormat.bitDepth) { case 8: stats0_ = &SwStatsCpu::statsBGGR8Line0; @@ -385,6 +389,7 @@ int SwStatsCpu::configure(const StreamConfiguration &inputCfg) /* Skip every 3th and 4th line, sample every other 2x2 block */ ySkipMask_ = 0x02; xShift_ = 0; + processFrame_ = &SwStatsCpu::processBayerFrame2; switch (bayerFormat.order) { case BayerFormat::BGGR: @@ -425,4 +430,50 @@ void SwStatsCpu::setWindow(const Rectangle &window) window_.height &= ~(patternSize_.height - 1); } +void SwStatsCpu::processBayerFrame2(MappedFrameBuffer &in) +{ + const uint8_t *src = in.planes()[0].data(); + const uint8_t *linePointers[3]; + + /* Adjust src for starting at window_.y */ + src += window_.y * stride_; + + for (unsigned int y = 0; y < window_.height; y += 2) { + if (y & ySkipMask_) { + src += stride_ * 2; + continue; + } + + /* linePointers[0] is not used by any stats0_ functions */ + linePointers[1] = src; + linePointers[2] = src + stride_; + (this->*stats0_)(linePointers); + src += stride_ * 2; + } +} + +/** + * \brief Calculate statistics for a frame in one go + * \param[in] frame The frame number + * \param[in] bufferId ID of the statistics buffer + * \param[in] input The frame to process + * + * This may only be called after a successful setWindow() call. + */ +void SwStatsCpu::processFrame(uint32_t frame, uint32_t bufferId, FrameBuffer *input) +{ + bench_.startFrame(); + startFrame(); + + MappedFrameBuffer in(input, MappedFrameBuffer::MapFlag::Read); + if (!in.isValid()) { + LOG(SwStatsCpu, Error) << "mmap-ing buffer(s) failed"; + return; + } + + (this->*processFrame_)(in); + finishFrame(frame, bufferId); + bench_.finishFrame(); +} + } /* namespace libcamera */ From patchwork Sun Aug 24 00:48:18 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: 24189 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 CF37FBEFBE for ; Sun, 24 Aug 2025 00:48:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 049CF692FD; Sun, 24 Aug 2025 02:48:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="gAayJoIV"; dkim-atps=neutral Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1FDA8692F4 for ; Sun, 24 Aug 2025 02:48:42 +0200 (CEST) Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-45b5c12dd87so3404785e9.2 for ; Sat, 23 Aug 2025 17:48:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996522; x=1756601322; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=tJg4W7XvV4RX190Y3LBbTV0mnGTCxezpMPVHDsEmziY=; b=gAayJoIVxcSeZI0RHdnOcKTQkW8uSLuSxO6jwIh3DnEv0XuwD4nTFfEvD88w0CCuK8 D0y+aUUiz881uPDD1ufIM7HWR5yJzNXY4B7XwbeGph5trjEA5SCQLXXnfeoiOAUcLSjD 3R66QFC5ZtO3B5zgzNdxTGlxE/Gzuz66V7sWqUYllx3Fs8gX7W1JMStgnCeMq3cFwWzk LiOXvhLiuj9BIqq8PRKfVToL/3ghykZ+QycHbQ2Tfjlu03jEu6XCt1Wc9mCC5if7nTtV W4Uo3WrnnLe31+ZNIea8q/Vor5Fo+pcrYgdxbniHbqfiRhP+j4nHmLJxHhWNUWRiNjph GwtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996522; x=1756601322; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tJg4W7XvV4RX190Y3LBbTV0mnGTCxezpMPVHDsEmziY=; b=gtasYvGWFaxoMhY61kgiS+vMBo8Sc19048TXz4VMmZKHKTDvguK3OGnwp6LandZqQ+ ss21OoigRtdJDGSUkpqHac20gPkoVpghGUgIjeh7wxQqWlCc7qmJB4Ru2k033qcsOPOt i8vN1Qd8exOXWO+uk/CLAk5Fe1qgexbOr2Wp4JsApn+4AQsZlLce2dI/m5afmjT0tQmZ JuXTE/It4CXRRnsobUoACSyLKp8qS33jsMFyuuqEMQ+9au9NBCPRbDYGk5LkjEJfChsF QfmLcCpWrn+CYxpgPose0b/B8cq+DC7x6eEHe9sdFTrz6ALWlJpY+jliRc4typDCOg2J c3Ww== X-Gm-Message-State: AOJu0Yx04f/kmV2u27ntj/cDX1oP+rITrem01jiaHdXDfFTexDCXBKG1 dA9kOMkYrKL2k4hdCSp2pS9inTfFQVdHP/CHzbgkWzlLMz8/JvDZ935dXhKq5bzMFdFpphe6HRs q5ClRZBY= X-Gm-Gg: ASbGncs0amb3gTwew7QCeY0rDMZbX7ob9pn81KV5Hc+EamfRs4ix1TdCaZZT/UoAmxv PBfiu0k50Z/DPdhmFhXKE6lwkpJ/cTqgTgxREJB1YjDOODJAWuTDmNzOIX7FWZX6p0tl8nnBT4I HoUK0wCXJgIoQc6ZlmtAUBaXGYAVrDIE1ginWg0qf4XuWjMgH+Nmg4bjGOgn885JjRC0RExzZgP 4vvl2K80Gmc/akcc+oj/3LyN0Tlf2EC2vDOyMXMvttHMcUZJVNzo224dwWOevbSPYnEb6LqmD7o crUimmjRJS7j5uzTOqzlCoM84wBhg3chs/FGAt8nZ4wBCKvxjjiF2RVnn8QtxGO5ulUHQdnFfGJ +i19ry4Wk6IxbPVGNKjd+z6DZu6TudMhvqIEiIX3FKi4d1fg+45n1dMTnxIOLxbs5M1SC5SW8tJ XNvFVTYRe66d2nWHag5ukf X-Google-Smtp-Source: AGHT+IGHJUcFlLcMzLARueAew8ikbm5r0IQf+3nyms/NpIQQs7YpdCCEY9VHxi4xjBJ8uy6l2o5Uew== X-Received: by 2002:a05:600c:1988:b0:458:bd2a:496f with SMTP id 5b1f17b1804b1-45b517cbf19mr56877175e9.21.1755996521641; Sat, 23 Aug 2025 17:48:41 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:41 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:18 +0100 Subject: [PATCH v2 06/37] libcamera: MappedFrameBuffer: Add MappedFrameBuffer::getPlaneFD() MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-6-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1906; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=092EHdwSf+5Rt7hozTx/KrEY70u8ynItZ52MVZPGE5A=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFdbIkGja6JJej9jP0/5WwrdeetoxArXcrBt ZKCvNTT+uaJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXQAKCRAicTuzoY3I OkxND/0R1LrpsCuA4GrNJgOqLSNxj8mWwGo69073laNzkzzF1FZXmqCKJV5rWUBZxWfKv4ldPE+ nhbJRdnOJmSRJucb5+Zw+XEbUf9Qra6RECRLsUDHVCkJj5X7MiT8sel0Pb/Q2U2fr0hoYoi67b8 XzOmPkQW8qnYBxm8DEi/K8Uu80WabINfTugZ8IhBaYdvaJHHWTSum9LnCHXPe1kQhtUMpY6mrCX 9ktm7R848N1jfiO+Cptpp6swRzLa8vsnNSEB7cVbcmavo85X/KQdQFOFlwicBrJPa7WKsXVcxeY iQbgF3a5DlbeQ4gnQeIPcGfyUKHi/ouhOvXA/TazZga2QXMs1ZItaoMDUdZHIfWhKx7L5KgeHLO Z7OmOvUfOoM3aOjrM8uS1hEwaAW6dqBd60JrPi7LEJjqEylMu8q3eU96kR60a/Y52+pnVTJqvB3 JZt/pxzjcyo9nzdIjEhXj8ni05nvnNwx06cDK78mYpg/5vg0gAU2wfJm81Cd2vwGctCAr+l05Hg wYCz6MfXpwDoVyAxW9TMnabuIqG/s7M0SvdKeSKsSymymIO0ty2tEcZUZcQhMfU8Zrepd5c56ru ctPjCUmvX4QsssI1fDR6pMtLyMp5DakBdorDOijMpi0fjbckE/9ikTUeQeQ3QVZbv3u0275otUq 7mVnriRyQPaig6g== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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 MappedFrameBuffer::getPlaneFD() which takes a plane index and returns the file descriptor associated with it. This fd will be used to feed into eglCreateImageKHR for both texture creation on upload and directly render-to-texture where the texture buffer comes from the fd given to eglCreateImageKHR. Reviewed-by: Milan Zamazal Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/mapped_framebuffer.h | 4 ++++ src/libcamera/mapped_framebuffer.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/libcamera/internal/mapped_framebuffer.h b/include/libcamera/internal/mapped_framebuffer.h index 6aaabf5086b4658363e4e2ed02242248bfffdcbc..f7a6870764c4d035f77544354aa46a70095952a0 100644 --- a/include/libcamera/internal/mapped_framebuffer.h +++ b/include/libcamera/internal/mapped_framebuffer.h @@ -55,6 +55,10 @@ public: using MapFlags = Flags; MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags); + int getPlaneFD(unsigned int plane); + +private: + const FrameBuffer *buffer_; }; LIBCAMERA_FLAGS_ENABLE_OPERATORS(MappedFrameBuffer::MapFlag) diff --git a/src/libcamera/mapped_framebuffer.cpp b/src/libcamera/mapped_framebuffer.cpp index f54bbf21f10987aecdf02c0a946edbb4931dd4c0..e85030d904ffaa5cd8cfae7b02d4b1b7010452a5 100644 --- a/src/libcamera/mapped_framebuffer.cpp +++ b/src/libcamera/mapped_framebuffer.cpp @@ -238,6 +238,16 @@ MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags) planes_.emplace_back(info.address + plane.offset, plane.length); } + + buffer_ = buffer; +} + +int MappedFrameBuffer::getPlaneFD(unsigned int plane) +{ + if (plane > buffer_->planes().size()) + return -EINVAL; + + return buffer_->planes()[plane].fd.get(); } } /* namespace libcamera */ From patchwork Sun Aug 24 00:48:19 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: 24190 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 EB3FEC32BB for ; Sun, 24 Aug 2025 00:48:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C379B6930C; Sun, 24 Aug 2025 02:48:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="q0xPzHu8"; dkim-atps=neutral Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F165D692EE for ; Sun, 24 Aug 2025 02:48:42 +0200 (CEST) Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-45b4d8921f2so22219825e9.2 for ; Sat, 23 Aug 2025 17:48:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996522; x=1756601322; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=AhO5jbmqIErrZjhRQ9bdap2VGhNmIAawszqjnj5G6G0=; b=q0xPzHu8324Ga3Xjz4WC9U9LcjbqookTlHsaVE7bdXa7uHSKfhj7BfbRno4l3qymPd n4+EEDTAQxnHMvBTAepEEZshZBPE7tWcFaKJxUdx2V/jlXLrtCliFI5nEtSBPuNJG96N L6Qk0qtB8LcMfs3+S027beD7GejXRNogexSb+Vc2k3Rv/5LHwakItHypa2UMbSCSKpD/ q3eqF9Y3OD3S7vZTuuluXNvynG1EgFKpPI7TCPcW/xaI1aqvGVsEb4yF37bB6ggRYn8h N8gteaEzup584JIk+OYJZLMn3wYw+24+L2nFbWw6JSdkyLdruax6B/QgmXhrZQw0eUXt BVVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996522; x=1756601322; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AhO5jbmqIErrZjhRQ9bdap2VGhNmIAawszqjnj5G6G0=; b=IUHl7b/drcW7tLD+7OTR8clPA+9zpeZwFYKCupjTUm51usV/DAe/86Lxd7BjuLCyW9 z5TIzd9ddJrD7ZiCuMWPL8ZV3zveVtqqE/5uyt8fClGp9ouo8Lce5uY5puQ6F4w9+rzv 2I4F9AK/j6k5A5zDQzMScCXEEncqFrCEzIWXOwfgp/8I7xjxUO4VVB7GCVPJjGhGZ+9P /E30ss6gWqSYw0AnicgW1cV28PPBtqCo1i6ID8SZgQjLCI7LlOqMS3ENEhuSRRa4mQws JwjyNCn+8nh9Ql5IB9ENwLRnP7rN13qH93VzssfPKVWwW2/yGuKFGtuKmPuk7ZrUvw1B U3ZA== X-Gm-Message-State: AOJu0YzwJLh3BeUXZOY6Drts11Ag3t9VX0QnIU5Y45o8oKjr1O09wRIf 73dRlOtESclgk78rv1WzvHNUxuGcl1mIsnfGs/ztOeidtgJA9DRTZjKLF0UsqNGR3cHy94KOAWx vm/DtglI= X-Gm-Gg: ASbGncuE5qoY01fzKQTByXEITSQ7RliG0F9x8CTWI3NSOKkLmrY3KSremd0I0j0rPew /OEhvySgP9A3T1wNmmQrDYTnJHlMPukzP64bc4/fWdyCKKfcPQjG5U7XD3UUJgHwhezhkdjupXX +NVpUhBJbvFLg+aq0fNBry08FECDtt3LCEj5fRKthQAnElLGGoeRmD0LyTmsTWSTcQh/qpb2vBU AZJvktDakLqE7R8UrGRM75re5RFQKI01qFzXNjh/seXg60aTkWoZq7DAcejGmXhQM6Ol1PDvoN9 L3DjlpekDqZZ4L/H+ySFKRt2IslNBW2++Xq/yoGa9FFmKzkJqTXfhhTDOuge07lpSQ5yZ94aMH6 VnlSpRY7EV8Lp666BCmTS4Vz9Ue0EDbtEqzIWX3r8y83D0HjnYlQf3dDAmEojkWEcZdxy+pGTAD CSvDkH2+XxW/OqW6MLHDGW X-Google-Smtp-Source: AGHT+IHd1ioe6SThEkVwGuh7YZPOZvaCjp43PneYdSgjb3eJynAhUL3q0tYjtwsvSkFm4gfcB0vJXg== X-Received: by 2002:a05:600c:c87:b0:456:f1e:205c with SMTP id 5b1f17b1804b1-45b5179f338mr61693245e9.4.1755996522472; Sat, 23 Aug 2025 17:48:42 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:42 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:19 +0100 Subject: [PATCH v2 07/37] libcamera: software_isp: Move useful items from DebayerCpu to Debayer base class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-7-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5591; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=LwIhgiDDDDu/lPFoHfcp8xRUGk7VZNzUmlvPynHsyck=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFdPeLlik6pgWEGFBQ48HIivehWpPvY1zqVZ go82bhgqSeJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXQAKCRAicTuzoY3I OnWsD/9UyZ5TN2WYmPvpw0lXfAr8edt72+LPDaRiUY7UoIDv9zV+g1NahNwmjrnBxy5zQ6UI65n cOouR0bWLw6+rZ/R8rc4n+ciAq75Jt4MpK3OWASLr6IMxEhZUL57tiYvOzapfAWVPZieP7yufwx rnY+DsUMfvuVf1UzblRiVo6W5i5U0PkWBAXbCs5IRs8fTu2W8kCmHsGY2JVJNe8hrNz/mS9X+5F vnLLxOwdQdqJJQU7x7/OIkJzUM9K54vstAwJDEt9jvfneJQSOolqaxqTl8U1z3r+jkZvPQsRztG 8OLplSKYZtMhrbmBykRf91vLZQ9lZaIBa4wSih8KTKVirGFrwWZqKdT3qs65gd3ixzNiGb+qWaS V+CjAdvQVmMB/uPjnVcY7c9UIW/32/BZV4k010Trr4wYswltlbIjtAIoump/Ckm3p5O6EwekELh fdRuBBhFN+o6HDCkeZvKxt6w1W4c//pMG3J3CfQgg5IRoEuENueSjjXTlS99Xm4T5vNOLaHO4NG NHIXU0BKTgn2YXRdVcHO9kfrc7ZD2PaDNHz3cqTcSWRZMMISjp2hPAXZ619F3M9i4aBVLAhC4HH D2yT1+iXlKSwmFsfz0B9OXePQu7qDr5/XY/ions+eNuUSilvuc4hp3aAY/N5gH/zPtqIpkCuU2j hHCgRho/q4MO2RQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" The DebayerCpu class has a number of variables, embedded structures and methods which are useful to DebayerGpu implementation. Move relevant variables and methods to base class. Since we want to call setParams() from the GPUISP and reuse the code in the existing CPUISP as a first step, we need to move all of the dependent variables in DebayerCPU to the Debayer base class including LookupTable and redCcm_. The DebayerEGL class will ultimately be able to consume both the CCM and non-CCM data. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer.h | 33 ++++++++++++++++++++++++++++++- src/libcamera/software_isp/debayer_cpu.h | 34 +------------------------------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index ba033d440901230875a6aba5d37027130791b87e..45da822a2173070fd1b99bbfed4c0fdeaa1a88c6 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -14,11 +14,13 @@ #include #include +#include #include #include #include +#include "libcamera/internal/software_isp/benchmark.h" #include "libcamera/internal/software_isp/debayer_params.h" namespace libcamera { @@ -27,7 +29,7 @@ class FrameBuffer; LOG_DECLARE_CATEGORY(Debayer) -class Debayer +class Debayer : public Object { public: virtual ~Debayer() = 0; @@ -45,9 +47,38 @@ public: virtual SizeRange sizes(PixelFormat inputFormat, const Size &inputSize) = 0; + virtual const SharedFD &getStatsFD() = 0; + + unsigned int frameSize() { return outputConfig_.frameSize; } + Signal inputBufferReady; Signal outputBufferReady; + struct DebayerInputConfig { + Size patternSize; + unsigned int bpp; /* Memory used per pixel, not precision */ + unsigned int stride; + std::vector outputFormats; + }; + + struct DebayerOutputConfig { + unsigned int bpp; /* Memory used per pixel, not precision */ + unsigned int stride; + unsigned int frameSize; + }; + + DebayerInputConfig inputConfig_; + DebayerOutputConfig outputConfig_; + DebayerParams::LookupTable red_; + DebayerParams::LookupTable green_; + DebayerParams::LookupTable blue_; + DebayerParams::CcmLookupTable redCcm_; + DebayerParams::CcmLookupTable greenCcm_; + DebayerParams::CcmLookupTable blueCcm_; + DebayerParams::LookupTable gammaLut_; + bool swapRedBlueGains_; + Benchmark bench_; + private: virtual Size patternSize(PixelFormat inputFormat) = 0; }; diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h index 182607cda870be6f650368479b30865c7457880e..0b4b16e1a3b64f8eed25b6017274b21c9a89a1ee 100644 --- a/src/libcamera/software_isp/debayer_cpu.h +++ b/src/libcamera/software_isp/debayer_cpu.h @@ -17,7 +17,6 @@ #include -#include "libcamera/internal/software_isp/benchmark.h" #include "libcamera/internal/bayer_format.h" #include "libcamera/internal/software_isp/swstats_cpu.h" @@ -25,7 +24,7 @@ namespace libcamera { -class DebayerCpu : public Debayer, public Object +class DebayerCpu : public Debayer { public: DebayerCpu(std::unique_ptr stats); @@ -48,13 +47,6 @@ public: */ const SharedFD &getStatsFD() { return stats_->getStatsFD(); } - /** - * \brief Get the output frame size - * - * \return The output frame size - */ - unsigned int frameSize() { return outputConfig_.frameSize; } - private: /** * \brief Called to debayer 1 line of Bayer input data to output format @@ -111,19 +103,6 @@ private: template void debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[]); - struct DebayerInputConfig { - Size patternSize; - unsigned int bpp; /* Memory used per pixel, not precision */ - unsigned int stride; - std::vector outputFormats; - }; - - struct DebayerOutputConfig { - unsigned int bpp; /* Memory used per pixel, not precision */ - unsigned int stride; - unsigned int frameSize; - }; - int getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config); int getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config); int setupStandardBayerOrder(BayerFormat::Order order); @@ -139,20 +118,11 @@ private: /* Max. supported Bayer pattern height is 4, debayering this requires 5 lines */ static constexpr unsigned int kMaxLineBuffers = 5; - DebayerParams::LookupTable red_; - DebayerParams::LookupTable green_; - DebayerParams::LookupTable blue_; - DebayerParams::CcmLookupTable redCcm_; - DebayerParams::CcmLookupTable greenCcm_; - DebayerParams::CcmLookupTable blueCcm_; - DebayerParams::LookupTable gammaLut_; debayerFn debayer0_; debayerFn debayer1_; debayerFn debayer2_; debayerFn debayer3_; Rectangle window_; - DebayerInputConfig inputConfig_; - DebayerOutputConfig outputConfig_; std::unique_ptr stats_; std::vector lineBuffers_[kMaxLineBuffers]; unsigned int lineBufferLength_; @@ -160,8 +130,6 @@ private: unsigned int lineBufferIndex_; unsigned int xShift_; /* Offset of 0/1 applied to window_.x */ bool enableInputMemcpy_; - bool swapRedBlueGains_; - Benchmark bench_; }; } /* namespace libcamera */ From patchwork Sun Aug 24 00:48: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: 24191 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 02C62C332A for ; Sun, 24 Aug 2025 00:48:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AEFCA69312; Sun, 24 Aug 2025 02:48:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="HUFSV1Hh"; dkim-atps=neutral Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C8AA1692F9 for ; Sun, 24 Aug 2025 02:48:43 +0200 (CEST) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-45a20c51c40so26179505e9.3 for ; Sat, 23 Aug 2025 17:48:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996523; x=1756601323; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=tLEHqivrWJMjpVCUINDZ9MbPl02eXZ0jb9Y1qP3OEYE=; b=HUFSV1HhwK4xfQz8YKD10iJBlDmJEeCZCA7uu1qXdrykBvCJ6e9jUmRFhFU9mzQBxx PwX/MghLJqRHdYpj8W8g5/9JHkcd77EOCq43HYObmAYZ0x/djztAy1JXzpB+XsGy9635 d4ViaiUU4CTdwlHCSUm/i9xjxYWje03BQvonZ7jHEmC+aoeJB32/ZqlDunVxfSL6UEPb iM6uct3wgHw5/QTtpcrD6NdX09ivInTGa6aby1KkZFD3j07nNgDlHYlvIwc2RtaJO1pw qjfrepmtuKp44yvNVzzsn4dVXXr0IaT3wf8fxYpsupEOb+uiuXvJE8nTEFmhMYmm3ksw oTmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996523; x=1756601323; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tLEHqivrWJMjpVCUINDZ9MbPl02eXZ0jb9Y1qP3OEYE=; b=cxxtPzqULUU+byUoIQ3IRzJ7QrabBcJFNBTNwqw6YPHpKjw260G7j6GbADUzc18F3n rFGRRHy4f1TBalzeQq0+IOTur0qJ9Q6p13FVFD0gAkQr2hXcsG77cJxtQp2gHJAsCvUc ytOFTEyGl+nwOkopdn8bzuWVnumFncXemKqbdrwWCt2bScYNq5/Bh3h9lQ9ENE8jltR6 R2lcgxAqzKciKepQBMiDzIlUZdMap+x3GLAjEQtPF9KfW+k+mJAoNT6JTDz1+nNwJY3U j8t65v0nojyf9pDq2OQ91yvEuL6KUx2osTjZ7JZuqCG1ExCONiUFLDMyVc5h9sN9r5oL 94Lg== X-Gm-Message-State: AOJu0YxD/0Zgrn/87u5NFAdEXx9oOSy6jz5RKkNMz6Opw0ySOCBIbReV c8kS3HBbVwkIlCDixy2IkUp8Yw5hYmfGwYOeQ2ddM01mx+sjX8L3NF0IDuMEA7BMOJ8RyB6negJ CnsujNI0= X-Gm-Gg: ASbGncuH9vKPKxGgWZteBrWkeVijNlM0mUEKCwbrp/SRsX0sCjYTkLQ57OFpjwyx777 qfMZKBrwiKmmdk9u/Bp4cr2D6ibpbX+BzEuSxFv2rD7Yi90tf7ze5nVwDf5CW16Y/HInFeTuN3u xeWNtFL96dN3W5e6HaVI0jr+DXkN+UKmI18JsG8xAYslI2s/TBHLIlYyqopwcZMwG2iQsqF6Cp5 YFM/kyA0VpPUJq5qRmxWM1Z6xTjx2RJHx3D2V0nfhmbFKsXVK6j/4SfDfxV2u3DI7hfrbqFwQEn cp8k8n4EI8tvNEfG/p4kW8WRa+HctyF0gTm9F1hJaUTlR9YwwkhOJq+RSUF3JlSCWvrQ5S6qPpC IQEqgiczDeKjIs70cNOSdyjNNbkTBJCzTdV6hI6+gd3zTHfFX3cZCyul7Cy7k3W/mYHndD4FFzc mymJNGVnwh+lBFmXJAvSPm X-Google-Smtp-Source: AGHT+IFjptaJdN2vrT2gFU5/REGe/9B7ex2dmWlVztgCLktnMAyS3lx+vQVeT7YHQqJp5lePure0YQ== X-Received: by 2002:a05:600c:3147:b0:459:d46a:ee3d with SMTP id 5b1f17b1804b1-45b51798f71mr61017965e9.2.1755996523366; Sat, 23 Aug 2025 17:48:43 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:42 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:20 +0100 Subject: [PATCH v2 08/37] libcamera: software_isp: Move Bayer params init from DebayerCpu to Debayer MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-8-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2546; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=9pqT/2tcr+vuIs31tYBPjv6bibSNjZwn3wDmv+0JjMQ=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFds/QdokyC9dde07KRjCYeifDjtt6/oK5uA wv5RLwHc1qJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXQAKCRAicTuzoY3I Oqi2EAC0eVG4tTAR1sUyZJaEHeUb8lT7UYkbjYfGGxputIm/uK8MlIONuNWimkbaftRUeIMoe+v oqVQgqfb71W8m71pShpXJHgm9qj0gOdlVMubR6YD4NE5qrySBBWAxZ83oteaZvfjQEYXxygaXYI /5KLfctJaj6yxlFR+V5/sm2y9jYVXqc9ArHGbTRxX47xNwwea7H1AbYq5Rd92G9AvjxLgoUtq7p SYo+YURFHo4+VcFg7o7GloMRt2wkguxqTy/j6KI1bV28DoiOLqQ22enev/tX14Gp0m2CKZwYsl7 L5O4QBboMIpMnAFSHhG78TGKPOa1G9q+j+qjOQ9ug8lZ0lYHbZqaFDHXxNuaqJORGWBRRfVZAH1 SLTWBp7hxpy1iNABysjYyESNThUdaAZ5wI3Cr7xAa7Dr6nFt29IV8YpIR5p+vOouT/dM9LGwa0T oC55b/qckv9cstf3Nq5RUDjBZTwStUJv4HPoctka9WfCmFDry+J4UZG6I9un8F77CXfkJqUDX9X W4QC/dWzhpsODL2fGRLBICDbXRiKJbccyOhtYPmMV2Z0lKRfycnvCP2Bd5NX2BE/VV7rPzBoGyT IxsxkOYjW9TTqireH3r4MT3B1bFpMSLtw00JIZk+MI17c5p/lKtcg4bxD8IW3EH0VAAZoPQk2mG uri1q1tWXqKXeCw== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Move the initialisation of Bayer params and CCM to a new constructor in the Debayer class. Ensure we call the base class constructor from DebayerCpu's constructor in the expected constructor order Debayer then DebayerCpu. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer.cpp | 11 +++++++++++ src/libcamera/software_isp/debayer.h | 1 + src/libcamera/software_isp/debayer_cpu.cpp | 8 -------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp index e9e18c488489c776ee93886184113406f39e6685..29fdcbbfd4eba4a23c520b22784bf003f22a93f4 100644 --- a/src/libcamera/software_isp/debayer.cpp +++ b/src/libcamera/software_isp/debayer.cpp @@ -103,6 +103,17 @@ namespace libcamera { LOG_DEFINE_CATEGORY(Debayer) +Debayer::Debayer() +{ + /* Initialize color lookup tables */ + for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) { + red_[i] = green_[i] = blue_[i] = i; + redCcm_[i] = { static_cast(i), 0, 0 }; + greenCcm_[i] = { 0, static_cast(i), 0 }; + blueCcm_[i] = { 0, 0, static_cast(i) }; + } +} + Debayer::~Debayer() { } diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index 45da822a2173070fd1b99bbfed4c0fdeaa1a88c6..01b6e916f2a7199c592abd8a57ef549eaf388a8b 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -32,6 +32,7 @@ LOG_DECLARE_CATEGORY(Debayer) class Debayer : public Object { public: + Debayer(); virtual ~Debayer() = 0; virtual int configure(const StreamConfiguration &inputCfg, diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 8d30bf4a2115137939f01378e8af594170d4d459..408ce2baa5e8a23902cbf0ca2b9ea87e73b4e882 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -51,14 +51,6 @@ DebayerCpu::DebayerCpu(std::unique_ptr stats) * future. */ enableInputMemcpy_ = true; - - /* Initialize color lookup tables */ - for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) { - red_[i] = green_[i] = blue_[i] = i; - redCcm_[i] = { static_cast(i), 0, 0 }; - greenCcm_[i] = { 0, static_cast(i), 0 }; - blueCcm_[i] = { 0, 0, static_cast(i) }; - } } DebayerCpu::~DebayerCpu() = default; From patchwork Sun Aug 24 00:48: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: 24192 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 5EDB8BEFBE for ; Sun, 24 Aug 2025 00:48:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 03918692E7; Sun, 24 Aug 2025 02:48:56 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="mIdSf5PY"; dkim-atps=neutral Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A655E692F7 for ; Sun, 24 Aug 2025 02:48:44 +0200 (CEST) Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-3c51f015a1cso1518124f8f.1 for ; Sat, 23 Aug 2025 17:48:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996524; x=1756601324; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=YCvAN3AkHvBrZEDLQ+W3FSbEc9RScQY0mqKdSYiufr4=; b=mIdSf5PYlLLLU6JRwRZBi/CuHBa3Sj9kF2ufCyS1VnJs6MhFOPeoQJdqmThoTjz4XV 00O8NptO/JPKH79jU9qRZ0YxZeFhyJNSP+UvzvElrwijRy7ktIfsXrlsbJcvGRKNoTk4 sOtO/5tLvJfAAqzF4v70WIU0FS2PBo0KlWnIu/gDpgUawvoJ32W2FK1Oam+LY4sW9ByR gqMruVN3yLZUR/MGw5Jqx+nj+33NcUQtezcc2r1bptjsQIgcfAy2mJX8usuWA6BkHPX9 piWdpKK72PT6zjrmxLD7Uqxra3WYyaqrGT/E9OgCvk5Sv08b48JzaM1qXX7aDZasj7By ImzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996524; x=1756601324; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YCvAN3AkHvBrZEDLQ+W3FSbEc9RScQY0mqKdSYiufr4=; b=FwFJK3ucGoCPBM2kPaVemuviYkPnYuh0gLRlqdccX4J1u32xYD+7LVC+dkrU943b7m F+f8RlsimiKWcPeA+raTC/TWBUGww7g/Zzg0Af3IMPTs61WCRdMrxTtGyOcTu+RafEI/ KA5aQk7r/iezCyN0Kf1g4E/0EZqaDvhydd/7gtqMndSBBMWCj7muwE08src+PyMSFXQN igRQRx9BoEZOKjPzrGq0j/JpdBnGU3wxLfsl80C1pjsD5e6H1cWMiQ2ePxEz/elX8xCM GJOitCE1B1g3ajuRKLV03qA6yzdRB5900fBCDzDLLR1aQ6Ws5OTvFXz449fN9dOr8M+U 9Fxg== X-Gm-Message-State: AOJu0YxHqUhrAe9G7asw1ke2CwmYy1xlQSBYsbDfKVsnLJxl2DRhxv8C 975CIcTzT4etmfzZ8DDLVpOhjtGTH4srTshM2cRqOYurAP6MCYhHZ8M9SBUGaRBNn4eqrdq71oa XA3hTIe4= X-Gm-Gg: ASbGnctJVGsDIAxeJ8KOj6PYesYDaNnHJkY8CfhCb9LQ8oKVqcNTG0/xQGKbeVFRBzP p74TVLfAMEDM8izvEHso1rpHzLSq4qC/zc7BAmXs7MW6GhTCs/ymfsN7ROl5LNqBA79t/+geGvP Se+3kJlr4lUZHzVocBt4RovcWKvKzJ/TVsERcdM8FjV9BLBa5PSg5XP85cJOzWvMKCca75k3pfk abyT7qSMmC6muU/1gmIpT3k9IWC920ZvzEWgIe8WIUr7E5pYuhB4+KLs6a7W0ygBMXekEqkyPD8 ebInGTDNGiIY496lqAgxxx4xb42vLykQMllZkZXKecNih1968kiTbYdJJ+0LNnDUYtvMqXu3Pyr ah9gQPmyoKiZFlKXjjpcwJ/R5bo42LDIbI4rmSRnTBw1hZmvq2fiJG0RitMLPgMEIWk01NCPeeM 43nYjSoCZxim1C0ZiXm0Ph X-Google-Smtp-Source: AGHT+IESa23UAxq9VCu+jvTGqSlESjTR7NMbN0WDJEfInZOuXDm31O4UG7BSWG9OP9aECnh3UXMPYg== X-Received: by 2002:a05:6000:1788:b0:3c3:5406:12ad with SMTP id ffacd0b85a97d-3c5dcff73c7mr5206682f8f.61.1755996524146; Sat, 23 Aug 2025 17:48:44 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:43 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:21 +0100 Subject: [PATCH v2 09/37] libcamera: software_isp: Move param select code to Debayer base class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-9-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3263; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=4PFBU4wyuVCiot0OIoWB+yVFv1FF9Up5n3zwiCDX61s=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFdqFqkgWXzExU1MZG2X5WcIPy/YsIohsoEQ l0oHi/frKiJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXQAKCRAicTuzoY3I OnloD/9kj1Cl+/4xDAEWoyWz65qgDHDdxhdFIs2ZjzwaHcTAI02Ts4qWFXUZkdJzyzAlrSHM6X5 1TLPEyVnz5hfJpnmd2fjPzXoiN/7qLnPg6PpvsXAy25NZLQdxieXhNrDuPLHkKI4m2U7wC0s7YH 659xAzPSmvILmA05sEmNv0qInm3fH33xbH8jiXTWB9F0iIc+RSOb1h0+0R8n9UvhZgTJnIEpYsn NTFFgnTugEs41vpWfolw7hpjAM1aJnKNFziV12p1R8B78xc2INgtpc43dx4TtrjHWD2Hiifqfw/ 50VxYzM1m0Ji0QgdaqBisCFzLsPSG0hquKwD77Rli8EBK0861Lk1C8Z3YDFUaa2TNVetgiJeuiU hXiGsdznHoZDCRsbLKVbRImHOJpQcpassuzsc5FXrmcBjIdaCCu0+5W3bh4J9UHLXIglZ2nTW+8 mUhFstZbLd04oIfGrYUjoc/KUiHqD9rBAIAHaxxD+qySOcmgfmvUZE5S3SY/rZz7INDvINQOZ1k eqSgV3DvpdD+/sN7sWuwIop2By7VtCkrYhhKUpELyRd1ejnqzVjfV0qhcul/whZoxhxP4dr30V5 4ZAkmby04dcU5jhO1tlEY7tNX217xhduf2Li6F4PpYmQEmsFTIZEj/J4oWseYyHs6wjEs9Oi3I/ bgKiNofFg3RaNmQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Move the parameter selection code into the Debayer base class in-order to facilitate reuse of the lookup tables in the eGL shaders. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer.cpp | 27 +++++++++++++++++++++++++++ src/libcamera/software_isp/debayer.h | 3 +++ src/libcamera/software_isp/debayer_cpu.cpp | 19 +------------------ 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp index 29fdcbbfd4eba4a23c520b22784bf003f22a93f4..fc2438c0d0161a36da2769d95836f282836b143d 100644 --- a/src/libcamera/software_isp/debayer.cpp +++ b/src/libcamera/software_isp/debayer.cpp @@ -187,4 +187,31 @@ Debayer::~Debayer() * \brief Signals when the output buffer is ready */ +/** + * \fn void Debayer::setParams(DebayerParams ¶ms) + * \brief Select the bayer params to use for the next frame debayer + * \param[in] params The parameters to be used in debayering + */ +void Debayer::setParams(DebayerParams ¶ms) +{ + green_ = params.green; + greenCcm_ = params.greenCcm; + if (swapRedBlueGains_) { + red_ = params.blue; + blue_ = params.red; + redCcm_ = params.blueCcm; + blueCcm_ = params.redCcm; + for (unsigned int i = 0; i < 256; i++) { + std::swap(redCcm_[i].r, redCcm_[i].b); + std::swap(blueCcm_[i].r, blueCcm_[i].b); + } + } else { + red_ = params.red; + blue_ = params.blue; + redCcm_ = params.redCcm; + blueCcm_ = params.blueCcm; + } + gammaLut_ = params.gammaLut; +} + } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index 01b6e916f2a7199c592abd8a57ef549eaf388a8b..5f692bcbdeec1447c596ebbdc984585948a34880 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -82,6 +82,9 @@ public: private: virtual Size patternSize(PixelFormat inputFormat) = 0; + +protected: + void setParams(DebayerParams ¶ms); }; } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 408ce2baa5e8a23902cbf0ca2b9ea87e73b4e882..6ed17e9fc144bc7c3472d999b1e9c23236020963 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -746,24 +746,7 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output for (const FrameBuffer::Plane &plane : output->planes()) dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Write); - green_ = params.green; - greenCcm_ = params.greenCcm; - if (swapRedBlueGains_) { - red_ = params.blue; - blue_ = params.red; - redCcm_ = params.blueCcm; - blueCcm_ = params.redCcm; - for (unsigned int i = 0; i < 256; i++) { - std::swap(redCcm_[i].r, redCcm_[i].b); - std::swap(blueCcm_[i].r, blueCcm_[i].b); - } - } else { - red_ = params.red; - blue_ = params.blue; - redCcm_ = params.redCcm; - blueCcm_ = params.blueCcm; - } - gammaLut_ = params.gammaLut; + setParams(params); /* Copy metadata from the input buffer */ FrameMetadata &metadata = output->_d()->metadata(); From patchwork Sun Aug 24 00:48:22 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: 24193 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 CEFBCC32BB for ; Sun, 24 Aug 2025 00:48:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6383B692F7; Sun, 24 Aug 2025 02:48:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="rtzYDCwb"; dkim-atps=neutral Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 36EDB692E2 for ; Sun, 24 Aug 2025 02:48:46 +0200 (CEST) Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-3c6ae25978bso1067835f8f.0 for ; Sat, 23 Aug 2025 17:48:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996526; x=1756601326; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ljHxrgf3vZvddQcR/4+c7ZdyCTTapW6dccH8trXoUgo=; b=rtzYDCwbAmp/QxYJSzKmAZjUfjkkJnAC8iyvEtHQT6VUqiQKQzQhE9UASKCsgObBbr V7966q64Nup7VY9QfSIBi9PBOmYUPu4N/vvEwsx+4guOqmXxBYhQaS/o9YkdYytStCtX DJSIJi9AXTWAcE1PtCVI1/987tthW09IM+0XYqtqwx9c+EKtBASj7YhC/9wY1+e6r7lE ckplbHLDEscXxT/XtzUWHKadqcE/P9SGHieX79VW2zEdzwQcGUCFJN+6bZ32jZONCGmc hTy7j4CIik5P9h5NCdHplisaoDze5GUl5OO6KtA830r9REXqcaQenWcGj8EG1MoWaTk+ qcHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996526; x=1756601326; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ljHxrgf3vZvddQcR/4+c7ZdyCTTapW6dccH8trXoUgo=; b=GouO7DSedz8D8iUN4lOJMODZEh3o2vOpegYgoi3H4ZZ0UkSRm1oOZFib/LVfJ6ElWE Q0AKbvo2miI8Q50dljAhcee+VJ3v3DyRs0nwXdRmjsxW28Hqz+/nSJfurMAVyISBoBAY z2OyLA2cQem4Ieykx5l0E7n9wnK8ipxoyaEly7u5OyMtWmZkKQv1cELbPXP+aewParYb qKJfGSsi5JkOhPnT93w16mpUw3RLTO2obv0sNK7JU/ISGS/VWBXcdRgnrXP3ScD56UQP epgZ6mhXR8PaseTVCE7KdYN6wWICGTytd6/1E1z5M1NoQXfvvpiX5H55ttmQ8VXDgouv ir4Q== X-Gm-Message-State: AOJu0YzCARA+Bc+ib+wUv+6SxyXZkauzTraon5vMDwsYqpum47QJQj1Z fwnDdVa8Y2smo0S1AzNCBkCw7joEQzaV5+EpH8d98oV0kZliRhx1bQK9yHcxk9FE7oVvGfG6jto S/sgMgVI= X-Gm-Gg: ASbGncuQxXWfmM1q4F/BCmy0kkJ4B8W4gNmRo5iGr4kWyVRqPj3DeQ5cgU6LEN1zA6o v4qya/HY8a3IF1Ut6ReNMop4aeTSu4cCz8nhnsdpUbQ++QIzb6SHfyKKdSCTtaReCXfXCnNbqND Lu2u9I5U1cyQaNulUMDtIlShzmlt/87jaNa24lNZWJtjS4luU7gnmfPUjzWxfcMMNJa2vQYaLUD 7DfYgJTl32fxcLwgqA2DQPSX4IWrTM6ECwfY034Ey2K6LJ2yXDYewHyZDQlmGwRZlx1o8qFYDkO pUYkKSBHUHnpBluB6mkJSMBOZPAGpMkLq/ZuHAU5YMJVEQtt+rkMZ7+Ew949ghn66yO4LfwxcO6 L38GQjYoqeI7COLBM/AA3utBecPZR2Y2+i8S+I5SZ/k1rD/s+9ziiB5qONK9Qj8KKe6XF+M4t6P +li43aG4+AidtEFWVXnHNu X-Google-Smtp-Source: AGHT+IHiwnoFbPKEtdZGCt1uh+N1+bkxc1Ggnw5aDqBq0a7xCPAhiyRKaI1PKa2WNUO2Sn3FehphWQ== X-Received: by 2002:a05:6000:2f81:b0:3c3:7cba:6d18 with SMTP id ffacd0b85a97d-3c5dd6bbcffmr4802218f8f.55.1755996525612; Sat, 23 Aug 2025 17:48:45 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:45 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:22 +0100 Subject: [PATCH v2 10/37] libcamera: software_isp: Move DMA Sync code to Debayer base class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-10-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3124; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=rTghYOVfOgNztjAsM9CLcURyL9hv4snptnXuCiaB0w4=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFeX1fb9ALVtB1N0+AmBzwxeX8HY+16k21N7 yscyrcrjcWJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXgAKCRAicTuzoY3I OqTgD/4k84tx6SeH5JbiA+OJaY0kFn4zX9bzoYrqUGwdvc67+kd0Veic/wX2oVjH79OtLc6yllr LJ8LHWbNnax7e0mqgHd34W+xSX3zPF/CIvrfaRck6Xu3WPw9NamjSYbne7P+GHkdgknvxVmhMnY +CjzUh5auaNqZlXjPxJtII46l2bmCXBZ91HiaMu+N+QDUZYI2Ai7W+8xCX0SdGOwDbVeMP4wyDK YotpZpH2SfEeq6cu/elNKDzGrrfnzu+Km/AdoK3KTmIpRXRe38vAHyhhB+xkQ7ZPykSONTIZMX+ VKE4LCJ36A8XaSMO2BYWar3BVEmr87/RV4jG6P6noQJ1nlzBpKmOHw7hJbJW8umTJd5GOOA82Oz YPnEt8muHR3VRkZtNPNrMc8Y5jMeIgISqbkTEnh2Cq1Q9Oxg7ryK6KUtmTD+cjfijT5QmiXlqzk uBTn1VIV68jILATH415IsIDnFrgUDgWvTnqoPipepWDTdJ8RZ3rHbVumU89pSK20Ko9qBdZMB4U Fd3BJhGmiMjjfzOFmWet3Z7iK9lrBMHeTTcBO2tO8SqWIaA0iTvo15SNlolR7xSEDYQJHIz+sMQ Y4A+QwiquSOaWfBETV+mvZfkTDaA8N9y5cVnUy3i0GWiEpTG2JajiMgH7jITciqv91iBDvThJ2C jGI0vLocL+TJEqA== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" We can reuse the DMA Sync code in the GPUISP. Move the code we need to the base class. Signed-off-by: Bryan O'Donoghue Reviewed-by: Milan Zamazal --- src/libcamera/software_isp/debayer.cpp | 13 +++++++++++++ src/libcamera/software_isp/debayer.h | 2 ++ src/libcamera/software_isp/debayer_cpu.cpp | 6 +----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp index fc2438c0d0161a36da2769d95836f282836b143d..75e4bffab0f082bdf6e5bdf3030b9f49d4877524 100644 --- a/src/libcamera/software_isp/debayer.cpp +++ b/src/libcamera/software_isp/debayer.cpp @@ -214,4 +214,17 @@ void Debayer::setParams(DebayerParams ¶ms) gammaLut_ = params.gammaLut; } +/** + * \fn void Debayer::dmaSyncBegin(DebayerParams ¶ms) + * \brief Common CPU/GPU Dma Sync Buffer begin + */ +void Debayer::dmaSyncBegin(std::vector &dmaSyncers, FrameBuffer *input, FrameBuffer *output) +{ + for (const FrameBuffer::Plane &plane : input->planes()) + dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Read); + + for (const FrameBuffer::Plane &plane : output->planes()) + dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Write); +} + } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index 5f692bcbdeec1447c596ebbdc984585948a34880..0af66b556bbf8993a66042a3a76cd50582209bce 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -20,6 +20,7 @@ #include #include +#include "libcamera/internal/dma_buf_allocator.h" #include "libcamera/internal/software_isp/benchmark.h" #include "libcamera/internal/software_isp/debayer_params.h" @@ -85,6 +86,7 @@ private: protected: void setParams(DebayerParams ¶ms); + void dmaSyncBegin(std::vector &dmaSyncers, FrameBuffer *input, FrameBuffer *output); }; } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 6ed17e9fc144bc7c3472d999b1e9c23236020963..9fce2a143ac9585eadcea41744d680bc9589c507 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -22,7 +22,6 @@ #include #include "libcamera/internal/bayer_format.h" -#include "libcamera/internal/dma_buf_allocator.h" #include "libcamera/internal/framebuffer.h" #include "libcamera/internal/mapped_framebuffer.h" @@ -740,11 +739,8 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output bench_.startFrame(); std::vector dmaSyncers; - for (const FrameBuffer::Plane &plane : input->planes()) - dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Read); - for (const FrameBuffer::Plane &plane : output->planes()) - dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Write); + dmaSyncBegin(dmaSyncers, input, output); setParams(params); From patchwork Sun Aug 24 00:48:23 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: 24194 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 33DECBEFBE for ; Sun, 24 Aug 2025 00:49:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A452769310; Sun, 24 Aug 2025 02:49:01 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="bp64ZIm4"; dkim-atps=neutral Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E2F24692FE for ; Sun, 24 Aug 2025 02:48:46 +0200 (CEST) Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-3c68ac7e238so724713f8f.1 for ; Sat, 23 Aug 2025 17:48:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996526; x=1756601326; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BSbX7C6RruZ0Vo2tdf4h+8oPbP0c8nchKXGky/xmrks=; b=bp64ZIm42XrHcuyfY4tE7aeefLmY8+/NGE7Td2Q4XXVf02QVUCGNpXm2ts5h6eOJDW WiPcmml7y4dZbTYtNy9Cdv7BwAY6f+KrmFm4CaebDJcI+LMo7Akq6GsRvMom/YCJD3Dv FAkdD6Wjqb1XAeq9tf41jD7Zrkp+Dw/Mc/JEK8Lh0AW2MrNdV3u9QI2YGO3J9v8bMBpm kbJhmlCS7A+R6kFTahS3sn1aDUlNM/Xzy7QSczeV9iv9Uxn4spApBirdjc+QrAjgT7Ob KyhrCr+KSGWM11wThhOPT3HjtNqcwtLKPu8oJBJ0sn8T5MbXsR+K7BwFaCngPeoAtNwy Htfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996526; x=1756601326; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BSbX7C6RruZ0Vo2tdf4h+8oPbP0c8nchKXGky/xmrks=; b=oyFs1MN9kd9FvxfabHFWSjfTgAHDl1IBFOqZH4HFBS9H9QJgJV0JabINodUX001aeq VAo9+gH778a415rkbw8KZYkZKUFdz+dfmbPr0jrx9yzFGknpkAuZ1XHMNg8yOpcHTv5y eAJ2A4qFmn2X8cY24Cqgi+aUCbEQn4ZjSaRE+m6lQ+U0fr/kCeKpN+06JFbHzv03OIzd WWMy/UOtO9RLBJTmZ1iWPskQSn8v9OCtZHn3g3Q7TJrEgYjql2MhyZrR5caMZCex+0dA Ogo1THUnd6brK479eI2OjMNKicTXCJz037dz6kLh9SKBQeSSuUemA111Tj2QM7fPZt7K JPNw== X-Gm-Message-State: AOJu0YyLMJNAmPsV3bh9gjHVnoh8nhOw72jAGDdqo1oHM7BdaiE6QJkG ynvfKb5SI04rGtYlmTnU4u/w8f8Ut+DVMRDvmL89CQbF5KKkD57n0ffkKL350E+Q4qUqxXGWO5d e24Ldl/4= X-Gm-Gg: ASbGncvggKFSvHrjzJxsWs7j/xYKxHXUKto/aQSuIZb0rpL80i0ntkLvIYljYhNzsrn WzYayCVHapLyWImqCs9a31CJj1LCdMcQ137yc+eVso1F97HYkBLHMgIe15eUkQLUCd6DfWiCB/m xUTPMoa9ldfFBe9L11x3O/OWqG18TLzbkzCpOkI3OBQrCmzRQiOcHB1NPyWymBNsTQ81hqyTCuB XNu1vaYxrTrUePfxXtQ0PRStUN1p9umrejrmzX44eJF6g6EcVAgu9TGOYm/l4apXFDSwS/Kb6B1 FvXQJ0Cdw7Pilm7yTDf99L1AWh72jwTLzLP2rElhToRbGCWPrct739neU10wuBLl1RAb1Z1YPZz C3QUyzqrX08Bdv7wUxwgpaplpeUtRSZQW662+JWMKSsjMhoItpl8bWmPm/lJ1TVkZ8LQvC1EG2j 4gBcQZwp8/+jQelrrSGMOM X-Google-Smtp-Source: AGHT+IHTEmKUIzNdLgvEQRbO50q1BZhjiXvUCcwaLg2H2qjiXiq/J2JisVHT46P76rEeOWgp2DvE5Q== X-Received: by 2002:a05:600c:4ed0:b0:459:dfde:3323 with SMTP id 5b1f17b1804b1-45b517cfb81mr60478385e9.27.1755996526351; Sat, 23 Aug 2025 17:48:46 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:45 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:23 +0100 Subject: [PATCH v2 11/37] libcamera: software_isp: Move isStandardBayerOrder to base class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-11-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3477; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=ezFIPvA5CNelaul8+zGJV48vGwnX3ZJIvKfBKS23Dik=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFeY1KzCNiftSUNIYmZ5WwHfSnjo/ZVKGNN/ JmnRekeGvyJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXgAKCRAicTuzoY3I OiiKEACfSVFx9TwAEomoRAhwpJb1NhQtvWRNUN4zwczuNMCF0c6Jt71ddSFER4tkPdGDbelgZuv Cdq4CYU/yVAhtqeS7iCg5uLNtlOGJrZ8B9Q7LQdxy0rraOrZttsX2RH2lG9AVk8nawBabjDTg8j Ktr5P+j/fPYnzBVhrNSR6KL/3MJjkFLfmGKCGZb125aALbsdILlI6Eiq8oB625CZ/Cja9vy3dY8 7PiuhKum/USLwT81Zur/bMXCXvC6wW43GciP21DYkhRnEygv3qx+zBUe6CzI0F01AVNWeL+B7nS dRly1LwLk/tOypL9Xg9q+Jsr76vq+/vM8HvsEtqecyFncGXt4qCFdkny9jQVnrxzn/qA0e0KRsM USj0ALuOY0dVJ1yubZ1p2v6ikEqfO4Qw410CMYDOqp0FIsq1fEH6myM5mNSrMBVMBgoGEmpXVMP j2FgTikmpqkWE3HtBn+M5CQiEgrb5Q5v5688iVtAD5B65FmJBAYsycNiIwOv6nBvl5qHCqZCtvC BFuNu8AOU+OHGoKLfE/tKhApsH7xEKM3oJG7fxH/IYWl8RhZfuB9g7KS4JTadDNYCsgIDkqXzSs 0FmydNrSQCHHLrPjc87tisSlsj+V1HzZl3BlMLYBhP6a5oK7a8ujM22nfUb4s03EEJIqKVmCZhO MWoMKHgLu6ykqFw== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" isStandardBayerOrder is useful to both CPU and GPU debayer logic and reusable as-is for both. Move to shared location in base class. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer.cpp | 10 ++++++++++ src/libcamera/software_isp/debayer.h | 2 ++ src/libcamera/software_isp/debayer_cpu.cpp | 6 ------ src/libcamera/software_isp/debayer_cpu.h | 1 - 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp index 75e4bffab0f082bdf6e5bdf3030b9f49d4877524..c16ce44b181edfb94f2532db76ffa4fc222c588d 100644 --- a/src/libcamera/software_isp/debayer.cpp +++ b/src/libcamera/software_isp/debayer.cpp @@ -227,4 +227,14 @@ void Debayer::dmaSyncBegin(std::vector &dmaSyncers, FrameBuffer *inpu dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Write); } +/** + * \fn void Debayer::isStandardBayerOrder(BayerFormat::Order order) + * \brief Common method to validate standard 2x2 Bayer pattern of 2 Green, 1 Blue, 1 Red pixels. + */ +bool Debayer::isStandardBayerOrder(BayerFormat::Order order) +{ + return order == BayerFormat::BGGR || order == BayerFormat::GBRG || + order == BayerFormat::GRBG || order == BayerFormat::RGGB; +} + } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index 0af66b556bbf8993a66042a3a76cd50582209bce..214bcdd3c535bae7851d6e0221ba68c19785507d 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -20,6 +20,7 @@ #include #include +#include "libcamera/internal/bayer_format.h" #include "libcamera/internal/dma_buf_allocator.h" #include "libcamera/internal/software_isp/benchmark.h" #include "libcamera/internal/software_isp/debayer_params.h" @@ -87,6 +88,7 @@ private: protected: void setParams(DebayerParams ¶ms); void dmaSyncBegin(std::vector &dmaSyncers, FrameBuffer *input, FrameBuffer *output); + bool isStandardBayerOrder(BayerFormat::Order order); }; } /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 9fce2a143ac9585eadcea41744d680bc9589c507..7bd1fc39266f651845cc7a87ac991aa67c36c094 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -282,12 +282,6 @@ void DebayerCpu::debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[]) } } -static bool isStandardBayerOrder(BayerFormat::Order order) -{ - return order == BayerFormat::BGGR || order == BayerFormat::GBRG || - order == BayerFormat::GRBG || order == BayerFormat::RGGB; -} - /* * Setup the Debayer object according to the passed in parameters. * Return 0 on success, a negative errno value on failure diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h index 0b4b16e1a3b64f8eed25b6017274b21c9a89a1ee..a043a954134e71c625a8d2e493c45f9ed22624cf 100644 --- a/src/libcamera/software_isp/debayer_cpu.h +++ b/src/libcamera/software_isp/debayer_cpu.h @@ -17,7 +17,6 @@ #include -#include "libcamera/internal/bayer_format.h" #include "libcamera/internal/software_isp/swstats_cpu.h" #include "debayer.h" From patchwork Sun Aug 24 00:48:24 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: 24195 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 3C7C7C32BB for ; Sun, 24 Aug 2025 00:49:04 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2746E69303; Sun, 24 Aug 2025 02:49:03 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="qaZziY0M"; dkim-atps=neutral Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AE72A692FF for ; Sun, 24 Aug 2025 02:48:47 +0200 (CEST) Received: by mail-wm1-x32a.google.com with SMTP id 5b1f17b1804b1-45a20c51c40so26179695e9.3 for ; Sat, 23 Aug 2025 17:48:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996527; x=1756601327; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=TfqtxqIsqCyESJnF4snpoyUimWkfpfXPHPpywJRlG8M=; b=qaZziY0MGAFqB7rKcFX+R7n15UofoSHdoZ7L4JACONYe3FpcK0gZviw7Mm5Bte61ew YYNG3NodYgWurLmslKs4/UUAnnE+tGI7EjDaQduNctaiepbmoy3P5cPuOJrH7UtSRVlu PdYBJ3Ek+S96U3Y5fYREVdZBIrW69xsYz03r9MRnIo0PgD9VtMY5QS05+r7abIFvEKMf p3lD1mUZZfOfmhXYBJnkwNp5D/rFfOXFexgiqI0rPLV98OejJN1dmmBvzoi8s0j3iDN9 A6ejvK5tjY4fNqwUJtWQZJFMHWk3Vt9UUsA+tU1PnXam+/N7VlVNqtaX+3xWhP92NMah +6dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996527; x=1756601327; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TfqtxqIsqCyESJnF4snpoyUimWkfpfXPHPpywJRlG8M=; b=X1lmNGbM3b4nBRxM3QtuyEq71kTmKiaG2xTS1QDmEcBKBuUzHV1D4ITlUgH8j0RzVu /fMFBLrTPZ0x1QDRYsOLo/0La4KTapkNjYspXU+2AscCm2Wh/+MTEkMNPwGmQPm9fRtB 0b5Gl9p3mXX7NzIMn7T8QS6LhH8tewsguainZrNXv/jhQprghbyWO5d3yKaeDoyd6Ah+ CSqt2dV9oTuJvVZEYZiMHN+RmbzdqaIgxqpY99xu1GmCTthXfcSydFESKhHqsSIq/yde f+wVy55HWRtqaWlSlhMXjVAsIsXaTcRMXoscA2I6nWR+mc5tWXbo5kUH39+4pCgnpB0E OfWQ== X-Gm-Message-State: AOJu0Yx1/9kIJZQHBsk3b8hhth6fyvGFNU453Q+Yw6sxzLB88R98LA6a mJ3toBR5cykPhgbs/gH4+q/iAgTEujX3uw3nf9r8vsAdr25ocv1KbzFb5xiBiduZM1O4GFxE4l5 iuD5V0qU= X-Gm-Gg: ASbGnctV4xD9XiXHEdJaGlAy7SWhfz6Ms45HGxqGmOIMxi570J+70tjsGZEF9BQYfDo hGTtVu9l8udBuMEOLYrGR+r9fQ5FvZLSutWRZkMrPZ3qQSgdzC1jQ9BhrcYc/5D8NUQhf6EzWR0 7tP8b8WPk8Uw1nsMT9nM/XSazJnEpdlVIBAKzx5AYW4oLLRFvpl2oQ2LVy4JEzaOn+ybwRHv99L qOoairF9q9UdS0Bmq4Flb0dRNSXSszi5b9TfGJJmrpAkS8CcO8llnM7j9UzDZbXKFW4H9CMi3fp w1z78N699ZwwOUGwtTFebnMDaZGTmPUvSbr4QGAUdAyVgRqEEqZTu3iaSsGUWkEQQdkt3toMXvp wh7h0nomtHub7kBBhAdxh28iRK4PNsiG98grVdX7uL3oSyqVcT0SAUg0gE14sH2CPaGRQhki+pI Gyv5ouuoK9yYsvjJO2DAzl X-Google-Smtp-Source: AGHT+IHVYpyMhUzef8/MU7qtnMuTb0LPjXYvgtnuFBz2R27BdOn6KOb+hvZPwlh9bYKpS9glrGXD3Q== X-Received: by 2002:a05:600c:3212:b0:459:df48:3b19 with SMTP id 5b1f17b1804b1-45b517c5df0mr47197135e9.18.1755996527241; Sat, 23 Aug 2025 17:48:47 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:46 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:24 +0100 Subject: [PATCH v2 12/37] libcamera: software_isp: Start the ISP thread in configure MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-12-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1811; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=TJz2c1i4gj5Q/xRIyCEfIizExQxLMBanHSgh1qaIxXA=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFeekoGOrHPNkZ23S1I4csSplTg6EZM/0FRj K8OWRwCG6GJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXgAKCRAicTuzoY3I Olr9D/oCpMP0uAlk4rPKyyfK2eU6NEJ/aPMkKwtNSAgZhKdcdr35jlLFcCmLJ4XyR7mxiInPSml g2qbY/Gfo8OG/hR1JJP/0eYuer+DpaT+lf+a3eIuLdHcHbjhiwJDqjD1u5EIWQ8CR0As8klsews lsxc2BWdk1zWCG/Fif9ZiMTxtQCr4tEHGbwXsI/u+fLxEwtS9aeekTTe+fkZ5v0bBqNkJay1pvj JDNHpmw2z54/9Pxd5F8ElH4LWqDAh/kAYW1v27AGnnd83bb9b5Cst/1zbcPmwGzfjwR70HOS6sT 8t5VeVsdkD6HiwxhFMe5sbkBYJLnuidEBtCjgBn95hF3m/M5F+f2t9eE/fJjfw7usyym1mItOfH ek1uSS1WJBCECT0S6yIp+ZfY7mHSHfWyti0J60cgXVlmCPdC1WBxAUwGrxeEQsGdxD7o+GdtJ0d tmt1EijDeFcQKuCxauuYerDKZhFlILogBXwYOMK1395j6/fh9RkEg9wY6PNH6WuMcDXvQ7PcJ0F pJ0k4uJ8ujaRRm1lQ7Yb01hpuyGm6rHSBRgKJvAksrLmfQ0yXzi5IwliLfZTh3NePTbx0lDZOeQ ntXzngzcS/0xEmSg4SW3Y+jnkKZkCQKJDYj8SmQSeD2b840qn8t++nPuqy4MsbIMQz09bKV06rB zDs/c+F7csbI4Og== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" EGL is not thread-safe and in fact associates invisible handles with the threadid of the calling context. As a result we need to make Deabyer::configure() and Debayer::process() in SoftISP execute on the same thread. When we call Debayer::configure() in the egl class this will setup and egl context for us which is associated with the calling thread context. Hence when Debayer::process(); runs it must run in the same thread as Debayer::configure() or the hidden Gegl context handles will not point to the same place. Move start thread into configure() as a first step towards this. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/software_isp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index 28e2a360e7e6d5071e7b97c2bffc60478d245a60..7bee8f0681dd5cedcd81950ed49f611b514e763d 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -159,8 +159,6 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor, metadataReady.emit(frame, metadata); }); ipa_->setSensorControls.connect(this, &SoftwareIsp::setSensorCtrls); - - debayer_->moveToThread(&ispWorkerThread_); } SoftwareIsp::~SoftwareIsp() @@ -262,6 +260,9 @@ int SoftwareIsp::configure(const StreamConfiguration &inputCfg, if (ret < 0) return ret; + debayer_->moveToThread(&ispWorkerThread_); + ispWorkerThread_.start(); + return debayer_->configure(inputCfg, outputCfgs, ccmEnabled_); } @@ -343,7 +344,6 @@ int SoftwareIsp::start() if (ret) return ret; - ispWorkerThread_.start(); return 0; } From patchwork Sun Aug 24 00:48:25 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: 24196 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 809FFBEFBE for ; Sun, 24 Aug 2025 00:49:06 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A98F66931F; Sun, 24 Aug 2025 02:49:05 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="SuaQoFiV"; dkim-atps=neutral Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id ECB0C69303 for ; Sun, 24 Aug 2025 02:48:48 +0200 (CEST) Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-45b4e5c3d0fso6424895e9.2 for ; Sat, 23 Aug 2025 17:48:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996528; x=1756601328; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=NNAYhv4oH51PNDeH7ZZtRdYMZk/R8PHqFK1u1jXAV/E=; b=SuaQoFiV6Bff9Yg0WVz2o0+E3k/ItEMhhYiH4s4j3zaxJBSt5uWHB90BNpYTroVFIP dgwuNEbim63tKPc2xFSBkC6UD45Ms1Ml8l4NT9rhYy1MYx+Cqk3KnaXX+6zcP9Y8iz4f AqZMPpSSh3XTFsIlaAV7ETvYZDiEoiScS/3ATz+yZTSBmflD2YD7savgXTh5KukBcuIH 2Fr/0jG83deuoNGMvRJ8Q2+YaNd1ZUHzkkAidGA7irBfgy6Fx8a1om5mZa3IOWeZPcAP Id3OJOChDeXOKjPXYO6OTyKRlc8CIphRtpouRE5y1RKRDWgD0i3gziQlAQf4QyAPs5PA KaSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996528; x=1756601328; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NNAYhv4oH51PNDeH7ZZtRdYMZk/R8PHqFK1u1jXAV/E=; b=n5DaATQKBv89117ww9FtSVX+txJyg/m5XA8u7JPXxITo7jQajY3G/n885h4M1gnn/n DSLERrQmwSSExVM6iDDa4vpcObXSqS2m29TE6WWcQfGz/dH+q9DoStDfgHmAqadzIomG Sc2EgIwZ16qF7EIEOpCpurxPVbPwHVMAhSKhTJxez9QV5BGREEGj8yagnehmsDDNf84u vIV5XiubEbuLmsNk7vaiqZNE6cZI2tsRG5ClUEKTrR50djGN14bVUBKPi2TFBYTpista kfnK+qBVsPPVOdOBiLX5W3UG50Mld5WXnYqxBRd42ytnosDbwLo0g7SqRckuQ5Tkpj+s 89xA== X-Gm-Message-State: AOJu0Yw+10VoulwCjUfO/kweCSg3C3RjeA6izvbEVg4+VxmQULpGk1ER 7JujaGxuT9xFaygDPt+cuqTnpypO2258+YUnXUZhY2mCRPXLdSYiUiXCrfEIBJti8DjpiHcHLHA NNDOFE1Y= X-Gm-Gg: ASbGncu+SbK7ynZIIKiO0jx5VKsvqnzyFD6mx/GGjlKMk6ype05kCGOki5xZHIfDss0 vk3PKjRhlKyiTXEru9wIpesNuecMveUnmbjYIPTXDKnhwL1b/zip/Yr3vzuYdAS8weIHl1ywHnI gVtmdqdiRrBRzYN+OyT+MfJCmJw+Gky36WJ9XUT4tsmtZ9niNBZ0ANXZ1gXhoFAe+SZd6/9b4Gw ++zVvC58tVg8MNt+I/EiSIU/fDCv8+/XHTT9u4uId4jFfIh7WoGqJSem3mHkUqiWhA8iQPl+3gO +mo4P3kjFDFyy7UCSadw5yAGDEJ9RRb/5zoWy0zDSGG7u3W6NlEfKXj93KBzagt3AGagd7+mjyt PmyrV0mS/pJwO2L6i/9a7rhq04rD7wdddAJJPGHerIXo+lTC8JwTulhN2+v5AmTbPWRfLD3hcLx e0sr6MHXJYwrkB2mYa9OPp X-Google-Smtp-Source: AGHT+IFjIuWbknYbasQ29IzTrPAqkZVaNHzqQeWABKv0YRK0TFFNkFNCVGj00wEAtL52zZdUV3pp3g== X-Received: by 2002:a05:600c:4f41:b0:456:fc1:c26d with SMTP id 5b1f17b1804b1-45b5179557fmr55642855e9.2.1755996528080; Sat, 23 Aug 2025 17:48:48 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:47 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:25 +0100 Subject: [PATCH v2 13/37] libcamera: software_isp: Move configure to worker thread MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-13-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1537; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=yPLs+JaO0rbCfUdrjCCe0Lkj75znaoEZ8v5pMMr2iR8=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFerCDGsqA5S7Kb0vS0+ft1dCgjgeklcoh9c hn6qZPJJy2JAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXgAKCRAicTuzoY3I Ou+kD/0QsUbkYKyUSByqrpuGdAG8+EdXT81CJeVR/DzhOrSSCgvX3jZnyEelnAOznM1CcahsUkB 6WcdaYQioudpi8DtwUHqzsVm15Y6pmAHff0UE5ZN8sjmKPvWJwnY5du48DN2veWIA11GjRir0RR 0IDLUjcLZG8IfF9vZ8CAGuyt7kFtveaY05LxUM8IEkMhwqq9BoFRqBdg3y58d8ibXn+uT99SHFq eZDab/pK4eQMyRNCQVokXiAcITGHemcDDT5nK7A6WQ1JEXCrCY9BEKrVE9eo5kNy01Nw39lfWKg BrDAF84h6KEcFjJy5SqaEjje9WMiId1fQa9udibgM6SeugaD4Cz2hNybSlLMXRiEtq0odzs2l5N DIoyP1/F7NJ32W7OJ7NzDHibWJxRzVz/FPyyTF34ZgzqRRlPr0z4FMYfDyHV12nsKWFnkVQKrF7 j4oQtGU9Kk/E4+ptrQG7S5JIY6oP5NT2W31DRgKgwXw6rAyklMhjLdlvQgiof9mFHQLPgpZNhM0 JKLGbc1NLm8aiNxPD7WPTXxP2NwLDYGqYuoOmTZB1W7P0IXs45oAEjkqo0eMboXjQo1WgX5bzPf A9aykbQebkiER1iwm5GW6azXjToDly+VUtUtS5rF7f+2/i35dFaFnrovna0hzgpkvkO6cMLOVfX yF4mHJ3VyBCmjEg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" EGL requires both configure() and process() to operate on the same thread. As preparation for that, move current CPU configure into the WorkerThread with a ConnectionTypeBlocking invocation of &DebayerCpu::configure. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/software_isp.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index 7bee8f0681dd5cedcd81950ed49f611b514e763d..e8fa8a17a11c63ebab1338a90df204f4a888c4d6 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -263,7 +263,15 @@ int SoftwareIsp::configure(const StreamConfiguration &inputCfg, debayer_->moveToThread(&ispWorkerThread_); ispWorkerThread_.start(); - return debayer_->configure(inputCfg, outputCfgs, ccmEnabled_); + ret = debayer_->invokeMethod(&Debayer::configure, + ConnectionTypeBlocking, inputCfg, + outputCfgs, ccmEnabled_); + if (ret) { + ispWorkerThread_.exit(); + ispWorkerThread_.wait(); + } + + return ret; } /** @@ -386,7 +394,7 @@ void SoftwareIsp::stop() void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output) { ipa_->computeParams(frame); - debayer_->invokeMethod(&DebayerCpu::process, + debayer_->invokeMethod(&Debayer::process, ConnectionTypeQueued, frame, input, output, debayerParams_); } From patchwork Sun Aug 24 00:48:26 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: 24197 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 6BA8BC32BB for ; Sun, 24 Aug 2025 00:49:08 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B9AC069324; Sun, 24 Aug 2025 02:49:07 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Q5UNhmOH"; dkim-atps=neutral Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E04C6930B for ; Sun, 24 Aug 2025 02:48:49 +0200 (CEST) Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-45b4a25ccceso18271655e9.3 for ; Sat, 23 Aug 2025 17:48:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996529; x=1756601329; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=PIgt1A1AABSYyFuz9xZ4XPi1Six13a6dttoHUJQ3QC8=; b=Q5UNhmOHWhSsl1huP4/DNR5mP/bEWxSoFrIRFNns3eDykjomd+/RV9Vh3UPsKebW+a QCGGKryuEwKRfzLn/IsZZLvm5qGzqu5Ae+gUw4ZgKZMIo0AqCLBr2iEKWFECB1eXwBz0 50tqltC+74ZlW0Hd8NpTVdX1Tf7wzlpOb3Iv/mGUBNFkASRZNbhvWZsB8j5KzIZbplIq nZlpvxt7Ewrv6XJyTFG4Of9qyTOv8kIuhRPMokEaTAJWoeS17+WgXonaZPhlnNDywvb3 12UzAvFuH7JcSJbhK6igq0Ke3KUcFeIuy6mvsmM4Y8Bfrqf5YkSxT0cAvx6Z+l1wgMa0 nleA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996529; x=1756601329; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PIgt1A1AABSYyFuz9xZ4XPi1Six13a6dttoHUJQ3QC8=; b=rWSXV/qid3HeTvSlKIfBXJEVIUQmZTJZ8pRA7D21jbnXgSKFdoHqo9zpRK+F0c+1p6 UOn7X6zPU0wL9JIT+EPH9CgKa158rAJtuW0A+Wdc0RaprZgsl6mzJ7ZZy1KNQ/dVp4ZJ b1xQ4h5nKSiM/Yd9jeTsmuJE3wmgUXAh8J53hHn/tR9yYLgRDuxry26N0e08VU8H1tva loFdSbVXMARobkUQKIqNCeuJ3C68qSYFJSl6z2E2JAUm/J1WiGoaOgfdRmQW7YSJVeqM 6T4JQokLCACmnvil8Srtgblg27ThfsH6TudBOGmcucbMU8iqxhzFVp2/Y73hChe+e2HN l85w== X-Gm-Message-State: AOJu0YwLjIMxcw59aijRVMmdEEgtXll4pTiRK1aUqf6XFqX+EyZNmcI8 s3erBdhaliwsx9WTuIcLxEankFvU1QsUBT8AzgIbvVLiJQcZauYyat60XFH4braq76159ujDnZh 0OI6+iqQ= X-Gm-Gg: ASbGncv4focQZpWo57wGCCziZ3bdsfa3XB2PJHdM+pva9h43QVgbUVG4gOSTU7cDJD1 puvzg026HH2Vu11nz/ZeDrbwMqHhaVY7PAsLHgvLs3qFsiSK8e+QYzD0odaDX9RhEB5ybupz2RX fwhVZKnYkFN6WUdD7QCbIudDOoh14b2b8I1D3uc1uk/GqjlMU7twPGqOKd2KxOIKEHptNjwvZ/w vpaCXS5FeAJsd60oLWXSScDLyzR3NqJLiyoutLEg95NRtq9xUm9Dcvy5CwJddjVkRJ4FnsOTYud jGeXnijdF50wwqTbM8clkR+UXMQlEKXhJujwxP1DL0u1w/FggSjDp8nGcGte7uykwQCS2FEZCS5 HNl70i2BKwuNPREf68LXsAD9/2fsF4n8hOh68Jj9OIgGP5oCFCGfpQAYhxiGt6Xwn2B/XqX7lop e0lmTdIlKJXRaNI3rgBrA5 X-Google-Smtp-Source: AGHT+IFN0byqOYpC6lLtP3wWfeq1v/HRlASpBV+poVCSnGclYwyklDobI9ET2p0m0rAAU/nHYZW4fQ== X-Received: by 2002:a05:600c:4451:b0:456:fdd:6030 with SMTP id 5b1f17b1804b1-45b517cfeacmr64364555e9.19.1755996528957; Sat, 23 Aug 2025 17:48:48 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:48 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:26 +0100 Subject: [PATCH v2 14/37] libcamera: software_isp: debayer: Make the debayer_ object of type class Debayer not DebayerCpu MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-14-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1174; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=XcREh6I7xKZHHR0/4RmlEYvYwno6jmtjDRnj8xMOXfQ=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFe+1vx4zEKwbk2BTz9y1df6bWEj6Yr1FmN0 caCs8Nv3BiJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXgAKCRAicTuzoY3I Oq5JEACnNXIjJH0t6AnMF8N4QevO82ERwhwPNOIzqjiT2xOyrIzrQjQz3Xh+HN6Ij0NaKeQZHB9 BkAXy3QEmJmEYzZoi+sKdClCIqIjO/YZdC7SP7bWCZJOugLHZNvXUMLYA41TSQ8cWH19WVmvHfF c5ZPYOoYiSB1liFX/sfpmShDTb09B/L+iN2GWMKi+2dzPTvxspSENtCfS792QZgMfCKYtzZewj/ LYXlNuE4F1hsgQ5UBMda84l0h5BK0PzAI8VNO6xHbrsutTPpuFyKEn3Spdjb9Va8yasnaqa3PgI ujs5eWpzbCh1l1Su8Dv2Vpx8ag9AaNdqXPl1Nh4tFKYylh8Y98LectRPFjl13nqVxfcplBnz02u lB0YKjVVUZgFsAtMcdk6x6LUvWFYVihxAUBmGFMrBmFPL89izknwDbPPlkZmThGDl0/oMsi1sjF AJYfasiinFMqmC6NL6lv6ms007OULcjLr2fqmTPwVQD4a9QL8h1MBHYBQ/VTzDzTM9AUv21EYKa +qrpAJcbgd5iEj8wh1DPhqtcNsuvj3kH/3Qe5H7xIF/mSjkpCvCudf4P2MJjkE1JdhvN6oyw89W 9E1u1Rtv+2Mo9tRN0cn4B4KXnkTiXqi5YgXEWdInahpZ3fff/XfTGviUDVVgmXI6gbeaCcySSuy +2ot2ihBRKehlTg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Make the type of object Debayer not DebayerCpu thus allowing us to assign the object to either DebayerCpu or DebayerEGL. Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/software_isp/software_isp.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h index 78624659245c5d9829d037b0386ccee4829bb13d..ad89c9b3ce9c5fe24c7ba3b69ae6560d7c7be314 100644 --- a/include/libcamera/internal/software_isp/software_isp.h +++ b/include/libcamera/internal/software_isp/software_isp.h @@ -37,7 +37,7 @@ namespace libcamera { -class DebayerCpu; +class Debayer; class FrameBuffer; class PixelFormat; class Stream; @@ -94,8 +94,7 @@ private: void statsReady(uint32_t frame, uint32_t bufferId); void inputReady(FrameBuffer *input); void outputReady(FrameBuffer *output); - - std::unique_ptr debayer_; + std::unique_ptr debayer_; Thread ispWorkerThread_; SharedMemObject sharedParams_; DebayerParams debayerParams_; From patchwork Sun Aug 24 00:48:27 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: 24199 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 9035FBEFBE for ; Sun, 24 Aug 2025 00:49:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0719D6931E; Sun, 24 Aug 2025 02:49:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Oofoy4rY"; dkim-atps=neutral Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4CA70692EE for ; Sun, 24 Aug 2025 02:48:50 +0200 (CEST) Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-45a20c51c40so26179885e9.3 for ; Sat, 23 Aug 2025 17:48:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996530; x=1756601330; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=SMWDZ4MJuPXVA2G1K9zH3SmhxZIzo1z4f+u27tyrFZE=; b=Oofoy4rYcu31zTrlCnTlGTZts7agRn74NSATEKZz3DB+VC81j2NW0bkZGb7No0N8v8 vr0vsSABvPtGRi04F9tKxTVhhw9W+jMFP1ZG4Y4x9DLcRV1lccKaeJUO+X8uXTBADBLn oD0caCuE/Sek8ZxMNL5L/LUMz42oUJanNsYJbZV5vnuKHKg8oI+MiI98/u1u+wdWu5Kz yR+qbutrm/lgP4xycTKC6bKQr0B3xVuX/0trr5Y5+n5lvhdQiW3FtlBlnMVyiuwgnet0 LEDAK+laow6ap6bIYSIr7AqU7WIcdzZW//e9ZWnQXJhGby9jIxsI/RcDdTJPk+F7X+G8 7dpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996530; x=1756601330; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SMWDZ4MJuPXVA2G1K9zH3SmhxZIzo1z4f+u27tyrFZE=; b=V3vutvQBmP7R8V1mZRR5dVcLQDMnxi2RzlVsukeyo6r33G4PeYDc6/TMGSFAyEgRSZ HfJnQ5zowlqTi8b6WaVZ5TAVBcYmL5VL+TqUF5wa5+xrXR1Q4H3KmtDLHE9LEBpmYTlJ rBdjjaKRM/Z1BEncYk7GewSesC7XHo9yjrdPIMd4PHVFcF9+gPxGqbuXoZG5sDjJXWHG avPtLJon5axoA4mtU9D1pLM8XxeWcgbDp96TXHXComap+4VaRvG8SiDEengIIg3pN5du hfbpPN0kf2zrQA9kvWxfrIpeYsrc04azg4+NVzCsN6cV3uxjqMUN01dh4/b1T6A2rpxv intw== X-Gm-Message-State: AOJu0Ywu343RategeYY7RiQFRDICdSJpyq87hY7kYVIZ70HSJpMaAVcX LUYoGqSrMrGn5EPvFZyRUKKNNVkF0oRcgJVclDIb6Tu2K5DKpDKbPVumm5xBNjs/HoBSPLEC4+o 2xvNvc0M= X-Gm-Gg: ASbGncvA59nluyjdLEiaIaT/qY5XQEVZ35muoKWcrt6k9DY1Hdfiw/EVbZOoLELd3t3 YCYmktC6COUTf/P3RbH65xWpBDR5MZrdkvqmT4GCzcnGPlOKx2mzBrJl0L2bnB+QQube8+SC2oK /qbQylh1FbFaytMdwYidDd2KMb8H2RmRXwp5EQ5kbMnJiZSHKhWdo0aJiLGIkSD2UcouHqn2Qa7 gFF5TgwCMG69NZDERYhcnvoO0/CMdc0yzypp3U00fLl9l6sjHdBvWe3+c5lAudw7Miq/U2rXJoP aqwFFrDrTW6sC9couQEn/EuIoJRCk8OvrARjYBKy8wP9IJB86Y+EoetEkRRiARTPq8xydac52BK c4zFqgwn56fN8zJIKs8f+hRYJW4YyJ+7Z0q4YyPTvvIYqqGdVAGmV3S0UiR7bYaXHIY9LWp3Jhh 6Fw6ZYC3nps1CeV4ajQvwImlkUPTPh/qg= X-Google-Smtp-Source: AGHT+IFdEvE15/RXGs2tqt7jleznRXW764t5PT2K6yMPXaYbJKhe1WVAtZUIrKd0HkTa1rKXbaIp6A== X-Received: by 2002:a05:600c:3b8e:b0:459:d780:3604 with SMTP id 5b1f17b1804b1-45b5723940bmr37219165e9.3.1755996529774; Sat, 23 Aug 2025 17:48:49 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:49 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:27 +0100 Subject: [PATCH v2 15/37] libcamera: software_isp: debayer: Extend DebayerParams struct to hold a copy of per-frame CCM values MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-15-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1110; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=F4c1tKZ+llqElLc+ASOjQlC6+Ixm9DDO+1Juxv+Cekk=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFf2mTkmUPz3755wLpRPr7zg2dr47wUv1OVF UeYo1IHFXeJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXwAKCRAicTuzoY3I OiIyD/9eJlkeTvdwi630hj2yJKTAJ4vPeDSS3VJV4vai61LgASy7mT51FJEPvMAvDi46HdD2byU WiakYL4IXQtywvY07C6ItEBuWkJgOXkF96DVnpCedUVQ2nH57F0/HVi7lDxWf4yTamG5SPjrfT2 N0DAFZ0JtwZqVuWsxskzimthZlNi5WGqs/eVZSlqj/Einy4CcbnXI0+y1dsc4IkLT8fkBY/WUEu ICd1matWrznkAXwzq85MTP5TJ6IbWH3s6KzimrljJK2hLHsbX3bMSIOI4/w4c9sZbxkx7Anbr8U y0ZnZsnTUirsm5j4nBOMPmyoH+b9laEcqhnzvBmK67Yz1ZilzutmJDD0Jr+9nggidPMbQfyF0I+ mFjgv9yFw2JWZpPFaL/hx9icm2kpuCLtUlR0N8Pk1SsQAEZA38COQYersliHQ8NLz7gaRYBwy6u h67HGTCJAxzTLvfm/UWrEufJNI41LnVBjf1hlL58z+HAe8Pz6dsSHXgtgZGXzhcwSAr4cVg8NJj 7e6TifgiD/zqAGceEp6Fvt4dtShOVYQ6kwmZ6mBeXMC6wsMWhMprwxIihva4As20PMkX0VwH2Jg LBEdEnHUc5Ea2KbM/XXCE3fGbj138CCb9g6gHkTOBK1yg1JV6Ci/9v2aKtTJycOGikSBlquXzu6 vGwHobgfbHuVf7g== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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 an element to the DebayerParams structure to capture the calculated CCM. This allows us to pass the CCM into the eGL Debayer shader later on. Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/software_isp/debayer_params.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/libcamera/internal/software_isp/debayer_params.h b/include/libcamera/internal/software_isp/debayer_params.h index 217cd5d92ab9e146a4e196d04e94f0cedcb58dec..56803195eb5faba287e95fbd92648373239185ff 100644 --- a/include/libcamera/internal/software_isp/debayer_params.h +++ b/include/libcamera/internal/software_isp/debayer_params.h @@ -13,6 +13,8 @@ #include #include +#include "libcamera/internal/matrix.h" + namespace libcamera { struct DebayerParams { @@ -49,6 +51,11 @@ struct DebayerParams { CcmLookupTable greenCcm; CcmLookupTable blueCcm; LookupTable gammaLut; + + /* + * Per frame CCM values as calcualted by the IPA + */ + Matrix ccm; }; } /* namespace libcamera */ From patchwork Sun Aug 24 00:48:28 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: 24198 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 BEFD5BEFBE for ; Sun, 24 Aug 2025 00:49:10 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 492956932A; Sun, 24 Aug 2025 02:49:10 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="RBY5tSbM"; dkim-atps=neutral Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 20206692F4 for ; Sun, 24 Aug 2025 02:48:51 +0200 (CEST) Received: by mail-wr1-x434.google.com with SMTP id ffacd0b85a97d-3c4e9efb88aso1759274f8f.2 for ; Sat, 23 Aug 2025 17:48:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996530; x=1756601330; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=buyPJiIJKZXiM/HnjpnpDLGVy4LpqFUeppgQojCV8f8=; b=RBY5tSbMgLFXET7H2PtfLHH3vowGzrydzLSMqbJdMdtP4gQmZiwiXzyqIpO3kJpWmx QaF10T1dLeh+VvX5IOVkrp9tcTazJpiseDNDde4Z8FBm5f2KwanrzZQ9dOYV8iP2KKbS PV4xLBVhbo0WabC0LTT8fgyughpViPyGLqAt71KiM8ED5i3BM0/qMXVs2R0YwnjHD88r IFTGi3MgrKLSBxxcoucWXuFE1N0CkhjbDB4w9skowtmN4peRT5kSThkr/FjHv6bML1On sN2vOL3GXlGj7guZQka8XKz+L/SsWSD3n7/JBbv4ZGn906mFnfwR7GdiF5ar5p5I3e6X jb6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996530; x=1756601330; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=buyPJiIJKZXiM/HnjpnpDLGVy4LpqFUeppgQojCV8f8=; b=lDiXZxEKqGCmJ+nWpykPSuQaO+uqrroywO0e1iBvrhFAn9a2hfJYPhUfh92iWnark5 KSjvlqTHxhszqFlVwDGcjsCZCI4hroZtgVEXwU6bCoavhF3TcyVdowQzUrsZ2YBoKTzF rAnGAub2mHAfRx2lbtbQ8pY2lxTIh21b3rHqjZQtKU9FtLkTcjRqdmsepYAWRU6c/f3a wVb2cgqPIRB9HnQbR7XydA/uiP6BCmdr0+p/t8H9hMq0/FUoS+NfW2highU8QjzTRIFs ua8/f7x6+qcPN9wHRjB1YO9gNx+CB2dKwnvmwpvX73niNPoDo2F3LSp2WZiaWq9Z/BLu Tybg== X-Gm-Message-State: AOJu0YxLCAFSrQ15SM91Qvy4DKgwFWx5ysF4XR7pskYdO4qM/C1nYqke Y03MJB9itKSvZxe0fLgCTFtAhvYstyn7J6TRIf3yE+7tMmM5lsUGIFb35wSaf0Qo+FU= X-Gm-Gg: ASbGncv9V/4TbTpoD7o7nsEMyjEK1OXO4GtE+px9csVCPh1vZ3arzN/uyAENhOCUB+b CIw2WwFRDtgPI3q+YHPA815NLc+V7IPe2NrQdVfTmKDHyyKXqDqX5h+ht7SJ/psCZZudWoLiLqM KSq4pAn61PnMkr136Oz7hCbZWZdmlVfdenvbClYl9W4fESMv6R+zLtORfbK5aJhsLk1F0X2IjH9 06AnHa6jplHL5aERuSYOW0M7slbvs2j8xZHgudYJxHfhK8bsG41sdSwyoMZ5eJdc8IJFrECgHnO KymIFogjatPlcx7o9KVp8O9ZP6Oh5MeYn5SZd5QtaLvuduJSvFtg6EsdoeI1nGQsOvBYE8LibHO zwRSx/aLJYa0CL2YlvV+sk6d+d8VT6Xgs2P3diSXaKym+cnwkJhWj4C/Oamqk3GHCv0xe1nMQDS upYvkCfPJQmg1f3AySq8FM X-Google-Smtp-Source: AGHT+IFdn/1fN2eF5MPZ7muvVg4a/iHUokPPieTHyJy4LpgdSzufLYQq18NIf1ZbPniZxEwrH5kKjA== X-Received: by 2002:a05:600c:45d0:b0:459:e025:8c5a with SMTP id 5b1f17b1804b1-45b517d4b94mr71758495e9.33.1755996530576; Sat, 23 Aug 2025 17:48:50 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:50 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:28 +0100 Subject: [PATCH v2 16/37] libcamera: software_isp: debayer: Introduce a stop() callback to the debayer object MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-16-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1785; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=Zoj/84VUy61EbRwVaSQZKyt7j6W8BL9rD4a7kpxc2TY=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFf6iqPFJTnJR58QTPrrv5gQpia+YZFe9hDn PeBdIUyUReJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXwAKCRAicTuzoY3I OrnmEACiTMVlr6jfHHyujv8bUETtxx6jhjTzYzauXmnqtx+nZ02FQzT+uejFLdTHtBFQlSv0Fc+ LHcOij86C1LeDP5KUYjTbZyNaEiXcPHh8vSSu6Mc1jCZ3Q325bTk5gUz6eJZUJCGmGnPfq241kt IHsedtUvCMknsQWgQbwwiM2eXQITte+8WV02Bww/fe++yNu1NDibG6yuMaUn6b3UAFNsgJvrWL9 wMVU0MG616ygbMGud25IyNkaHGGrJjhjLGWVQ0eNGhXIh2L/TTfEHMk2mfmphX5+fG5yhhg9fxA DR0NuM4hl7eswbCOPrs5W4mRqgfXxnoymIByl5VV8l/9ByS6Pks4dlwpEGxtc+fNQXI7uZuis7G qHn19+T7kh9oOo8jls7DsGrdeWudrgTvWtfocj8Kc/i/lqpawieoiyVIOrgzVYtL/pIvJ/a+ec6 +XCwDpw2HyqpmV02WLfTt+Dkj30hFC+WmXd24orYImb6ll8uoXa5+0I+RsQgsVIgL6LzWjga7uF jSsEFo6lr6N7oJ2wRtxGxBfmUNWwKtfgKNYE7ZTAXCx3oVz4mVpaALuMutIuhJjk6llc3mY/itn 3jl4OSPEYZlb4EKN6iZE9t5mSGSvaGV5T6WKrEyZOb2TihaZASbMW1qy/M4/dMhfx2Y/IibI9OB 1ro7yTSbFCUY8eg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" The eGL class wants to be able to teardown its sync_ data member properly but, doing so in the destructor means we can't make the eGL context current and thus can't tear down the sync primitive properly. Introduce a stop() method to the debayer class which triggers from the softisp's stop method, allowing a controlled and appropriate tear-down of debayer-egl and egl class related data well before the destructors get invoked. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer.h | 1 + src/libcamera/software_isp/software_isp.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index 214bcdd3c535bae7851d6e0221ba68c19785507d..352ffb89ad9d5a32ed1bbb14253af5e3f21d508c 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -47,6 +47,7 @@ public: strideAndFrameSize(const PixelFormat &outputFormat, const Size &size) = 0; virtual void process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params) = 0; + void stop() {} virtual SizeRange sizes(PixelFormat inputFormat, const Size &inputSize) = 0; diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index e8fa8a17a11c63ebab1338a90df204f4a888c4d6..e6bf76f214280194bc20aaaed4b5bc96598436fb 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -363,6 +363,9 @@ int SoftwareIsp::start() */ void SoftwareIsp::stop() { + debayer_->invokeMethod(&Debayer::stop, + ConnectionTypeQueued); + ispWorkerThread_.exit(); ispWorkerThread_.wait(); From patchwork Sun Aug 24 00:48: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: 24200 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 185A8C32BB for ; Sun, 24 Aug 2025 00:49:16 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 591EE692F1; Sun, 24 Aug 2025 02:49:15 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="IRjoEOJ9"; dkim-atps=neutral Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 10F5669302 for ; Sun, 24 Aug 2025 02:48:52 +0200 (CEST) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-45a1b004954so25066935e9.0 for ; Sat, 23 Aug 2025 17:48:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996531; x=1756601331; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=MmkQoR6mtBq/b3H1LzCR8aqQ7HB9SyZFu3pWmYC+RKQ=; b=IRjoEOJ903svig07XQt4DTK1oJ+0lZH04xap+8Hdykk/oJGhRup2OOBSFx4jwk5Da7 06YNaQhj/MDsW/SUgaG5xlerLhrdVcQ31dzDX+z3+Dd4/+BNKgcQCMpobvJbkxx1501y 5yOy3GBrWlSiAvZCcXOksKDnyY9eY3l8c3kc4KOxUFLSKsbPi529I3ZgkeYVc4Q6uv70 Nwr1pHwuh58923tOHeYK1VCvoBwmqwqs25Q6nQoIGyI//FBJsWQe9/gPDtFagEPYIt02 fuM6JDy8Ytm2vjiDuXNvCaorC1lNiCA+KNveilFqMTxOXaywyKFi9Y7q8k9fc/9EZUkU Xo1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996531; x=1756601331; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MmkQoR6mtBq/b3H1LzCR8aqQ7HB9SyZFu3pWmYC+RKQ=; b=aIuT+GinB2FXVd4kbpSjewIpQ8JvZjuq03IyCyr1qorSfTbIBJaRvgVZ//YFb9voMt e0fQcdlfeFQm+cB0gqxFKyEJE+QnJegYyFLPD+j2/rJnKuK6pn3r/hg+Go/n0lDf0OAx zLRGFa1imhPp30XMHvUA+1XyAcrKLn7JoDnQypozVNyZyiKOrucbXl3+tqjpYrpxRDZ1 K+i81a8tnNKTJJ9c3YPURmjr3JixUfL5CmKsp7hzrI/3htNkB/tDWJbXU5FPsjn5OUI0 ti4pPwLRYAwXUYRvKDjnG2qipJ4LeJC007ANBdlCBXdjciKOpLcxDH+1FVfqYhGWCJ27 L1bw== X-Gm-Message-State: AOJu0YyzLkZGQYm8D8ozIf6XWDgfz6Mn3nwMBMLJ/JpaIEvbXlwFIobT shamCVuMurFpfc0Is87gM2fvFVdkv+TZ99ttwFpgj8LXUA3td1wMA/8vK6regTW9GPgxy3t7+qH 9pjSiFys= X-Gm-Gg: ASbGncuTU3vl8vIhs16coBhhTEaTefBVrvwh15acQuhy6mEULt2/EAmuB0hD8AM2ux0 szjmTqwZDailjWql3QV/+lBgbiTZOqsUPJD+Vn+aTBVW8QbXVQGB3HbZO639jTAPpdyXcHOxWOX WjcQZdZ0PdwS8TAFjaen+gjJUUkJWk7unKa7VkC5zEnSLTr96TQSNgxuYGKmFH6+Vq3kiCMSk1q puCIcJr+kFMM8oHme0rCYgyZ0fygxBoYeQKAE86OH0S2WPmMktSiergV+z6/55T1n2dHvmSuI/7 d+Nafz+Ifqvo4ZIzTX1KHJLl4m0ZGu4T2o+3i77l7i02z3V59sP+phIPpU06wS6+8k019qLjcOR inXdgdKM9xMxeUKveywgyxgvjbeoyRAwgXYoTmuyA8nP2gJSVALOeWFoTwTh+XLbXZcwQyyCpeM PExiX2GE8iM/YLGtmw2vZ3 X-Google-Smtp-Source: AGHT+IH2Lnyo+Rz58HH6dk4W2dwTeZi6DOtyR09Thm1In9b85ovkDVCpAyi/a5CPMddpu8uZ9Y7VCQ== X-Received: by 2002:a05:600c:35c9:b0:459:d821:a45b with SMTP id 5b1f17b1804b1-45b5179e76dmr66452435e9.9.1755996531464; Sat, 23 Aug 2025 17:48:51 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:50 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:29 +0100 Subject: [PATCH v2 17/37] libcamera: shaders: Move GL shader programs to src/libcamera/assets/shader MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-17-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=13496; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=XV7TNaeXvC7WnbTyXXCMsT/mfBbUd05z0sUmazho2Lo=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFfYVqgbrYp0Tnm7LGxw/1XcWpX7d7zwM0NJ pznp5ROwceJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXwAKCRAicTuzoY3I OvuDD/0a2XwBY0AnSZyqnkAbwO53VdcKAGZmu8ZYdd0EllBdkV9iVBFOZCQgqzgBj2YGRktOPK3 1qnsA4Sd4+fHOCk4WFh0p3Xc0IwmH5UsbJsKgiM14IW+t3fN4A9+RiaDczlqyN0v4UWELl8eQ+a C7GPS9o2PHUKg1UmeAdmlCG8P/zoZyBkWbMKWXpQa9drtNHLvNvWysH05trnp5Lfd/TIpc1WsAk ypMBQ5ZAD00aH4RwWveKzHg44QMw5yIu+SJD+VfsfCTJvY4ApU2q5qfEGVyWu2rm/wJ3FoVsG5r yeHG0mD0g9AUYs6ZgGc1MrB0rTIcEKO1K0jngPbbRz40sZmy9v30hNDvQyqVo70Du95FbDV3YpV cfa19vIv2bpjr3a5IsMVBdSMyPsTPT9pEvzCyuqMnrOM/bLIO2e+8o+AiOk/hYkNafVhEfJmdu/ Ju4Z5How9l1ie/51F/9SzukZNdoyNBce7i3GGb4STeTkZGDSNLk7p01KZrF07zKbi3ieJwVRZ20 H0N4Q/m5AKge0AMJYlBRSfYMlySwOfOG5cPgYW9jZUzED0Sw2vKBAudwnx4Y+j+IwkDP8hCFG3o xoXsfxiqWjdhVLLDGsGz37A5WISIljsq8ijkWsHjqefnXEvHW9Pfznn920cVYCZvWKQ9roO4UvW Es6DCWto0mkTnyQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Moving the vertext and fragment shaders to src/libcamera/assets/shader to allow for reuse of these inside of the SoftISP. Signed-off-by: Bryan O'Donoghue --- .../libcamera/internal/shaders}/RGB.frag | 0 .../libcamera/internal/shaders}/YUV_2_planes.frag | 0 .../libcamera/internal/shaders}/YUV_3_planes.frag | 0 .../libcamera/internal/shaders}/YUV_packed.frag | 0 .../internal/shaders}/bayer_1x_packed.frag | 0 .../libcamera/internal/shaders}/bayer_8.frag | 0 .../libcamera/internal/shaders}/bayer_8.vert | 0 .../libcamera/internal/shaders}/identity.vert | 0 src/apps/qcam/assets/shader/shaders.qrc | 16 ++--- src/apps/qcam/viewfinder_gl.cpp | 70 +++++++++++----------- 10 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/apps/qcam/assets/shader/RGB.frag b/include/libcamera/internal/shaders/RGB.frag similarity index 100% rename from src/apps/qcam/assets/shader/RGB.frag rename to include/libcamera/internal/shaders/RGB.frag diff --git a/src/apps/qcam/assets/shader/YUV_2_planes.frag b/include/libcamera/internal/shaders/YUV_2_planes.frag similarity index 100% rename from src/apps/qcam/assets/shader/YUV_2_planes.frag rename to include/libcamera/internal/shaders/YUV_2_planes.frag diff --git a/src/apps/qcam/assets/shader/YUV_3_planes.frag b/include/libcamera/internal/shaders/YUV_3_planes.frag similarity index 100% rename from src/apps/qcam/assets/shader/YUV_3_planes.frag rename to include/libcamera/internal/shaders/YUV_3_planes.frag diff --git a/src/apps/qcam/assets/shader/YUV_packed.frag b/include/libcamera/internal/shaders/YUV_packed.frag similarity index 100% rename from src/apps/qcam/assets/shader/YUV_packed.frag rename to include/libcamera/internal/shaders/YUV_packed.frag diff --git a/src/apps/qcam/assets/shader/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag similarity index 100% rename from src/apps/qcam/assets/shader/bayer_1x_packed.frag rename to include/libcamera/internal/shaders/bayer_1x_packed.frag diff --git a/src/apps/qcam/assets/shader/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag similarity index 100% rename from src/apps/qcam/assets/shader/bayer_8.frag rename to include/libcamera/internal/shaders/bayer_8.frag diff --git a/src/apps/qcam/assets/shader/bayer_8.vert b/include/libcamera/internal/shaders/bayer_8.vert similarity index 100% rename from src/apps/qcam/assets/shader/bayer_8.vert rename to include/libcamera/internal/shaders/bayer_8.vert diff --git a/src/apps/qcam/assets/shader/identity.vert b/include/libcamera/internal/shaders/identity.vert similarity index 100% rename from src/apps/qcam/assets/shader/identity.vert rename to include/libcamera/internal/shaders/identity.vert diff --git a/src/apps/qcam/assets/shader/shaders.qrc b/src/apps/qcam/assets/shader/shaders.qrc index 96c709f9271c65df8acfa896933fcb3bba957a30..04f9d7061b16d0bcd6c1fe1aceeaac97bf0fc295 100644 --- a/src/apps/qcam/assets/shader/shaders.qrc +++ b/src/apps/qcam/assets/shader/shaders.qrc @@ -1,13 +1,13 @@ - RGB.frag - YUV_2_planes.frag - YUV_3_planes.frag - YUV_packed.frag - bayer_1x_packed.frag - bayer_8.frag - bayer_8.vert - identity.vert + ../../../../../include/libcamera/internal/shaders/RGB.frag + ../../../../../include/libcamera/internal/shaders/YUV_2_planes.frag + ../../../../../include/libcamera/internal/shaders/YUV_3_planes.frag + ../../../../../include/libcamera/internal/shaders/YUV_packed.frag + ../../../../../include/libcamera/internal/shaders/bayer_1x_packed.frag + ../../../../../include/libcamera/internal/shaders/bayer_8.frag + ../../../../../include/libcamera/internal/shaders/bayer_8.vert + ../../../../../include/libcamera/internal/shaders/identity.vert diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp index f31956ff0504dafbcb33c322abddfe80f81dd6f2..70f600650b7b925f10d2f699e6498a6cbd0a238a 100644 --- a/src/apps/qcam/viewfinder_gl.cpp +++ b/src/apps/qcam/viewfinder_gl.cpp @@ -141,7 +141,7 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) textureMinMagFilters_ = GL_LINEAR; /* Use identity.vert as the default vertex shader. */ - vertexShaderFile_ = ":identity.vert"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/identity.vert"; fragmentShaderDefines_.clear(); @@ -150,170 +150,170 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) horzSubSample_ = 2; vertSubSample_ = 2; fragmentShaderDefines_.append("#define YUV_PATTERN_UV"); - fragmentShaderFile_ = ":YUV_2_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag"; break; case libcamera::formats::NV21: horzSubSample_ = 2; vertSubSample_ = 2; fragmentShaderDefines_.append("#define YUV_PATTERN_VU"); - fragmentShaderFile_ = ":YUV_2_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag"; break; case libcamera::formats::NV16: horzSubSample_ = 2; vertSubSample_ = 1; fragmentShaderDefines_.append("#define YUV_PATTERN_UV"); - fragmentShaderFile_ = ":YUV_2_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag"; break; case libcamera::formats::NV61: horzSubSample_ = 2; vertSubSample_ = 1; fragmentShaderDefines_.append("#define YUV_PATTERN_VU"); - fragmentShaderFile_ = ":YUV_2_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag"; break; case libcamera::formats::NV24: horzSubSample_ = 1; vertSubSample_ = 1; fragmentShaderDefines_.append("#define YUV_PATTERN_UV"); - fragmentShaderFile_ = ":YUV_2_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag"; break; case libcamera::formats::NV42: horzSubSample_ = 1; vertSubSample_ = 1; fragmentShaderDefines_.append("#define YUV_PATTERN_VU"); - fragmentShaderFile_ = ":YUV_2_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag"; break; case libcamera::formats::YUV420: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderFile_ = ":YUV_3_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_3_planes.frag"; break; case libcamera::formats::YVU420: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderFile_ = ":YUV_3_planes.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_3_planes.frag"; break; case libcamera::formats::UYVY: fragmentShaderDefines_.append("#define YUV_PATTERN_UYVY"); - fragmentShaderFile_ = ":YUV_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag"; break; case libcamera::formats::VYUY: fragmentShaderDefines_.append("#define YUV_PATTERN_VYUY"); - fragmentShaderFile_ = ":YUV_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag"; break; case libcamera::formats::YUYV: fragmentShaderDefines_.append("#define YUV_PATTERN_YUYV"); - fragmentShaderFile_ = ":YUV_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag"; break; case libcamera::formats::YVYU: fragmentShaderDefines_.append("#define YUV_PATTERN_YVYU"); - fragmentShaderFile_ = ":YUV_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag"; break; case libcamera::formats::ABGR8888: fragmentShaderDefines_.append("#define RGB_PATTERN rgb"); - fragmentShaderFile_ = ":RGB.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag"; break; case libcamera::formats::ARGB8888: fragmentShaderDefines_.append("#define RGB_PATTERN bgr"); - fragmentShaderFile_ = ":RGB.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag"; break; case libcamera::formats::BGRA8888: fragmentShaderDefines_.append("#define RGB_PATTERN gba"); - fragmentShaderFile_ = ":RGB.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag"; break; case libcamera::formats::RGBA8888: fragmentShaderDefines_.append("#define RGB_PATTERN abg"); - fragmentShaderFile_ = ":RGB.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag"; break; case libcamera::formats::BGR888: fragmentShaderDefines_.append("#define RGB_PATTERN rgb"); - fragmentShaderFile_ = ":RGB.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag"; break; case libcamera::formats::RGB888: fragmentShaderDefines_.append("#define RGB_PATTERN bgr"); - fragmentShaderFile_ = ":RGB.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag"; break; case libcamera::formats::SBGGR8: firstRed_.setX(1.0); firstRed_.setY(1.0); - vertexShaderFile_ = ":bayer_8.vert"; - fragmentShaderFile_ = ":bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGBRG8: firstRed_.setX(0.0); firstRed_.setY(1.0); - vertexShaderFile_ = ":bayer_8.vert"; - fragmentShaderFile_ = ":bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGRBG8: firstRed_.setX(1.0); firstRed_.setY(0.0); - vertexShaderFile_ = ":bayer_8.vert"; - fragmentShaderFile_ = ":bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SRGGB8: firstRed_.setX(0.0); firstRed_.setY(0.0); - vertexShaderFile_ = ":bayer_8.vert"; - fragmentShaderFile_ = ":bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SBGGR10_CSI2P: firstRed_.setX(1.0); firstRed_.setY(1.0); fragmentShaderDefines_.append("#define RAW10P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGBRG10_CSI2P: firstRed_.setX(0.0); firstRed_.setY(1.0); fragmentShaderDefines_.append("#define RAW10P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGRBG10_CSI2P: firstRed_.setX(1.0); firstRed_.setY(0.0); fragmentShaderDefines_.append("#define RAW10P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SRGGB10_CSI2P: firstRed_.setX(0.0); firstRed_.setY(0.0); fragmentShaderDefines_.append("#define RAW10P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SBGGR12_CSI2P: firstRed_.setX(1.0); firstRed_.setY(1.0); fragmentShaderDefines_.append("#define RAW12P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGBRG12_CSI2P: firstRed_.setX(0.0); firstRed_.setY(1.0); fragmentShaderDefines_.append("#define RAW12P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGRBG12_CSI2P: firstRed_.setX(1.0); firstRed_.setY(0.0); fragmentShaderDefines_.append("#define RAW12P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SRGGB12_CSI2P: firstRed_.setX(0.0); firstRed_.setY(0.0); fragmentShaderDefines_.append("#define RAW12P"); - fragmentShaderFile_ = ":bayer_1x_packed.frag"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag"; textureMinMagFilters_ = GL_NEAREST; break; default: From patchwork Sun Aug 24 00:48:30 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: 24201 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 2E1BEBEFBE for ; Sun, 24 Aug 2025 00:49:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 42EF469302; Sun, 24 Aug 2025 02:49:17 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ToLULaU6"; 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 2D9F4692E2 for ; Sun, 24 Aug 2025 02:48:53 +0200 (CEST) Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-45a1b05a59fso25385795e9.1 for ; Sat, 23 Aug 2025 17:48:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996532; x=1756601332; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=gVqHYFgec9edgDM267XnpBCYt+dduugqv8PVQljwvPI=; b=ToLULaU6zR/fsKUllWDsNv3+zuNHXWK96QBfP3LF6hAppiZdBIq60hRFK3HqK2uKaw aSY2iIWZhvaq2HRlvCKDj4pRGZCmL7uTjNU6wBB2lHwVGtXGm6qUWgmSGfXH3Wj6YMZ7 96iXa+Ydq4eCqTbRfWK3bw0D5iZs7FSiJ258cJa1EotMplPX4O+9N8JVHEkC8LtdM/cJ /WU3q3FbH4wsN0kuBNKphnvliOnJS9Yo2TvupMNJFohWx8z9S/C9XIQLS9cE/ngW2qxw mHFYFFP+ZJa/8emoTs2OauNisLALAJ7PEC+yg5WRVlfWNhagTmd1GhvqDUaxUBJoxKOI MiFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996532; x=1756601332; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gVqHYFgec9edgDM267XnpBCYt+dduugqv8PVQljwvPI=; b=kNJywHEcIviuhckfvhpWeOu7JMpYk8PnkH46rltoYzK7SzplkbDId5vNHsiFI1v94N Cp30NTJUJ4UG+bQQISmW12WXgwADuh2bpS9K8G3nbK9zSFQjmHjC3fxkGqDEHscLQ+9G WS2IpiTl66+Zhfi2kxr2T+SCsNfo9JX+fmXDTSrNAsRwave2PK0g7poPA80yGJ09K2kz NtBAIvhef+QpjmMDBNNHm8zfpy10bvaSz5dGy2jZd2134aKXN2QKLp9qsnHi+eG8/Z6p r8R+f+1vJMfKbNiRohS8WEVOTz8FGDFiOinHlspwIN1a06+3CbH7gqu6bWGXcTAOy36c u8qQ== X-Gm-Message-State: AOJu0Yw2M8YZZhZF1h1L62fTOgXubJy84EeGIVBZxRFlnK4H5+AfXErg K77gMuiT/af9i2I9oRWhacPNweaOlwyXjE69+ncqqktn5OocBZvTX3JM0tpdWaWe2U/gUohdplw 23BmQbY8= X-Gm-Gg: ASbGncuCxwjAHV8Rgly/QAJJmtua7KYD3mLxAfp2OibMXeoKatSYKTGA8GCVOrh3mlm EhHkNFzvaTrnG5GkPMK3JV+WermYPFx8L6QI5Krj5vtPSwCiNxVwyYNaBoX4nRd8u2LASv5KssB z/+3/eEH8HG8GVWn8mWs02vG94bt5mGbSDrl7RPpU4trjdV2oA6ySktqd9nGve4Vf44/55yQl25 GHggnrwCb/RQw41czKAk5fmOwsU7sNeaUq9lixYcrS6tY2lg7JJ5Tf0BEZs/GRVkGv3zbjyNbnj W7D8lLitgny5vza2K+b1I8v69Xwpe8sEhuMl1YXOzqEaRLvxky3Sm3YJPFqnS/5czhVSF7Qc/ay QU7VymyOfUjwvJ8OxK93G9sxks1TxJEsM5iPBLOZ8tkrmOJi+7W2lcGduWjQUHC08hlMFFPoFjB /ze1U9vY/Zwe/QsLfNqzFo X-Google-Smtp-Source: AGHT+IECNEZrUrmV/RdAR33oQJjhNzii9AF22AahVsIrI5jEPQ+rH/vxGhS0O1SWLM3KCBTUtkT1/w== X-Received: by 2002:a05:600c:1d07:b0:459:e025:8c40 with SMTP id 5b1f17b1804b1-45b5179e897mr59110945e9.10.1755996532545; Sat, 23 Aug 2025 17:48:52 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:51 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:30 +0100 Subject: [PATCH v2 18/37] utils: gen-shader-headers: Add a utility to generate headers from shaders MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-18-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2872; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=CJkgtdapTZZkXVFRMh84rmfBMzP61x7DaVl1inLelEQ=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFfM1TFO5wMctE9ksyZi787qGq8r9gjAzKst 6E83i2+DnOJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXwAKCRAicTuzoY3I OqubD/9zhYvioAS8TFMLmSvMNfqVlL36MxHsc5dZFKxoE/8d/N4gbE5dTx/9dn8FCfLnrGI+1Tp HNcDz83EGxATBBv2F1VsTtGZ7S49tCh9fE5aqYBMgJ0WKd0oF0VW6QomdranSZ2pFuEuvrXyjAR Be4SFFu/wQRkaj+U0aCagsSe/exEZO55aPRxhnL0CEGJ6Dqkxi3v/rxi0bZOqcE9Ehtes86XrmD MWdZu0oCRDSxZI8l3Elo5BoVQ0IYF7McNPbThLlQM1Y7fI2BVgcyXhW4WBPvequvxoqEV2ow8wE FKzoHZBwHVmCrmYuOs9FsYgDM6temlIEXYRJ9JiqnTqPX6Jc4QdYhLvZEfI6IefrHQ1fYSufpez NbUnvaRUhNnHDYikOt2VF1ypLv3bfl7WJR4v7hiD/RmWg/DPzp90bxHHK+53PLZkpvqFsBUT0Fy w/ttqjJ/tMDYqhoIAU7ApkrVp1Tj9NOOcjMDDJEokpqtnR07/xGZUxpiqnJlz/wDcCAgq4pzCnc GFpNbK76ekmc5FXUxGVL0YPFlukDhGjSYQkGkrRcnZ1otowsJuTFjWkp/ARU+M9+0DWvE1S44qk XSaVlo7dvQBgOBllnOwGqgP6NYbTtxpgqke1uL/29qZdj7zvFwLOnqJmQpXu6dDNT+VgMCnkIN9 VNKkcneFIvZt9gg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Two simple script to generate a header that contains GLSL shaders translated to C arrays. Signed-off-by: Bryan O'Donoghue --- utils/gen-shader-header.py | 38 ++++++++++++++++++++++++++++++++++++++ utils/gen-shader-headers.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/utils/gen-shader-header.py b/utils/gen-shader-header.py new file mode 100755 index 0000000000000000000000000000000000000000..6668e648f20db39e03a33a8309fb068a5124961b --- /dev/null +++ b/utils/gen-shader-header.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2025, Bryan O'Donoghue. +# +# Author: Bryan O'Donoghue +# +# A python script which takes a list of shader files and converts into a C +# header. +# +import sys + +try: + with open(sys.argv[2]) as file: + data = file.read() + data_len = len(data) + + name = sys.argv[1].replace(".", "_") + name_len = name + "_len" + + j = 0 + print("unsigned char", name, "[] = {") + for ch in data: + print(f"0x{ord(ch):02x}, ", end="") + j = j + 1 + if j == 16: + print() + j = 0 + if j != 0: + print() + print("};") + + print() + print(f"const unsigned int {name_len}={data_len};") + +except FileNotFoundError: + print(f"File {sys.argv[2]} not found", file=sys.stderr) +except IOError: + print(f"Unable to read {sys.argv[2]}", file=sys.stderr) diff --git a/utils/gen-shader-headers.sh b/utils/gen-shader-headers.sh new file mode 100755 index 0000000000000000000000000000000000000000..ca4f19f07616c97f1d69fad7450c6e63f0e59407 --- /dev/null +++ b/utils/gen-shader-headers.sh @@ -0,0 +1,44 @@ +#!/bin/sh +set -x + +if [ $# -lt 4 ]; then + echo "Invalid arg count must be >= 5" + exit 1 +fi +src_dir="$1"; shift +build_dir="$1"; shift +build_path=$build_dir/"$1"; shift + +cat < "$build_path" +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* This file is auto-generated, do not edit! */ +/* + * Copyright (C) 2025, Linaro Ltd. + * + */ + +#pragma once + +EOF + +cat <> "$build_path" +/* + * List the names of the shaders at the top of + * header for readability's sake + * +EOF + +for file in "$@"; do + echo "file is $file" + name=$(basename "$build_dir/$file" | tr '.' '_') + echo " * unsigned char $name;" >> "$build_path" +done + +echo "*/" >> "$build_path" + +echo "/* Hex encoded shader data */" >> "$build_path" +for file in "$@"; do + name=$(basename "$build_dir/$file") + "$src_dir/utils/gen-shader-header.py" "$name" "$build_dir/$file" >> "$build_path" + echo >> "$build_path" +done From patchwork Sun Aug 24 00:48:31 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: 24202 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 ECC51C32BB for ; Sun, 24 Aug 2025 00:49:19 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1D6FB6930C; Sun, 24 Aug 2025 02:49:19 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="jkSXwsym"; dkim-atps=neutral Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D72086930D for ; Sun, 24 Aug 2025 02:48:53 +0200 (CEST) Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-3c79f0a606fso432881f8f.0 for ; Sat, 23 Aug 2025 17:48:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996533; x=1756601333; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=WVq5cziKKrzTB/f1IlQrFIPwt3j05ogaLlswzu8kTYA=; b=jkSXwsymgmRj1GIh8OwMtOp3bBWZnGaYK7HdPtpjWexY5st/78WMZpzB706m9afWe7 gRll8zTAF7WXJXrNX7vPQM2Utsz85seliEUAlkOkNGfzOiXqonsYvSBw2bdKJImJsC4m o7HPiiCK/AP5sBz2+Zdfu2pn3GbFAKfxbjSqeSOImcqzoKKoZ5t7RUYvZUqXjuDsQJvf mx5zu9zXXjzBD8+4/6h+Wd/tqVmXT8zyvf0DvzMrrITJ74Sz8IF+MRC+dxhm0Vko7RMz kN8ycmCGj6WFPijBwKtN9pXh+nAqbjAidSQ7OyOdrp+RWWijp4rjC9IazOq0lvu/kzyL RVUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996533; x=1756601333; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WVq5cziKKrzTB/f1IlQrFIPwt3j05ogaLlswzu8kTYA=; b=CiDnXa+jrdp1RoiHAlCsLdPomTNmdbZpvCPM8ZAHfQ/yjhzDiQzIUOwYX6/nHZ80GV gMzRIqDKFpMbRRgFTT8iCP2eQS7T2L74HvuS4QG04r2q/wN2fkNwv4kh7ZdillADCYJQ y5WRXePQMDLI3RmSle6GMR+OeoSdsYyU7t3V8jsrV6T4oQK+XWujqCyNbgPZQz1WBsGw M1H98W5EDmFGX9BGH8G6xZ+iGW6NFScYXuUdf3Nfljdtjja2/CfAQBLoevjSJq6MDb7z dMXaKcDu9zfxkyJa6Jq322r+iE9/C32aD2aM8Kuk0OXpJR21sp9uQlhbj55yVITn0tMl djuQ== X-Gm-Message-State: AOJu0Yy8Qez53AVmojdK/GqWj2e1TJcXhb8ZxNaSLaA6h7pvOGcj1sx4 uguyzaLq758nL/ZOwOVWdTLaGTcRJw97jgNW8qnqreqR83iZQ5BztJkKl39WDDA+P+c= X-Gm-Gg: ASbGncvidUjGCIJuB9fHluZfP9MTWroC9aH2tVh0tD3BlTRgXFAyvYGEFuTDQUX/9ky z8k0wBa/Sj/LPCqW1O4VV2PLeYGk1oTd7n6Pb57NyAvkpwppR29wia8uWpzWjaaYDFP16gVph+y F+inoFc6LZsFdpev6pEmyN87BriNTKxn1tp5pLHXIT6SfdUWTiqAMadwf8uosJtW2sGHfzDtz51 FlgWBHDWXgMR9CPEbR+8ZEUfiaGUdZVN0/xo/sG68ZflZIc/CDXAgWH8nmwnFAcshiNlfWzkz8j TQvFI28UGidwZ7KY3z3BA1Kts1b7HkRFZePNSx90fwwnV6Zfp+3P8A9JhjDn1ycEnqqTVqOxL1W ceG+k2v6kvONBUu2DdOgdMM70Ln+dV2uIDMnpmqmglgn0dJJw3EuWShM5YSlUY+jxkk370etTLf Aj5uDrACvS097c2ZTC+uCylsYnszsHPiM= X-Google-Smtp-Source: AGHT+IFdcmiRfTJtzXWM+sRlUY+F/J/OXy4wf86k3s8P4CB529VjZo/+eJ4LAFEFoe7BMrdGuwSC7g== X-Received: by 2002:a05:6000:2510:b0:3c8:c469:64d7 with SMTP id ffacd0b85a97d-3c8c478ad55mr95402f8f.45.1755996533438; Sat, 23 Aug 2025 17:48:53 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:52 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:31 +0100 Subject: [PATCH v2 19/37] meson: Automatically generate glsl_shaders.h from specified shader programs MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-19-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2511; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=Fx1AlOY28NC0VR0sz9yn6g9uTYfxDKucQo96QZW6id4=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFfMcwSWukyNqyw0S274eEoqL9XgoX31JQx1 jqJnT9W5yuJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphXwAKCRAicTuzoY3I OhjiD/9TObNQk69qfj/Oqzobs32yX2swpWdlKXaoAGIZO5Ald9CU5oYYPbO6ZGtWSTsJRsc0m98 uUczS/HYnh1DAyp/EVAkeKQ4+XOOhLl1h1Z0JdyU4WvvORItPOUhEWQWcRPUdiw7XaaP6y9QJ0y /F1RMckXWlnArgYXndeMlm6ZE9pyca3q1pcLPSXIzezf0RPki6EV3h7UPk74u0uzZScNh85ffdt gLulVh4cu7n/imucSnNuCEXXd2FotEVeF9MMTHwiRlc01MR1l+AGkpxabKrkuU+MoSwP5250rrc KXycubBpeF5IuZ8+1sNi7ux1RlkYzUSzixDUuEfJXCeK7Kq2m87EznP23s0YzF00ZoVFUEguUku 1WI7r5qx691kCugjy5IYu93G8mykAHZ4d2BVUFtZ7IoAFDJtLdekyw1aCVTVG0GOtMDXF5idBOH gVPOL8SNoIGb7V8Ag+KymHuI7k70GJncnPS6wzgTm7o6lmV4gHG9mN4E433S9lqDB8ESUIHdFUF LcclfE0yUTQZm9jFFQfmnptpfbXe2/F0LCmvpOOBoGov9SgeaB70nww6ggA7roCk8ywduYbbg43 /HUS5eJpwE6BoqTn7u98bc2yxADLlFTHdKqMTOjZaxG7JaqCTlTOJ3xSBxsP/oGr7lzJwenKILN ayaybSc5uugkSiQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Encode the bayer shader files into a header as part of the build process. Qcam already compiles the shader files down into a QT resource file which it references internally. In order to share the debayering shader programs outside of qcam create a generic header which both qcam and libcamera can operate from. Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/meson.build | 10 ++++++++++ include/libcamera/internal/shaders/meson.build | 10 ++++++++++ utils/meson.build | 2 ++ 3 files changed, 22 insertions(+) diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index 5c80a28c4cbe6af5f0eef713eee995d61fa48a4b..90155857e44fc64803df5b5a054ad62e48b8e2f5 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -1,6 +1,7 @@ # SPDX-License-Identifier: CC0-1.0 subdir('tracepoints') +subdir('shaders') libcamera_internal_headers = files([ 'bayer_format.h', @@ -58,5 +59,14 @@ tracepoints_h = custom_target( libcamera_internal_headers += tracepoints_h +libcamera_shader_headers = custom_target( + 'gen-shader-headers', + input : [shader_files], + output : 'glsl_shaders.h', + command : [gen_shader_headers, meson.project_source_root(), meson.project_build_root(), '@OUTPUT@', '@INPUT@'], +) + +libcamera_internal_headers += libcamera_shader_headers + subdir('converter') subdir('software_isp') diff --git a/include/libcamera/internal/shaders/meson.build b/include/libcamera/internal/shaders/meson.build new file mode 100644 index 0000000000000000000000000000000000000000..386b342d03b106e8303121ae9b84b2d2ee4e96d8 --- /dev/null +++ b/include/libcamera/internal/shaders/meson.build @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: CC0-1.0 + +# List of shader files to convert to header hex +# for the purposes of inclusion in OpenGL debayering +shader_files = files([ + 'bayer_1x_packed.frag', + 'bayer_8.frag', + 'bayer_8.vert', + 'identity.vert', +]) diff --git a/utils/meson.build b/utils/meson.build index 95d657ac965fefc06ea2c0c445bd46b125e56564..3deed8ad4d7e6d18cd99d5d4302b19458e6b9f4b 100644 --- a/utils/meson.build +++ b/utils/meson.build @@ -3,5 +3,7 @@ subdir('codegen') subdir('ipu3') +gen_shader_headers = files('gen-shader-headers.sh') + ## Module signing gen_ipa_priv_key = files('gen-ipa-priv-key.sh') From patchwork Sun Aug 24 00:48:32 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: 24203 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 18ABBBEFBE for ; Sun, 24 Aug 2025 00:49:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C4D5E6930D; Sun, 24 Aug 2025 02:49:20 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Tfht90DB"; dkim-atps=neutral Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B0AC269313 for ; Sun, 24 Aug 2025 02:48:54 +0200 (CEST) Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-3c7aa4ce85dso315408f8f.3 for ; Sat, 23 Aug 2025 17:48:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996534; x=1756601334; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=8ylZnKUZSQFRqy6Q0Mt40bxE9kZ4CGqpwqvqE7SvScQ=; b=Tfht90DBUq7bfx43Ymxs2Q3teVFnceaxOvH0N2tmFXIxBFn891MFELMe1MzpvV9vVc /uiNEFj9SGy3+TLx1/az2YidPCTzqjnmNUg0q2wMfTONS09UbCGcS50oytlL7X5c+Nnx 9Hn5E4X+sQ/EXgR76MhPipqQJ7ZQn6sI7oPUAlzCMZoN5dKcrFFeyDkDg9RLfoqOltyN EfV1D2Pb35Ivl29cwHzngFizbu2c3vyr8B07GwYYHBIAwoizDB5RyaB/mrgKYeZYljMp nwjBEmXSwkX96Iu1w13b3/sTpWKuqPtAKtDijEOt/wOfv5VVvQggN9G/W/i76lX9EseS IxfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996534; x=1756601334; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8ylZnKUZSQFRqy6Q0Mt40bxE9kZ4CGqpwqvqE7SvScQ=; b=gy27qH6Q0Lpzh/UtvMebZmJ9kQzxlI6oPuvVIkUH41aVe/UbZ1ub/UypsrPlZykCUX XKA5uePj8o6Cldy2s8GOnBvyPd31zD5fgKd1U9m6b4lUDWLgREzWwjbI5HS6N8hxsMxp pnImZOlqLRnU/dcxCLDTDDw4lNuvxwydbpk0xTDn1+vqYnoYgIbv0sscgtuqtz66PpmC ctTsxSkVad2kaW3mCb61sWKtbY0LMwMbZxOvkbtH8pwX3zEFqdjEGxNnS19+8uAfxpKh xrMwUPP6qfDRbZ4ylC36RtYufLQVCMJvc+KP0J0vbWe/SFlmturkvFgSbPlP8Ly1zCX7 0Ygw== X-Gm-Message-State: AOJu0YyJI8J6KcqtIRizfbgHm0wRcIzaoAru/CKikXDVfkU9bVLyBk3f 3stvJcnlNPDa2epLF8SdXXQWwYpiGZZaHLeNxHnB9MNVWWZJ51dhETfxNL8GJdOKMtiuURoSMca MEOYZ3eg= X-Gm-Gg: ASbGncs3u19YPy1tv/Qa1Y+Hd2USRh4LY0XYDCvEsqyzDQvZTyQSlO02IKQwoQmmC/M lKUtchgO4RlkYApQAR4SQhavN0JXoPn9eeXUcor+REabDJVkS//wW+GRYsQdQuGt7sdNlpzAEfx 9TT70JKskimFss3b2epygh2LV4sFj0hdcWZIUDy7KqGqDhfsmI2D2fFQlYH7s11onfDyhqYLLSk 0r+jMHZMUlnu0QAhhJpo/ppU/xrO+lJXYAJzRDqdH7EzpgtbcCIeuZKqD6w8PediFE2JosJT7Ym a5s3DojY7gsQ/JIE5to3QE3X7AGB4yN+BcJ8RZ6JHm3d+O1Xxbc7GO3/Z0skPoniBsWYsphZsOH ICGdHT6YbGZEUwjrEAZaJ4n9buAvgn1yF3rNQCSYGBiQeOxEcvOXN+KxhcWFxj+SkR9LgyLLQxf 4Y/Gfb+bWfbo0zn5Mo1ncpztrTy8ZWyQs= X-Google-Smtp-Source: AGHT+IFODisU8EAO6N68UtZF/xKm4fwkbfEINAgmsySIfrk8e5nbdhLE9PSG2kBQyjns//G6vmkVWg== X-Received: by 2002:a05:6000:238a:b0:3b8:d79a:6a60 with SMTP id ffacd0b85a97d-3c5daa27b08mr5948313f8f.3.1755996534258; Sat, 23 Aug 2025 17:48:54 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:53 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:32 +0100 Subject: [PATCH v2 20/37] libcamera: software_isp: ccm: Populate CCM table to Debayer params structure MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-20-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1374; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=NbGlfVoohNS/JTmXncJUftH1APwEXtQE51HMVXCz0vo=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFgHC9C2+cF7SBz3BenmquZ8cd0RP5GpvLIs RzFQdsfMR+JAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYAAKCRAicTuzoY3I OoBcEACMc307LbotS6MIuU5oeP/18nLspTcdCZrj861B10oLJ8qXBkgvkva8AKG+MS6CoDMrUX0 nRkdkjzq0qwDlCBN/3W6GdxQQxA+DitFhPDIz5ApGfYObIbS6UggRT77jiKNfFfPdBSSHbQDbRj ivdqy4k2D07R4MjIJblOdeQ15vl6+KF0Yneu5acMqZxdcvSSMQxpetoWL3HuA98sMsK+9neuOWF 3xlLWV3XwG/STFUJj/frgrfeL+mzNaMY3yc/6MtksCB8Y9r2//I+4QT60nGTeQ8GJ3S198SkBlZ ChQUUamSyeGgFtn2G3xrm3EiKuzhlQyocHJrovv+kjMW7Z6fBcM8TjWkslxAvK/tId1jr1JeitS Gl95mH0TaNCE/49gq5FrnuOuY4oWS1VVoVzec1m714Myef5dw5Lgf/N3vIPQEMVX/nLZsHFxbQZ /nNAJjr1PByBeOd5xFGDV3N8zSrKT0/XwCXtxldaL7r04g6bquTktLlgrrLDhITGuCVHvbx/5eb PgABcaita+Fc/NtsBVALGW1GIPUWwKXSqbadYGVDjHlL1qVE4IFpEW3iZFmi4T6I+7We7OxcnQc rJMzrmEG23eMd5HR+H+fnQvz96qxDGRp2s3Aoo9aGXpsqHL/pM4Uv8v9BHNUkKzxTHjRbcZmll0 WaMGiZQEL9Cu7pQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Populate the DebayerParams CCM table during ccm::prepare(). A copy is made of the CCM into the DebayerParams structure. Signed-off-by: Bryan O'Donoghue --- src/ipa/simple/algorithms/ccm.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ipa/simple/algorithms/ccm.cpp b/src/ipa/simple/algorithms/ccm.cpp index 0a98406c1a3aef84b39e40fbab5ed028fa249c30..cb023878d82a6ee08628ea75b61f173b03403f9d 100644 --- a/src/ipa/simple/algorithms/ccm.cpp +++ b/src/ipa/simple/algorithms/ccm.cpp @@ -14,6 +14,7 @@ #include #include "libcamera/internal/matrix.h" +#include "libcamera/internal/software_isp/debayer_params.h" namespace { @@ -84,7 +85,7 @@ void Ccm::applySaturation(Matrix &ccm, float saturation) } void Ccm::prepare(IPAContext &context, const uint32_t frame, - IPAFrameContext &frameContext, [[maybe_unused]] DebayerParams *params) + IPAFrameContext &frameContext, DebayerParams *params) { auto &saturation = context.activeState.knobs.saturation; @@ -108,6 +109,7 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame, context.activeState.ccm.ccm = ccm; frameContext.ccm.ccm = ccm; frameContext.saturation = saturation; + params->ccm = ccm; context.activeState.ccm.changed = true; } From patchwork Sun Aug 24 00:48: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: 24205 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 418CFC32BB for ; Sun, 24 Aug 2025 00:49:25 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A10E4692E7; Sun, 24 Aug 2025 02:49:24 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="VS1yPQTr"; 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 975E569316 for ; Sun, 24 Aug 2025 02:48:55 +0200 (CEST) Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-45a1b0c52f3so19685065e9.3 for ; Sat, 23 Aug 2025 17:48:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996535; x=1756601335; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=FimEPcJfqzD/y1F93vPgTSYDNNrnSqgquL7dYkKKJUw=; b=VS1yPQTrC6xuBgjsyi+f7D4JaAEdh9WdFAncor6nQMSx6d/R7M3Sj/WfgHpPiWe8Mm JonUZe45I18XaShWq95vN7AHX/U6zXhgaxdiNBn/a3/OYnIbqss/huxrcevEOjCBCzl7 jN2JuOtZwiszIwfJFokcNlo82iklpBCqCgaYfs7PGZpNc4L0gq64Pj104y8kkilvjTiu l9DTdN8zDETp4zJJhrg72iccoZxmf7z8v6/ywh5KUxVFzFrEdhdquu9SXZF8dYEF63kX CHO30iCSsPG8fModEBBpqMTf901SDG1Hp2l1XqbcmzgqXGfiW7rGG5nR2sbwqwkuXDC/ u8Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996535; x=1756601335; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FimEPcJfqzD/y1F93vPgTSYDNNrnSqgquL7dYkKKJUw=; b=SNmjDefMwSv4/U45eYj3YJJ8m3qmKFXAtPr9E4+VlhcgHqrBiBu5zQMPcJ6flto+bF jQ2xZhUR68ru713xphqnXOuMTTnj8+VqqBHVnChn4fVBjd9CSyJQICLiuncQFVCuuKnD cFp4/BRyp0NU3BFFvzxgoGs58N/GdbI4BEgu0qzBSBGWvxUjQ6ltFLVWRReZNjmOX+St xB2KHSGIbTstTL76VekmSsfO+BVvLfHPL6l2OscV4mzNcULajqz0OYEVhJtEcQE9O9LT V0swmmucST0Bk3S5mMIrTGmUludvU6wQQDQE9SyVrbkjinDaaKI8DgUBW7jTc22MMzkt ofDA== X-Gm-Message-State: AOJu0YyjYxKOxTsohw5FFkywE9uBBYAvhZrseP4nbWhn9RefMuaRRkb3 hDiUjqoeO7Re4ZU6nxCGVtHrnaJg5EZdhlP2XHOj2+oThTZHBYkfwIqnYgGJtrCqOTI= X-Gm-Gg: ASbGncslB2e5iqPGwa5nAIIAX20vQSUYwVmIcD8vJ6S3MsgStWOfe5oTmfcaEu9pEtA +0McnylGIfgBJ1YUtIYWKmC69O5OuTxVJotRR2bCydkST+w1HlSq7/9j0VIItL0bPmnaJhBtVz9 r9gHwAec1cUQUgOqCZfpBhoiCjHc893yT5PeuzL+nOzbJvxEDY2NfHaTf0xI91RnEVLLePfZUQh fx0YhsACFW13/3VtDVzmngE+h8/gzqmNtgTk03rkZsGgxZTLKZq9kB4LIRHO9cRLZzZEgep9H9U 8YRVhVgaNeWd3LfPcamOCwYcyafTD3N8xmAGTVtYfvBDJRaUTgWPd9i61p38Ble5fo0ndCV8UQW 7Bcp1bePd0fkjdqs+fDj/frA/36Az5n3WvZ4nEr2PCG1mCltcL2OHeq1pQDrhkjXV6QEPagQbVz Iv2igbcFHjOkSTww9BttGr X-Google-Smtp-Source: AGHT+IHe0dCIocEFZ0kfskr8azRIrOjjn1C1YYbJTyf/O+7KQSyulc9X2xgwkMpge2pM7VxHB9E2aA== X-Received: by 2002:a05:600c:3b8e:b0:459:e3f8:92ec with SMTP id 5b1f17b1804b1-45b57557becmr36421655e9.10.1755996535092; Sat, 23 Aug 2025 17:48:55 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:54 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:33 +0100 Subject: [PATCH v2 21/37] libcamera: software_isp: lut: Make gain corrected CCM in lut.cpp available in debayer params MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-21-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=850; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=FFU0e6b+jOj1EF4GO7A3Vo/viyRB9130uJ8dhYJoGyU=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFgFRHltipt+AIMA5OD1Iv9tBOxJrZzyftaE hXtF8IJ3bqJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYAAKCRAicTuzoY3I OpVKD/9NB0l5VrAP/EG7NRnnjLVByFVh4b9spzYee/tfAitFlYxb8oNz0+0R5Q4bvAOTQWT+Uw2 I1tsoFaWjqJ+hipxSCa3fHl2peGIH60dwRLjzD3H5IHNgZTgmmy6DNgCG8n5WoKE+wO49J6IQbr 1XYnSCC7eAAMLjYXvtr3EbuYyE9VUBvUCQGnYKWMwxKU8bMLwR2REYmMcaQm9EPlv37lJm6tF4+ yqRO4oIh1PZTKfb2ae0ry+EM2WPMj9CTZo+E79ClaUhwnl8G1buhCLgTu1VVCxKBf8YVcTVQSK/ 0S8HXaPha1a7dwH9eEJAFg3mQ5XDP+Q8/sithaOdOXIjVQ5F/PLDTAWbCXWYA+k3rwVGG9u8Sf8 bC4g2WZlAIyNGEQ8/t7ax6DT/AO7Zw+GJrA62pFaDxCXNQDDLAf8UjW8+R7lIN0ZfMqfPMroB04 qYNk9eCY9vVuQuSNaK4IzXIDz2/xkyLgFEHZAvAaAZn9kH+5jAsbwo/Srfuo09UXHYskALS025l NAjUh/I4kJULOsM0z5ooPNrMqZnE2X90bLa0eOSg6ODOY8vXMyuCSQZDPNWtHKTwxBgex25iSaZ 71fLgC4KggdIVDkrCUBP5/TXOj+8eLSaFQ3CD44dFYO0OB+dKxRmdgFCvwz0rleuotGegZ3vX2l zoctv5XOhUYpAOg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" There is another CCM calculated in this algorithm callback, this time based on the LUT. Signed-off-by: Bryan O'Donoghue --- src/ipa/simple/algorithms/lut.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp index d1d5f727129ea3cfc04c31c357cee54689e6d23b..a161adb1a489a0cfe29253ccc14e5fee91fbf7d5 100644 --- a/src/ipa/simple/algorithms/lut.cpp +++ b/src/ipa/simple/algorithms/lut.cpp @@ -126,6 +126,7 @@ void Lut::prepare(IPAContext &context, auto &red = params->redCcm; auto &green = params->greenCcm; auto &blue = params->blueCcm; + params->ccm = ccm; for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) { red[i].r = ccmValue(i, ccm[0][0]); red[i].g = ccmValue(i, ccm[1][0]); From patchwork Sun Aug 24 00:48:34 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: 24204 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 0C09DBEFBE for ; Sun, 24 Aug 2025 00:49:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3FFB269312; Sun, 24 Aug 2025 02:49:23 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="wagop2wE"; dkim-atps=neutral Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7887A69317 for ; Sun, 24 Aug 2025 02:48:56 +0200 (CEST) Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-3c79f0a5b8bso660159f8f.1 for ; Sat, 23 Aug 2025 17:48:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996536; x=1756601336; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Kn95fqpa0M3VlH/ov1S+PHQQo16NVdFOXN/7e6MZaAs=; b=wagop2wEfAAM3vlTHIe8E5vNTOLQfLARlsBH5naFejBdAsUbHeT6hnZQ5SQhXFHCEj 7qxMtZhzstjd03HOnGy/r+a1gUIcYqHsXx4mhH8QS18dXNbobt5WEED8r2OMKvjjbJK8 fK3CZcAzZW9n7JRDi3/aX2tpJ6Bt/SubLObtdTFjiri9bH31WFBsLfTtW8x2yO+pE/+W 3aXQ+6JZDtCG5dkaoIEAZePv6JLmsB5f4fBEtxeVscMwFTSKV/U8bytFt4oskr0uH+oA JWAQ32MZxffnMAAxfY/JteLAi6UBOEmKRBZ0BZTspfaXfzsu+E2lk69rh3MQKZuafGAS ZKHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996536; x=1756601336; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Kn95fqpa0M3VlH/ov1S+PHQQo16NVdFOXN/7e6MZaAs=; b=Wwc8UCt1I+lud5dU0rgURSGf0WYtPdEdLHdlL4rPC0ZYDBkd9WhD9yW+DuZQ+OzffD ljpWylRsvBkSpks+qVvFjuttPKaxcxnvyf0up+V/K+j23CS1XdCKwG0TrJq2mqT8d5kv xWK7YbkbZbdCb7tpj+KpS95DTreWbVN4kVRUilzcIlVBfWxRrJ6px90w2ELyGZ1QfvOh svR77zbqs3/XnNQU9ZS6O9Psarcd555P9VtHGZdWgPVmDwpUe42U7r2eispzuTrMzbUr HR2L1MneGC5vmxaqnVDUSLAjop1kTgxdLSv94CFkoVX5QrY/lmJXqKzBY0dIbihciEeo B/rA== X-Gm-Message-State: AOJu0Yy534JyjiVd3MsO7N1/Fz4vb09qwiEPL3E7mdt7Ffi+AMhAnI8J 7nbFf564gtiwvDdFNJevemziuNM5Bb0VCmjo1Hfo9B4ddtu31NNGK7c/mNjqFXRMEUd0UEkDVlO glpcgudU= X-Gm-Gg: ASbGncuO+T+JOKZxXRJzpNti/9hRzuZN6Qex7LN/7jMBVzTUKIws9tY1mnWMDWwwtWL 9m4/doQBJF6CIA3V7xItTJpWZsJrIjnV4tAAi2ihprg88CFopd1/dX5qbIRhJRCfxNnMOcEzRvD qbvV8+rmR/V8E+vf9JgzY8+WN5Sz4FcfdyhKjvqIYFSdDtQRc9ag9uNi+Er5yYqiK3yYIosQ5GV V7Y0GYB2vywxyFNe3UBce8bgXuU6va17XL5qK+krNBUNPEddpSF/snDCAS2UVdNW13lSPgK0JF2 +0c/feq+oihQusnHU000xtoqJsuQjXkxmwSaf7MThxuYV1qDp+b79ubPBmvRc7bPS60ghpvahwj 5IYm8R5hMsR2+vLfMyMdN0P/w29RkzSomDRP0JUqbqk/V4YOkRRe3lPZ3A4pSqQHG1H/95UBuq6 rrkKXZagZ087kuw6r73l2InF0N7sJFo9M= X-Google-Smtp-Source: AGHT+IHHL3bDAY4Rrw3j94OMpBcONvwEGj8WSUdXtO01KObhnqwoJ6IY8zCws4t9foTcUhqNUsGJVw== X-Received: by 2002:a05:6000:2211:b0:3b9:7bea:14da with SMTP id ffacd0b85a97d-3c5dcdfd479mr5160578f8f.29.1755996535948; Sat, 23 Aug 2025 17:48:55 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:55 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:34 +0100 Subject: [PATCH v2 22/37] libcamera: software_isp: gbm: Add in a GBM helper class for GPU surface access MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-22-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4346; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=egsSMfvlLEe6bXc52sk6IMnd2gt0PPvVs9ZsgHzSO90=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFg1GoWTLssI0JidAMdp2Ruvm9b7J1y7yS4C mfpfmkZnwuJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYAAKCRAicTuzoY3I OtdPD/92DrNp7bLmefiMO7HIqCjzcBRjpPkt1PrQXqqnFAFo+ndKr3z7J1t6PKjj28/6kodO+3R 5QYVm6wTH0gCRBYCGKc/EipFYOe+gMBaBlrB6zwBNFg0uZIHPJJGzNHXtDVRPE37S2pU+NNMY3P RWOrn00B1h5tpH7L4n0lMgayc2ziQ8+MDZDlCFaEDeO1ZZb79NNBli7nIOTIHv+Zwr6fcTGicd0 gSIwTjOmnby3rszaOou3F7P9CBUivf3YoyvSO3gc1O4dKMbGH/iwamI5pBqgpuJTDU+xqcPgKnr qLYgFjLeqjKmK/6XLNr5SI8yR2lFACpFEuZrlPSyvwLtcF6odSDQ4RR59rdEzTLzsDsmHtumnxl c7nUkwLDZMbigiC8iYTJ+BJVikciiMyuFWuvz5eZvXaYB22WDmdJMSOY1Osgn5+pErIcPFzQLo1 6pZF1CWpXU0cmNcI+bWvpl+VDTiqBtYu32VCZCczi3xG+iCTXax5U8h4fnbsB6NEvINureEQo4B lX0W9HI5sTLWwX5aCD0mWEa2Ef0I6KSS2CknRpmUCNNn1b/9qx50A940nhyi9tVwl5/1zclZFrp S/PUPO+ZhY8CeqHCG6NU8uNwVhFXu0Ysk7vsq8DH9zdh74kB3h0SaahPqNjsUPFeF56x8o+tNkS faHEx28BWTjlXVQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" A helper class to interact with GBM. This will allow us to specify the internal storage format of the CPU when making a texture for the Debayer vertext/fragment shaders and thus ensure we receive an uncompressed and untiled output buffer. Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/gbm.h | 39 ++++++++++++++++++++++ include/libcamera/internal/meson.build | 1 + src/libcamera/gbm.cpp | 61 ++++++++++++++++++++++++++++++++++ src/libcamera/meson.build | 11 ++++++ 4 files changed, 112 insertions(+) diff --git a/include/libcamera/internal/gbm.h b/include/libcamera/internal/gbm.h new file mode 100644 index 0000000000000000000000000000000000000000..ccf7b2da54eebb1b69a5b7c050eed778c199ac8f --- /dev/null +++ b/include/libcamera/internal/gbm.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Linaro Ltd. + * + * Authors: + * Bryan O'Donoghue + * + * gbm.h - Helper class for managing GBM interactions. + */ + +#pragma once + +#include + +#include + +#include + +namespace libcamera { + +LOG_DECLARE_CATEGORY(GBM) + +class GBM +{ +public: + GBM(); + ~GBM(); + + int createDevice(); + struct gbm_device *getDevice() { return gbm_device_; } + PixelFormat getPixelFormat() { return format_; } + +private: + int fd_; + struct gbm_device *gbm_device_; + PixelFormat format_; +}; + +} // namespace libcamera diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index 90155857e44fc64803df5b5a054ad62e48b8e2f5..6c65254ddd95fbe9cbb6dadafc0826226b895a7f 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -24,6 +24,7 @@ libcamera_internal_headers = files([ 'dma_buf_allocator.h', 'formats.h', 'framebuffer.h', + 'gbm.h', 'ipa_data_serializer.h', 'ipa_manager.h', 'ipa_module.h', diff --git a/src/libcamera/gbm.cpp b/src/libcamera/gbm.cpp new file mode 100644 index 0000000000000000000000000000000000000000..caf9ca1c742ce3269ec10f0b6394f9821dabd932 --- /dev/null +++ b/src/libcamera/gbm.cpp @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Linaro Ltd. + * + * Authors: + * Bryan O'Donoghue + * + * egl.cpp - Helper class for managing GBM interactions. + */ + +#include "libcamera/internal/gbm.h" + +#include +#include +#include +#include + +#include +#include + +namespace libcamera { + +LOG_DEFINE_CATEGORY(GBM) + +GBM::GBM() +{ + fd_ = 0; +} + +GBM::~GBM() +{ + if (gbm_device_) + gbm_device_destroy(gbm_device_); + + if (fd_ >= 0) + close(fd_); +} + +int GBM::createDevice() +{ + const char *dri_node = "/dev/dri/renderD128"; //TODO: get from an env or config setting + + fd_ = open(dri_node, O_RDWR | O_CLOEXEC); + if (fd_ < 0) { + LOG(GBM, Error) << "Open " << dri_node << " fail " << fd_; + return fd_; + } + + gbm_device_ = gbm_create_device(fd_); + if (!gbm_device_) { + LOG(GBM, Error) << "gbm_crate_device fail"; + goto fail; + } + + format_ = libcamera::formats::ARGB8888; + + return 0; +fail: + return -ENODEV; +} +} //namespace libcamera diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build index de1eb99b28fdb07b78b529ed21d9d584675d50ae..64270b571cea2ece8d4dfea8a23b8edf60de70d3 100644 --- a/src/libcamera/meson.build +++ b/src/libcamera/meson.build @@ -68,6 +68,16 @@ libcamera_deps = [] libatomic = cc.find_library('atomic', required : false) libthreads = dependency('threads') +libgbm = cc.find_library('gbm', required: false) +gbm_works = cc.check_header('gbm.h', required: false) + +if libgbm.found() and gbm_works + config_h.set('HAVE_GBM', 1) + libcamera_internal_sources += files([ + 'gbm.cpp', + ]) +endif + subdir('base') subdir('converter') subdir('ipa') @@ -181,6 +191,7 @@ libcamera_deps += [ libcamera_base_private, libcrypto, libdl, + libgbm, liblttng, libudev, libyaml, From patchwork Sun Aug 24 00:48:35 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: 24206 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 7BB61BEFBE for ; Sun, 24 Aug 2025 00:49:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B4A076932D; Sun, 24 Aug 2025 02:49:26 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="UjxTMeyI"; dkim-atps=neutral Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7999F692E3 for ; Sun, 24 Aug 2025 02:48:57 +0200 (CEST) Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-45b4d89217aso16725425e9.2 for ; Sat, 23 Aug 2025 17:48:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996537; x=1756601337; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=yLq21F5yRryLv7x5cIsVnUA+04op7PybL91l/CYRfb8=; b=UjxTMeyIFK960KLhHQLxt+44vUmkJlbJWG45nh04nh1CcL/eJzVXhgAlFOwZ4r1mdb jKHsueetkPsEhwpMjoSIRPMRf3LOYs1S4lEF2i9jwOn/7B0HEDznhjd6wJNVJZZDHWop eLmKTPt4xKECHr+EiOWnBd8b/MMeCsjq6zdbGrMeq2iHuMrghZRzaF9N+aaX4iNmfjWh RL/nQjqpLPq9wI9acqBbBySDWJxextFml/Qkzp0soAByFRWTb1eYhqy+Z3nndIDDhoTa iFfBLzGVQ9E0AuI8L1zq+oSLahWIi2/5Pvsh7sRY92cYbzCcuNlGJKtpaWT+U91FjwVx /uGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996537; x=1756601337; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yLq21F5yRryLv7x5cIsVnUA+04op7PybL91l/CYRfb8=; b=gQxX6eeqz6AXVfKxkcHoZGP0DV/WCE8ySCyj6gM16vPOuVQhUkGxjRMQ/iUoy1kzpl Uj8W8Hs2mylmJBdMhqIGFEQawo5N0ph3tbojK+f+ldLkNoElh3MbMK4d7V72gNa/l5XA fNo/pUS0GgFzbtQ335b+9bRTVtOqCLbRGrWTAVxScD4kvT5znwC2rD/4pAFHX4Cxm82c 4qsGiB2jM96KUzOtDyiynqeMSQkrWZgZEOQcubIIqy7ewzrMkU7Z9e/hG0fM1U/4Xodi WEvWBV0CWxEyxQZQF4eNkJD7pLePaxpO43+yZWLOHIaMziIc6ulJdpGWin/GmiueQpN/ xYxw== X-Gm-Message-State: AOJu0YzGMrrMTKuH/XaiGpQmXP1c69yJQpZJXiIQORH0uf/1ZYZ+A29a 90sAmdNy1YpLebxddMVYYE2ONQ5r9n/4N0HYMyphkKUQsxiDvItvMK6+qKlEppaNHWJWuYtWxec aKZvKFoU= X-Gm-Gg: ASbGnctzwQWcnaBwN/+X20+BFzaB2GqYyZGvtq0natsqNpRGXfoHMFy8+8U85i2/C/4 LgatJIhWntqARNLQh1iddTgGCzlagH22S7NECIrp1zIgp8AGK9LKk/h04rmMlpIELfD3l9by5Gs V8GOj4PxIcClyse1FLGdeQsACQF1QNgpP+E4q/IR/rtlg1qJZv8FqFrdhA3DsC9CKmSRg5H+fu0 QIASsXUyXsCIpgIGHX513Udo1xMPtPLAEATT7Q/xndvBvyLcBsJBJpVULOfOoqIxZwYFBCqoT/M PIk3+OLklK0XP1MSDfxzkSkP0Ih1KBrn8A1ugCBFgdy+WBVarRv/w/cWviOVMz4iU2vMG6cUS9e jbcQecqmZfR2h6iyjIZWTTS8djiLF9L6HAQUqL7s4hDYIaRyTyezP1PHRMfR9vBEXTtbKTSrYzh q+L21xfG8YeNhyBqqCvLoT X-Google-Smtp-Source: AGHT+IHgep8TtyKon7npTUgFygnm5xKCcKaFXbtRlS/j+/kvgxhqPhagwUPkk0pb5V1e6/0VPV3ZCw== X-Received: by 2002:a05:600c:5494:b0:459:94a7:220f with SMTP id 5b1f17b1804b1-45b517dd998mr53252775e9.26.1755996536801; Sat, 23 Aug 2025 17:48:56 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:56 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:35 +0100 Subject: [PATCH v2 23/37] libcamera: utils: Move ALIGN_TO from camera_metadata.c to utils.h MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-23-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1627; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=EwojlEA7u5QGO/oFAUMxFKVPV5YgZWQoU9hMLxM2CFs=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFg+Wa+wvgh4Bw8ub4iobUKHQtFoM72/DpBC hImn6QALG6JAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYAAKCRAicTuzoY3I OkttD/9wPFft/k5nU1HlyRTQA6QcyBkTp27Bk5VxJZKkvUHW1XaSCNq9EmiDrnKN5a0HFDKQLw+ iXtrS8avTcPcPFq1sXov9Bq3B9QAcs/DyLm1TLU3ZCMgqreRynbTPY8dSQwEOUf7DDWccpKptHr qiWUbbeKv47jEOYqFbhXXBq8xJEnUOVsTnZ/lpuLa8kvYlJK5p35Kgm4vc/ggnwrTKUnQgEbXJY /s62FlSZ3hCfQG0QcCgOlY7LDdJCpjqfhUemcN4E0Uyvj4rDRL96Vr0tm4FDUpjXYHgHlsqV7Sx WgRox+v9y6gvuw4aa1M//GeeGlxH4NcClfsE3NbFD8Gtx/LINnwfZYZewNY28vuMsx0PR8tfbjr ftuXf9vpThq2u1Hkh4hrCvBtUT29T0n4JQoxBwUwxtz3AK4UDuHqX0mLB18S1P+f0c3t5K49wKV MNUrk5dbL1XaznTZTjEIMwi39MKMQXpsq6fENu+oYXejTa2uq+0qBwY2J2kD9/FiL07Xxdb5b/R OoodgbVYxMqQK2D0NpIWgI6tTg5z5Vq+opi67erfcPt9qza9Spw9pAQ9hIRM62c9tvwbs+RylUO BMQ4SGVgrD8xXnLFMjGYQsq4nlmbpydWBag2U3joW/f7BFoVk1SzvLuUTi7c1IKT0BBhdmkvu+F waSl/iXPzn7CZVw== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" ALIGN_TO() is useful to the GPU debayer logic, move to a shared header to facilitate its reuse. Signed-off-by: Bryan O'Donoghue --- include/libcamera/base/utils.h | 3 +++ src/android/metadata/camera_metadata.c | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h index f21c6dc016ece00e9842ad17ae4dd036fb5683c2..a0d3ffc27804d27c6b225d7da8c74feb3c261f3d 100644 --- a/include/libcamera/base/utils.h +++ b/include/libcamera/base/utils.h @@ -33,6 +33,9 @@ #endif +#define ALIGN_TO(val, alignment) \ + (((uintptr_t)(val) + ((alignment) - 1)) & ~((alignment) - 1)) + namespace libcamera { namespace utils { diff --git a/src/android/metadata/camera_metadata.c b/src/android/metadata/camera_metadata.c index b86586a7e6857a0920234ea312eb5181b27c3ac0..4fafb54076a4a4be41a31f5ce3bd8c74bf649f59 100644 --- a/src/android/metadata/camera_metadata.c +++ b/src/android/metadata/camera_metadata.c @@ -24,6 +24,7 @@ */ #define ALOGE(...) fprintf(stderr, LOG_TAG __VA_ARGS__) +#include #include #include @@ -39,9 +40,6 @@ #define NOT_FOUND (-ENOENT) #define SN_EVENT_LOG_ID 0x534e4554 -#define ALIGN_TO(val, alignment) \ - (((uintptr_t)(val) + ((alignment) - 1)) & ~((alignment) - 1)) - /** * A single metadata entry, storing an array of values of a given type. If the * array is no larger than 4 bytes in size, it is stored in the data.value[] From patchwork Sun Aug 24 00:48:36 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: 24207 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 67DC2BEFBE for ; Sun, 24 Aug 2025 00:49:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F0C5969330; Sun, 24 Aug 2025 02:49:28 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="xTosWuPc"; dkim-atps=neutral Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 45A4769301 for ; Sun, 24 Aug 2025 02:48:58 +0200 (CEST) Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-3c68ac7e238so724775f8f.1 for ; Sat, 23 Aug 2025 17:48:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996538; x=1756601338; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=1R6a5hzlND842KEEB7x7AFqaaRj4KgqmgTvlX61LMoE=; b=xTosWuPc02Ti1vy7GqcRaeB7ZsZn5rtO7p0xzuTV2uOLECeGdpiKLJn1ao9lTEDH1S zJO0qSbOcGFonmxgRFUNAW1VTduiKqqNU0KF+uG/kdrM8qR74zlek3QwYKYD/frLTSpY 26VyeH9cZJy4u0RBXDr/iyvfb8YQHLG/xUwztPh3mm984pabrNWxjnB4fzZ9Wr+Tk9iA 3wWkGHmig/FA/GEjHSg+r+AnRsauDsloNhOQ+GQfydDmfkeQHU8+07dHYFy9TUjRKZbX CMqAeHiohXnNMjFGboZG02WQab25UreJFCJFiHH4kZlbJtgska0MAQG3lCue3KErHGak izHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996538; x=1756601338; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1R6a5hzlND842KEEB7x7AFqaaRj4KgqmgTvlX61LMoE=; b=suYTnJFth8TQK5GJReo/VU03cDz+CrRKRdtXEag5Y/CFeHAtgJg/Ev6DPlSNsdKl6X Y3ZOSmAcGO8SThficyac6u5qPVnzSL1O5Tl56hB86kXb8lFBUZvHDNDje5tg9IPN0kCw yidtb3r8Lj00utMlddacX3ezHxVLmCiXniCTPfpH49U9RfDzuOPpdiYogKf6aPtLjA0S Xq0wXY5K243IP+AdszJd7Ynk1GR2IsE6CwLStRz4Cm27qSDbCAFvok7qfSjd/rG4ACqk bIcKecmVCLEAvO62j1mmQNRRS3cvcM74T5oMhuBZA6lCD45gTGp5VbKMQS3lA4lx42Cg W+hQ== X-Gm-Message-State: AOJu0Yw8Xo0c8C/V+f5/vq48+iHNNHMWJ0Tv66LelCtMTBqPRieVaPgs Orf4yCqjXytBuTCfiKvKd1Fp9ar5iZ8SU+ML/bpw6LT5ur8RAkTTQAGEYSzrzHLMyIzlBGb2q0l qcYfvmAY= X-Gm-Gg: ASbGnctLBOfs6RkW410bjILaR6CFwDwuPJ9O5sRKIX0tX7cC0gEXOIlfp3U1iv3ngr8 JuTTsvd1bbVhXIYhG38+2YBzE4IceOi8P+REN7UpORWvUifyVQg9TAlMAasOvfH+XPQGTPAbDlJ qHTgJMpAe2Ah4Ht+KkZPK0Kql85AdG+HuDAyZFrBQTU3nXBfXHM3jGzR8bFmXsZmVWBp0RP9dj5 mI87m57Zxc4z4XUNVDt1faDaxDOJRNoMpqw4fuydGknk7veMl5CHT5SzgtfzVDeQMMvDXOjztk5 aWVWvRMMxSolkMRKZmS314sqxZKT6Hh7QBnBZJe2bnxiGeaQiIeq0WsDmbhbnYLHDPi37ReLWuk uOKVip9ErX3cXzLRhjUms2S5uXSNztODk3cpnP4eo/b9dvdmjWBln8HIxjDx83kVRe8EhOyMtuh oa/7DOk6ldOAC8NCYVgc2s X-Google-Smtp-Source: AGHT+IG9I3yRfxUzzRuadmnNvxjFv9R9Ho+UznWVvvF/vvRTDr+l7YkH0CTLRmcqSprtcNi5wr5taA== X-Received: by 2002:a05:6000:4205:b0:3c8:347e:b26c with SMTP id ffacd0b85a97d-3c8347eb60emr911112f8f.38.1755996537621; Sat, 23 Aug 2025 17:48:57 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:57 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:36 +0100 Subject: [PATCH v2 24/37] libcamera: software_isp: egl: Introduce an eGL base helper class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-24-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=17796; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=UppZEqSGkas9JB4z+6XYnxlO2Qcf71+kg3MOa90B8Io=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFge2aN//0Aq8nXSpYtY4RAd+z9YKlb/uLeb Fz3FH4AmMCJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYAAKCRAicTuzoY3I OhjvD/9tBoX6d9IfUJaZSVNcYWCaBsQxHYrDjDPYp5ENfvcx36C5eUNHKPMdSPYu17YaLZ9IJpM RpxDDz4XCgPcnkp0v6fRCXzefRT6fHW0i2CM2zTI2sCkOG5x5CSZ/3oPUChcf3t7HwQAytSSdeA dQCbqWYsa27/OKgHztG92QhKG3Q9x4DOPKqjRsxcWo8w4BHUDPH3YP1aB0Mk49yIen6Tf62SDfn aO6/0KLC6zFsHSWFaSpP1DgOKYGPkNSlXSA6mgqUlizaWzoT1NATbxarSxbguXpnCo+RjU2bGGS BHQ06Pj7GQO4s7aqJRSEEz0szaVCTHchBsdOckgMVnrn0mokyjnZwVfnSYCgZaLhx+LJxbt3iEo erEfVCLL5qFG5lq9Tv2SVqs3OniLocUQyAJNWCBReR8nyeX5GJKub6nIV4b0zbR93+KgoHyTMwr 4yPtaxYrhKzpj+foU3/UWAtkHuK19y7d3o/rQZTT9w4F2P1XxQUxYylUXVlKUhQ124iX7a6lvg3 w91ELLkNmZyYMs+sMN2t4Syg4+UgnndjfCyhXKQA3ERHJCQHmgxa5wtS+q41G+4Df3fk/hYnU/a MVo8pMctfkz4RqG6Bjps/5oI9O48IAO/YUUAZJftIzott8AtYhPHEpH09GmCGv48n2rMZg5aSNk o4NdkGmEs6efaqQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Introduce an eGL base helper class which provides an eGL context based on a passed width and height. The initGLContext function could be overloaded to provide an interface to a real display. A set of helper functions is provided to compile and link GLSL shaders. linkShaderProgram currently compiles vertex/fragment pairs but could be overloaded or passed a parameter to link a compute shader instead. Breaking the eGL interface away from debayering - allows to use the eGL context inside of a dma-buf heap cleanly, reuse that context inside of a debayer layer and conceivably reuse the context in a multi-stage shader pass. Small note the image_attrs[] array doesn't pass checkstyle.py however the elements of the array are in pairs. Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/egl.h | 133 +++++++++++++ src/libcamera/egl.cpp | 408 +++++++++++++++++++++++++++++++++++++++ src/libcamera/meson.build | 23 +++ 3 files changed, 564 insertions(+) diff --git a/include/libcamera/internal/egl.h b/include/libcamera/internal/egl.h new file mode 100644 index 0000000000000000000000000000000000000000..2c48e28e14aaa1fa8029dd18662c8ce24e6a550c --- /dev/null +++ b/include/libcamera/internal/egl.h @@ -0,0 +1,133 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Linaro Ltd. + * + * Authors: + * Bryan O'Donoghue + * + * egl_context.cpp - Helper class for managing eGL interactions. + */ + +#pragma once + +#include + +#include + +#include "libcamera/internal/gbm.h" + +#define EGL_EGLEXT_PROTOTYPES +#include +#include +#define GL_GLEXT_PROTOTYPES +#include +#include + +namespace libcamera { + +LOG_DECLARE_CATEGORY(eGL) + +class eGLImage +{ +public: + eGLImage(uint32_t width, uint32_t height, uint32_t bpp, uint32_t stride, GLenum texture_unit, uint32_t texture_unit_uniform_id) + { + init(width, height, bpp, stride, texture_unit, texture_unit_uniform_id); + } + + eGLImage(uint32_t width, uint32_t height, uint32_t bpp, GLenum texture_unit, uint32_t texture_unit_uniform_id) + { + uint32_t stride = ALIGN_TO(width * bpp, 256); + + init(width, height, bpp, stride, texture_unit, texture_unit_uniform_id); + } + + ~eGLImage() + { + glDeleteFramebuffers(1, &fbo_); + glDeleteTextures(1, &texture_); + } + + uint32_t width_; + uint32_t height_; + uint32_t stride_; + uint32_t offset_; + uint32_t framesize_; + uint32_t bpp_; + uint32_t texture_unit_uniform_id_; + GLenum texture_unit_; + GLuint texture_; + GLuint fbo_; + EGLImageKHR image_; + +private: + void init(uint32_t width, uint32_t height, uint32_t bpp, uint32_t stride, GLenum texture_unit, uint32_t texture_unit_uniform_id) + { + image_ = EGL_NO_IMAGE_KHR; + width_ = width; + height_ = height; + bpp_ = bpp; + stride_ = stride; + framesize_ = stride_ * height_; + texture_unit_ = texture_unit; + texture_unit_uniform_id_ = texture_unit_uniform_id; + + glGenTextures(1, &texture_); + glGenFramebuffers(1, &fbo_); + } +}; + +class eGL +{ +public: + eGL(); + ~eGL(); + + int initEGLContext(GBM *gbmContext); + void cleanUp(); + int createInputDMABufTexture2D(eGLImage *eglImage, int fd); + int createOutputDMABufTexture2D(eGLImage *eglImage, int fd); + void destroyDMABufTexture(eGLImage *eglImage); + void createTexture2D(eGLImage *eglImage, GLint format, uint32_t width, uint32_t height, void *data); + void createTexture1D(eGLImage *eglImage, GLint format, uint32_t width, void *data); + + void pushEnv(std::vector &shaderEnv, const char *str); + void makeCurrent(); + void swapBuffers(); + + int compileVertexShader(GLuint &shaderId, unsigned char *shaderData, + unsigned int shaderDataLen, + std::vector shaderEnv); + int compileFragmentShader(GLuint &shaderId, unsigned char *shaderData, + unsigned int shaderDataLen, + std::vector shaderEnv); + int linkProgram(GLuint &programIdd, GLuint fragmentshaderId, GLuint vertexshaderId); + void dumpShaderSource(GLuint shaderId); + void useProgram(GLuint programId); + int syncOutput(); + +private: + int fd_; + + EGLDisplay display_; + EGLContext context_; + EGLSurface surface_; + EGLSyncKHR sync_; + + int compileShader(int shaderType, GLuint &shaderId, unsigned char *shaderData, + unsigned int shaderDataLen, + std::vector shaderEnv); + + int createDMABufTexture2D(eGLImage *eglImage, int fd, bool output); + + PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImageMESA; + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; + + PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR; + + PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; + PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; + PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; +}; +} //namespace libcamera diff --git a/src/libcamera/egl.cpp b/src/libcamera/egl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b56c65a33837bb31a3e19613f4abb52d77880301 --- /dev/null +++ b/src/libcamera/egl.cpp @@ -0,0 +1,408 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Linaro Ltd. + * + * Authors: + * Bryan O'Donoghue + * + * egl.cpp - Helper class for managing eGL interactions. + */ + +#include "libcamera/internal/egl.h" + +#include +#include +#include +#include + +#include +#include +#include + +namespace libcamera { + +LOG_DEFINE_CATEGORY(eGL) + +eGL::eGL() +{ +} + +eGL::~eGL() +{ +} + +int eGL::syncOutput(void) +{ + glFlush(); + eglClientWaitSyncKHR(display_, sync_, 0, EGL_FOREVER_KHR); + + return 0; +} + +// Create linear image attached to previous BO object +int eGL::createDMABufTexture2D(eGLImage *eglImage, int fd, bool output) +{ + int ret = 0; + + EGLint image_attrs[] = { + EGL_WIDTH, (EGLint)eglImage->width_, + EGL_HEIGHT, (EGLint)eglImage->height_, + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888, + EGL_DMA_BUF_PLANE0_FD_EXT, fd, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, + EGL_DMA_BUF_PLANE0_PITCH_EXT, (EGLint)eglImage->stride_, + EGL_NONE, EGL_NONE, /* modifier lo */ + EGL_NONE, EGL_NONE, /* modifier hi */ + EGL_NONE, + }; + + eglImage->image_ = eglCreateImageKHR(display_, EGL_NO_CONTEXT, + EGL_LINUX_DMA_BUF_EXT, + NULL, image_attrs); + + if (eglImage->image_ == EGL_NO_IMAGE_KHR) { + LOG(eGL, Error) << "eglCreateImageKHR fail"; + ret = -ENODEV; + goto done; + } + + // Bind texture unit and texture + glActiveTexture(eglImage->texture_unit_); + glBindTexture(GL_TEXTURE_2D, eglImage->texture_); + + // Generate texture with filter semantics + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage->image_); + + // Nearest filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Wrap to edge to avoid edge artifacts + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + if (output) { + // Generate a framebuffer from our texture direct to dma-buf handle buffer + glBindFramebuffer(GL_FRAMEBUFFER, eglImage->fbo_); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, eglImage->texture_, 0); + + GLenum err = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (err!= GL_FRAMEBUFFER_COMPLETE) { + LOG(eGL, Error) << "glFrameBufferTexture2D error " << err; + ret = -ENODEV; + goto done; + } + } +done: + return ret; +} + +int eGL::createInputDMABufTexture2D(eGLImage *eglImage, int fd) +{ + return createDMABufTexture2D(eglImage, fd, false); +} +int eGL::createOutputDMABufTexture2D(eGLImage *eglImage, int fd) +{ + return createDMABufTexture2D(eglImage, fd, true); +} + +void eGL::destroyDMABufTexture(eGLImage *eglImage) +{ + eglDestroyImage(display_, eglImage->image_); +} + +// Generate a 2D texture from an input buffer directly +void eGL::createTexture2D(eGLImage *eglImage, GLint format, uint32_t width, uint32_t height, void *data) +{ + glActiveTexture(eglImage->texture_unit_); + glBindTexture(GL_TEXTURE_2D, eglImage->texture_); + + // Generate texture, bind, associate image to texture, configure, unbind + glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data); + + // Nearest filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Wrap to edge to avoid edge artifacts + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +} + +int eGL::initEGLContext(GBM *gbmContext) +{ + EGLint configAttribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NONE + }; + + EGLint contextAttribs[] = { + EGL_CONTEXT_MAJOR_VERSION, 2, + EGL_NONE + }; + + EGLint numConfigs; + EGLConfig config; + EGLint major; + EGLint minor; + + if (!eglBindAPI(EGL_OPENGL_ES_API)) { + LOG(eGL, Error) << "API bind fail"; + goto fail; + } + + display_ = eglGetDisplay(gbmContext->getDevice()); + if (display_ == EGL_NO_DISPLAY) { + LOG(eGL, Error) << "Unable to get EGL display"; + goto fail; + } + + if (eglInitialize(display_, &major, &minor) != EGL_TRUE) { + LOG(eGL, Error) << "eglInitialize fail"; + goto fail; + } + + LOG(eGL, Info) << "EGL: version " << major << "." << minor; + LOG(eGL, Info) << "EGL: EGL_VERSION: " << eglQueryString(display_, EGL_VERSION); + LOG(eGL, Info) << "EGL: EGL_VENDOR: " << eglQueryString(display_, EGL_VENDOR); + LOG(eGL, Info) << "EGL: EGL_CLIENT_APIS: " << eglQueryString(display_, EGL_CLIENT_APIS); + LOG(eGL, Info) << "EGL: EGL_EXTENSIONS: " << eglQueryString(display_, EGL_EXTENSIONS); + + eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR"); + if (!eglCreateImageKHR) { + LOG(eGL, Error) << "eglCreateImageKHR not found"; + goto fail; + } + + eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)eglGetProcAddress("eglDestroyImageKHR"); + if (!eglDestroyImageKHR) { + LOG(eGL, Error) << "eglDestroyImageKHR not found"; + goto fail; + } + + glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES"); + if (!glEGLImageTargetTexture2DOES) { + LOG(eGL, Error) << "glEGLImageTargetTexture2DOES not found"; + goto fail; + } + + eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)eglGetProcAddress("eglCreateSyncKHR"); + if (!eglCreateSyncKHR) { + LOG(eGL, Error) << "eglCreateSyncKHR not found"; + goto fail; + } + + eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)eglGetProcAddress("eglDestroySyncKHR"); + if (!eglDestroySyncKHR) { + LOG(eGL, Error) << "eglDestroySyncKHR not found"; + goto fail; + } + + eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)eglGetProcAddress("eglClientWaitSyncKHR"); + if (!eglClientWaitSyncKHR) { + LOG(eGL, Error) << "eglClientWaitSyncKHR not found"; + goto fail; + } + + if (eglChooseConfig(display_, configAttribs, &config, 1, &numConfigs) != EGL_TRUE) { + LOG(eGL, Error) << "eglChooseConfig fail"; + goto fail; + } + + context_ = eglCreateContext(display_, config, EGL_NO_CONTEXT, contextAttribs); + if (context_ == EGL_NO_CONTEXT) { + LOG(eGL, Error) << "eglContext returned EGL_NO_CONTEXT"; + goto fail; + } + + makeCurrent(); + + sync_ = eglCreateSyncKHR(display_, EGL_SYNC_FENCE_KHR, NULL); + if (sync_ == EGL_NO_SYNC_KHR) { + LOG(eGL, Error) << "eglCreateSyncKHR fail"; + goto fail; + } + + return 0; +fail: + + return -ENODEV; +} + +void eGL::cleanUp(void) +{ + if (sync_) { + makeCurrent(); + eglDestroySyncKHR(display_, sync_); + } + +} +void eGL::makeCurrent(void) +{ + if (eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, context_) != EGL_TRUE) { + LOG(eGL, Error) << "eglMakeCurrent fail"; + } +} + +void eGL::swapBuffers(void) +{ + if (eglSwapBuffers(display_, surface_) != EGL_TRUE) { + LOG(eGL, Error) << "eglSwapBuffers fail"; + } +} + +void eGL::useProgram(GLuint programId) +{ + glUseProgram(programId); +} + +void eGL::pushEnv(std::vector &shaderEnv, const char *str) +{ + std::string addStr = str; + + addStr.push_back('\n'); + shaderEnv.push_back(addStr); +} + +int eGL::compileVertexShader(GLuint &shaderId, unsigned char *shaderData, + unsigned int shaderDataLen, + std::vector shaderEnv) +{ + return compileShader(GL_VERTEX_SHADER, shaderId, shaderData, shaderDataLen, shaderEnv); +} + +int eGL::compileFragmentShader(GLuint &shaderId, unsigned char *shaderData, + unsigned int shaderDataLen, + std::vector shaderEnv) +{ + return compileShader(GL_FRAGMENT_SHADER, shaderId, shaderData, shaderDataLen, shaderEnv); +} + +int eGL::compileShader(int shaderType, GLuint &shaderId, unsigned char *shaderData, + unsigned int shaderDataLen, + std::vector shaderEnv) +{ + GLchar **shaderSourceData; + GLint *shaderDataLengths; + GLint success; + GLsizei count; + size_t i; + + count = 1 + shaderEnv.size(); + shaderSourceData = new GLchar *[count]; + shaderDataLengths = new GLint[count]; + + // Prefix defines before main body of shader + for (i = 0; i < shaderEnv.size(); i++) { + shaderSourceData[i] = (GLchar *)shaderEnv[i].c_str(); + shaderDataLengths[i] = shaderEnv[i].length(); + } + + // Now the main body of the shader program + shaderSourceData[i] = (GLchar *)shaderData; + shaderDataLengths[i] = shaderDataLen; + + // And create the shader + shaderId = glCreateShader(shaderType); + glShaderSource(shaderId, count, shaderSourceData, shaderDataLengths); + glCompileShader(shaderId); + + // Check status + glGetShaderiv(shaderId, GL_COMPILE_STATUS, &success); + if (success == GL_FALSE) { + GLint sizeLog = 0; + GLchar *infoLog; + + glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &sizeLog); + infoLog = new GLchar[sizeLog]; + + glGetShaderInfoLog(shaderId, sizeLog, &sizeLog, infoLog); + LOG(eGL, Error) << infoLog; + + delete[] infoLog; + } + + delete[] shaderSourceData; + delete[] shaderDataLengths; + + return !(success == GL_TRUE); +} + +void eGL::dumpShaderSource(GLuint shaderId) +{ + GLint shaderLength = 0; + GLchar *shaderSource; + + glGetShaderiv(shaderId, GL_SHADER_SOURCE_LENGTH, &shaderLength); + + LOG(eGL, Debug) << "Shader length is " << shaderLength; + + if (shaderLength > 0) { + shaderSource = new GLchar[shaderLength]; + if (!shaderSource) + return; + + glGetShaderSource(shaderId, shaderLength, &shaderLength, shaderSource); + if (shaderLength) { + LOG(eGL, Debug) << "Shader source = " << shaderSource; + } + delete[] shaderSource; + } +} + +int eGL::linkProgram(GLuint &programId, GLuint vertexshaderId, GLuint fragmentshaderId) +{ + GLint success; + GLenum err; + + programId = glCreateProgram(); + if (!programId) + goto fail; + + glAttachShader(programId, vertexshaderId); + if ((err = glGetError()) != GL_NO_ERROR) { + LOG(eGL, Error) << "Attach compute vertex shader fail"; + goto fail; + } + + glAttachShader(programId, fragmentshaderId); + if ((err = glGetError()) != GL_NO_ERROR) { + LOG(eGL, Error) << "Attach compute vertex shader fail"; + goto fail; + } + + glLinkProgram(programId); + if ((err = glGetError()) != GL_NO_ERROR) { + LOG(eGL, Error) << "Link program fail"; + goto fail; + } + + glDetachShader(programId, fragmentshaderId); + glDetachShader(programId, vertexshaderId); + + // Check status + glGetProgramiv(programId, GL_LINK_STATUS, &success); + if (success == GL_FALSE) { + GLint sizeLog = 0; + GLchar *infoLog; + + glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &sizeLog); + infoLog = new GLchar[sizeLog]; + + glGetProgramInfoLog(programId, sizeLog, &sizeLog, infoLog); + LOG(eGL, Error) << infoLog; + + delete[] infoLog; + goto fail; + } + + return 0; +fail: + return -ENODEV; +} +} // namespace libcamera diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build index 64270b571cea2ece8d4dfea8a23b8edf60de70d3..705c328a27f68377573916a77573335f4f4ab3cc 100644 --- a/src/libcamera/meson.build +++ b/src/libcamera/meson.build @@ -78,6 +78,27 @@ if libgbm.found() and gbm_works ]) endif +libegl = cc.find_library('EGL', required : false) +libglesv2 = cc.find_library('GLESv2', required : false) +mesa_works = cc.check_header('EGL/egl.h', required: false) + +if libegl.found() and mesa_works + config_h.set('HAVE_LIBEGL', 1) +endif + +if libglesv2.found() and mesa_works + config_h.set('HAVE_GLESV2', 1) +endif + +if mesa_works and gbm_works + libcamera_internal_sources += files([ + 'egl.cpp', + ]) + gles_headless_enabled = true +else + gles_headless_enabled = false +endif + subdir('base') subdir('converter') subdir('ipa') @@ -191,7 +212,9 @@ libcamera_deps += [ libcamera_base_private, libcrypto, libdl, + libegl, libgbm, + libglesv2, liblttng, libudev, libyaml, From patchwork Sun Aug 24 00:48:37 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: 24208 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 19FF2C32BB for ; Sun, 24 Aug 2025 00:49:31 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1C0D469339; Sun, 24 Aug 2025 02:49:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="yBkfeQEi"; dkim-atps=neutral Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8F8536930F for ; Sun, 24 Aug 2025 02:48:59 +0200 (CEST) Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-3c7edd71bbfso547075f8f.0 for ; Sat, 23 Aug 2025 17:48:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996539; x=1756601339; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=t9vXapvsy/aieSpsXa2lB7hTzFv1Zbak3dwBGSyv9Hc=; b=yBkfeQEi0lzcYtZle093tBOeIc7kIFA3SUBcfyNr8frLZyXUwhkWRlvZnnwVdOOqFV QAoUdbRUb5DfpWtem2ZKznRxSHknBgmLcp85DIYkLqrt/EN+MiVeEWbFzW2WjdrAuLw6 ELuUdg1Nc6pWRbVMHjnvNb7LXiqLSxIhGJBSjI6lKPwO8orQIcXiYzi4YC6Efg/1ZRO3 0GL+fpKfevzrdrHsX+nXODjXsF/CZwN2Pk5FRpO++Ju57MqFXxpQQkUjXTD9z6ZC5XQo MuX1RgWc8zEyVjSE4rMZP8wPjAbTA2XlVoINd7MMDkMshh2b/X0/pUOQKEkkAFnh1a7p aT5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996539; x=1756601339; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=t9vXapvsy/aieSpsXa2lB7hTzFv1Zbak3dwBGSyv9Hc=; b=XLiRRCdgmWzV/rpAGheFwQzD21X3+/RA0JH3ctofpe8kU3R8L6wry88/t7yOV31y9A jP+j6MwnZeyzJ4/hCrqd5pDeML3VwlW0EV/NLNhiChjoTgLZC9ZpbTKAMr8zDmK3wtVp LoR1T4eO2b21EpsMAXMb+seRbT2RNZl/jWGKElaEqSScO+eiz0WRjq3kL+5YTCYnyNb8 1vCXtAVA2Xig0UsSmbXMZ5qlBETwv3vyuitLAVZxbVvCWe/2L+9xXIdJ2Ck8+HAYcwN7 ybu/M53HiF+y4/GPR/GB1L99BLbwcph0J3V4VTyLwJ7UH0URjBoO5JcV0FsZhVd5XdAM yxkg== X-Gm-Message-State: AOJu0YxR4xd7t0BQyQjs6bAcTyZQBVhCdN3DPxgHrLWgSIUD2drUh6Ju QzCKM8IKq25eOEdBeUyVkIpv9swiznfnpZOFR7E9I4FkyQ3ZNMEdXrVWLr10KzwJZxFMu0gFAGt PKqCjtbk= X-Gm-Gg: ASbGncsWb/ZCL34uuWdKACDD26AuAO4jkkRBsfuKXzdUdKujFj87OagM0Fa/Au0XnGb +VmHUf/FESR0Y8me+HGg7eHkYULB5ZavQUEsuuq0FBu1K9kORUjOFJtzHD3fs5oCP3qjWfZXO40 AZ1kvQNKJw2Xv5iLgMyxpBbd1Dr7mVyRt5D4nNaiCORBlXAJYHz8atVjpVWBVf/k0uPlLmfxrzp 9sBPRqpHKiXk2BfvMPZiNm0oVe9qGtGngWWxSnv3XA5ysowpbU7uTRBqkSRyh97Y1arjSEPTHnZ GwxLNOwxKL6trPXUAe/OKvnw3vxdBV0jpEzAH6/NBgGFqoQBLWaLuUVoX/0t+CVTXPEDrvoNUXG p/S2JGS0oKIsun194Ksylq/DAkVC4/1wX4aJIH5bc6D2T8pxQScrQLZfw54Lsjd2y4lNMZqRX0b UxpAsiTxkbTbk2FEwrthD5 X-Google-Smtp-Source: AGHT+IEQr05h2YPQUq7CzP0l9JYvkPgQHSSt+e+1mnVHy765diK3oFQFFW/kC4GYVvJBv8uxHauZ0A== X-Received: by 2002:a5d:5d0b:0:b0:3b8:ffd3:7a7a with SMTP id ffacd0b85a97d-3c5dae0637bmr6108964f8f.16.1755996538666; Sat, 23 Aug 2025 17:48:58 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:58 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:37 +0100 Subject: [PATCH v2 25/37] libcamera: software_isp: debayer_egl: Add an eGL debayer class MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-25-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=28865; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=YAEyHRAsNLsDQUl7AYEftLzp54eUI2P7DDuCceXq9NQ=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFgJOMN/sPcLGPCDIXs68A7ypsy9C0MVlAm9 3U3YtyooqeJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYAAKCRAicTuzoY3I OjBRD/4+b7sCKs9+yHe8fEUoDnaCGnkVrZCudwGlEcUABS80KWMbbfTPX4/qTZPO+5P0LGDLVnz aQcUhnRF9GEh/0vE7L3uBcTGGsb12SmTHoz6N0Y5VBmw97u/CZ3ioW3idlHNb/GnUqGsT86NYeb JXypVzJ2Kh2MYIXPkDfcWbai8d/RWCuFlHnNvyFCq1rsmkeOAchYxZI0lTU+wQbe9etOhwEuxO8 BcLp3JOhTtbdjKvEWVsUI52QmEwEYAU/5SbtlJvPNGQTk7UU2RPKgJkP3txqRa0mY/EN7huSpfO YBU9mhMvEvDStoH7KHuIxJmzf2tFVKbjOpPC9lNDjdXGAHMjINR4/8GlpuhjSxKww2QkaYUp7Y0 UMj7bHy9DBQZFB3PRJ5TN7JCNCcCs/3lWelORkpnAA2RhU2IQukjmLgbLHHNtHGFRXvq1/dD/I8 7+OcXYsXiKhvT2yPcTmBqdyA3rabn8iEeShVRge2LUvDR+STHvYgqOina53J4BgdF0qp/EF0ajn lqzd0y0H9n48ryNUOLZkxU+M7CWh1YYCFOj3iSAoc8uijaxpNd4ggCbhqEa/5dErXBYl5pyGB3y N+Jnj7nDXH2IxIb+nrseCvfi8eV/1vPis5GFdZBXlTHta0Jma7v8fMFoUElLmjryAjPmzDuwvAl gJ9h9yI0ruVW0sQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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 a class to run the existing glsl debayer shaders on a GBM surface. Signed-off-by: Bryan O'Donoghue libcamera: software_isp: debayer_egl: Extend logic to enable application of softISP RGB debayer params The existing SoftISP calculates RGB gain values as a lookup table of 256 values which shifts for each frame depending on the required correction. We can pass the required tables into the debayer shaders as textures, one texture for R, G and B respectively. The debayer shader will do its debayer interpolation and then if the appropriate define is specified use the calculated R, G and B values as indexes into our bayer colour gain table. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer_egl.cpp | 628 +++++++++++++++++++++++++++++ src/libcamera/software_isp/debayer_egl.h | 171 ++++++++ src/libcamera/software_isp/meson.build | 8 + 3 files changed, 807 insertions(+) diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3932044a231ad8348f011369396556c5ad230ff6 --- /dev/null +++ b/src/libcamera/software_isp/debayer_egl.cpp @@ -0,0 +1,628 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Linaro Ltd. + * + * Authors: + * Bryan O'Donoghue + * + * debayer_cpu.cpp - EGL based debayering class + */ + +#include +#include +#include + +#include + +#include "libcamera/internal/glsl_shaders.h" +#include "debayer_egl.h" + +namespace libcamera { + +DebayerEGL::DebayerEGL(std::unique_ptr stats) + : Debayer(), stats_(std::move(stats)) +{ + eglImageBayerIn_ = eglImageBayerOut_= eglImageRedLookup_ = eglImageBlueLookup_ = eglImageGreenLookup_ = NULL; +} + +DebayerEGL::~DebayerEGL() +{ + if (eglImageBlueLookup_) + delete eglImageBlueLookup_; + + if (eglImageGreenLookup_) + delete eglImageGreenLookup_; + + if (eglImageRedLookup_) + delete eglImageRedLookup_; + + if (eglImageBayerOut_) + delete eglImageBayerOut_; + + if (eglImageBayerIn_) + delete eglImageBayerIn_; +} + +int DebayerEGL::getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config) +{ + BayerFormat bayerFormat = + BayerFormat::fromPixelFormat(inputFormat); + + if ((bayerFormat.bitDepth == 8 || bayerFormat.bitDepth == 10) && + bayerFormat.packing == BayerFormat::Packing::None && + isStandardBayerOrder(bayerFormat.order)) { + config.bpp = (bayerFormat.bitDepth + 7) & ~7; + config.patternSize.width = 2; + config.patternSize.height = 2; + config.outputFormats = std::vector({ formats::XRGB8888, + formats::ARGB8888, + formats::XBGR8888, + formats::ABGR8888 }); + return 0; + } + + if (bayerFormat.bitDepth == 10 && + bayerFormat.packing == BayerFormat::Packing::CSI2 && + isStandardBayerOrder(bayerFormat.order)) { + config.bpp = 10; + config.patternSize.width = 4; /* 5 bytes per *4* pixels */ + config.patternSize.height = 2; + config.outputFormats = std::vector({ formats::XRGB8888, + formats::ARGB8888, + formats::XBGR8888, + formats::ABGR8888 }); + return 0; + } + + LOG(Debayer, Error) + << "Unsupported input format " << inputFormat.toString(); + + return -EINVAL; +} + +int DebayerEGL::getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config) +{ + if (outputFormat == formats::XRGB8888 || outputFormat == formats::ARGB8888 || + outputFormat == formats::XBGR8888 || outputFormat == formats::ABGR8888) { + config.bpp = 32; + return 0; + } + + LOG(Debayer, Error) + << "Unsupported output format " << outputFormat.toString(); + + return -EINVAL; +} + +int DebayerEGL::getShaderVariableLocations(void) +{ + attributeVertex_ = glGetAttribLocation(programId_, "vertexIn"); + attributeTexture_ = glGetAttribLocation(programId_, "textureIn"); + + textureUniformBayerDataIn_ = glGetUniformLocation(programId_, "tex_y"); + textureUniformRedLookupDataIn_ = glGetUniformLocation(programId_, "red_param"); + textureUniformGreenLookupDataIn_ = glGetUniformLocation(programId_, "green_param"); + textureUniformBlueLookupDataIn_ = glGetUniformLocation(programId_, "blue_param"); + ccmUniformDataIn_ = glGetUniformLocation(programId_, "ccm"); + + textureUniformStep_ = glGetUniformLocation(programId_, "tex_step"); + textureUniformSize_ = glGetUniformLocation(programId_, "tex_size"); + textureUniformStrideFactor_ = glGetUniformLocation(programId_, "stride_factor"); + textureUniformBayerFirstRed_ = glGetUniformLocation(programId_, "tex_bayer_first_red"); + textureUniformProjMatrix_ = glGetUniformLocation(programId_, "proj_matrix"); + + LOG(Debayer, Debug) << "vertexIn " << attributeVertex_ << " textureIn " << attributeTexture_ + << " tex_y " << textureUniformBayerDataIn_ + << " red_param " << textureUniformRedLookupDataIn_ + << " green_param " << textureUniformGreenLookupDataIn_ + << " blue_param " << textureUniformBlueLookupDataIn_ + << " ccm " << ccmUniformDataIn_ + << " tex_step " << textureUniformStep_ + << " tex_size " << textureUniformSize_ + << " stride_factor " << textureUniformStrideFactor_ + << " tex_bayer_first_red " << textureUniformBayerFirstRed_ + << " proj_matrix " << textureUniformProjMatrix_; + return 0; +} + +int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputFormat) +{ + std::vector shaderEnv; + unsigned int fragmentShaderDataLen; + unsigned char *fragmentShaderData; + unsigned int vertexShaderDataLen; + unsigned char *vertexShaderData; + GLenum err; + + // Target gles 100 glsl requires "#version x" as first directive in shader + egl_.pushEnv(shaderEnv, "#version 100"); + + // Specify GL_OES_EGL_image_external + egl_.pushEnv(shaderEnv, "#extension GL_OES_EGL_image_external: enable"); + + // Tell shaders how to re-order output taking account of how the + // pixels are actually stored by GBM + switch (outputFormat) { + case formats::ARGB8888: + case formats::XRGB8888: + break; + case formats::ABGR8888: + case formats::XBGR8888: + egl_.pushEnv(shaderEnv, "#define SWAP_BLUE"); + break; + default: + goto invalid_fmt; + } + + // Pixel location parameters + glFormat_ = GL_LUMINANCE; + bytesPerPixel_ = 1; + switch (inputFormat) { + case libcamera::formats::SBGGR8: + case libcamera::formats::SBGGR10_CSI2P: + case libcamera::formats::SBGGR12_CSI2P: + firstRed_x_ = 1.0; + firstRed_y_ = 1.0; + break; + case libcamera::formats::SGBRG8: + case libcamera::formats::SGBRG10_CSI2P: + case libcamera::formats::SGBRG12_CSI2P: + firstRed_x_ = 0.0; + firstRed_y_ = 1.0; + break; + case libcamera::formats::SGRBG8: + case libcamera::formats::SGRBG10_CSI2P: + case libcamera::formats::SGRBG12_CSI2P: + firstRed_x_ = 1.0; + firstRed_y_ = 0.0; + break; + case libcamera::formats::SRGGB8: + case libcamera::formats::SRGGB10_CSI2P: + case libcamera::formats::SRGGB12_CSI2P: + firstRed_x_ = 0.0; + firstRed_y_ = 0.0; + break; + default: + goto invalid_fmt; + break; + }; + + // Shader selection + switch (inputFormat) { + case libcamera::formats::SBGGR8: + case libcamera::formats::SGBRG8: + case libcamera::formats::SGRBG8: + case libcamera::formats::SRGGB8: + fragmentShaderData = bayer_unpacked_frag; + fragmentShaderDataLen = bayer_unpacked_frag_len; + vertexShaderData = bayer_unpacked_vert; + vertexShaderDataLen = bayer_unpacked_vert_len; + break; + case libcamera::formats::SBGGR10_CSI2P: + case libcamera::formats::SGBRG10_CSI2P: + case libcamera::formats::SGRBG10_CSI2P: + case libcamera::formats::SRGGB10_CSI2P: + egl_.pushEnv(shaderEnv, "#define RAW10P"); + if (BayerFormat::fromPixelFormat(inputFormat).packing == BayerFormat::Packing::None) { + fragmentShaderData = bayer_unpacked_frag; + fragmentShaderDataLen = bayer_unpacked_frag_len; + vertexShaderData = bayer_unpacked_vert; + vertexShaderDataLen = bayer_unpacked_vert_len; + glFormat_ = GL_RG; + bytesPerPixel_ = 2; + } else { + fragmentShaderData = bayer_1x_packed_frag; + fragmentShaderDataLen = bayer_1x_packed_frag_len; + vertexShaderData = identity_vert; + vertexShaderDataLen = identity_vert_len; + } + break; + case libcamera::formats::SBGGR12_CSI2P: + case libcamera::formats::SGBRG12_CSI2P: + case libcamera::formats::SGRBG12_CSI2P: + case libcamera::formats::SRGGB12_CSI2P: + egl_.pushEnv(shaderEnv, "#define RAW12P"); + if (BayerFormat::fromPixelFormat(inputFormat).packing == BayerFormat::Packing::None) { + fragmentShaderData = bayer_unpacked_frag; + fragmentShaderDataLen = bayer_unpacked_frag_len; + vertexShaderData = bayer_unpacked_vert; + vertexShaderDataLen = bayer_unpacked_vert_len; + glFormat_ = GL_RG; + bytesPerPixel_ = 2; + } else { + fragmentShaderData = bayer_1x_packed_frag; + fragmentShaderDataLen = bayer_1x_packed_frag_len; + vertexShaderData = identity_vert; + vertexShaderDataLen = identity_vert_len; + } + break; + default: + goto invalid_fmt; + break; + }; + + if (ccmEnabled_) { + // Run the CCM if available + egl_.pushEnv(shaderEnv, "#define APPLY_CCM_PARAMETERS"); + } else { + // Flag to shaders that we have parameter gain tables + egl_.pushEnv(shaderEnv, "#define APPLY_RGB_PARAMETERS"); + } + + if (egl_.compileVertexShader(vertexShaderId_, vertexShaderData, vertexShaderDataLen, shaderEnv)) + goto compile_fail; + + if (egl_.compileFragmentShader(fragmentShaderId_, fragmentShaderData, fragmentShaderDataLen, shaderEnv)) + goto compile_fail; + + if (egl_.linkProgram(programId_, vertexShaderId_, fragmentShaderId_)) + goto link_fail; + + egl_.dumpShaderSource(vertexShaderId_); + egl_.dumpShaderSource(fragmentShaderId_); + + /* Ensure we set the programId_ */ + egl_.useProgram(programId_); + err = glGetError(); + if (err != GL_NO_ERROR) + goto program_fail; + + if (getShaderVariableLocations()) + goto parameters_fail; + + return 0; + +parameters_fail: + LOG(Debayer, Error) << "Program parameters fail"; + return -ENODEV; + +program_fail: + LOG(Debayer, Error) << "Use program error " << err; + return -ENODEV; + +link_fail: + LOG(Debayer, Error) << "Linking program fail"; + return -ENODEV; + +compile_fail: + LOG(Debayer, Error) << "Compile debayer shaders fail"; + return -ENODEV; + +invalid_fmt: + LOG(Debayer, Error) << "Unsupported input output format combination"; + return -EINVAL; +} + +int DebayerEGL::configure(const StreamConfiguration &inputCfg, + const std::vector> &outputCfgs, + bool ccmEnabled) +{ + GLint maxTextureImageUnits; + + if (getInputConfig(inputCfg.pixelFormat, inputConfig_) != 0) + return -EINVAL; + + if (stats_->configure(inputCfg) != 0) + return -EINVAL; + + const Size &stats_pattern_size = stats_->patternSize(); + if (inputConfig_.patternSize.width != stats_pattern_size.width || + inputConfig_.patternSize.height != stats_pattern_size.height) { + LOG(Debayer, Error) + << "mismatching stats and debayer pattern sizes for " + << inputCfg.pixelFormat.toString(); + return -EINVAL; + } + + inputConfig_.stride = inputCfg.stride; + width_ = inputCfg.size.width; + height_ = inputCfg.size.height; + ccmEnabled_ = ccmEnabled; + + if (outputCfgs.size() != 1) { + LOG(Debayer, Error) + << "Unsupported number of output streams: " + << outputCfgs.size(); + return -EINVAL; + } + + if (gbmSurface_.createDevice()) + return -ENODEV; + + if (egl_.initEGLContext(&gbmSurface_)) + return -ENODEV; + + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits); + + LOG(Debayer, Debug) << "Available fragment shader texture units " << maxTextureImageUnits; + + if (!ccmEnabled && maxTextureImageUnits < DEBAYER_EGL_MIN_SIMPLE_RGB_GAIN_TEXTURE_UNITS) { + LOG(Debayer, Error) << "Fragment shader texture unit count " << maxTextureImageUnits + << " required minimum for RGB gain table lookup " << DEBAYER_EGL_MIN_SIMPLE_RGB_GAIN_TEXTURE_UNITS + << " try using an identity CCM "; + return -ENODEV; + } + + StreamConfiguration &outputCfg = outputCfgs[0]; + SizeRange outSizeRange = sizes(inputCfg.pixelFormat, inputCfg.size); + std::tie(outputConfig_.stride, outputConfig_.frameSize) = + strideAndFrameSize(outputCfg.pixelFormat, outputCfg.size); + + if (!outSizeRange.contains(outputCfg.size) || outputConfig_.stride != outputCfg.stride) { + LOG(Debayer, Error) + << "Invalid output size/stride: " + << "\n " << outputCfg.size << " (" << outSizeRange << ")" + << "\n " << outputCfg.stride << " (" << outputConfig_.stride << ")"; + return -EINVAL; + } + + window_.x = ((inputCfg.size.width - outputCfg.size.width) / 2) & + ~(inputConfig_.patternSize.width - 1); + window_.y = ((inputCfg.size.height - outputCfg.size.height) / 2) & + ~(inputConfig_.patternSize.height - 1); + window_.width = outputCfg.size.width; + window_.height = outputCfg.size.height; + + /* + * Don't pass x,y from window_ since process() already adjusts for it. + * But crop the window to 2/3 of its width and height for speedup. + */ + stats_->setWindow((window_.size() * 2 / 3).centeredTo(window_.center())); + + // Raw bayer input as texture + eglImageBayerIn_ = new eGLImage(width_, height_, 32, GL_TEXTURE0, 0); + if (!eglImageBayerIn_) + return -ENOMEM; + + // Only do the RGB lookup table textures if CCM is disabled + if (!ccmEnabled_) { + + /// RGB correction tables as 2d textures + // eGL doesn't support glTexImage1D so we do a little hack with 2D to compensate + eglImageRedLookup_ = new eGLImage(DebayerParams::kRGBLookupSize, 1, 32, GL_TEXTURE1, 1); + if (!eglImageRedLookup_) + return -ENOMEM; + + eglImageGreenLookup_ = new eGLImage(DebayerParams::kRGBLookupSize, 1, 32, GL_TEXTURE2, 2); + if (!eglImageGreenLookup_) + return -ENOMEM; + + eglImageBlueLookup_ = new eGLImage(DebayerParams::kRGBLookupSize, 1, 32, GL_TEXTURE3, 3); + if (!eglImageBlueLookup_) + return -ENOMEM; + } + + eglImageBayerOut_ = new eGLImage(outputCfg.size.width, outputCfg.size.height, 32, outputCfg.stride, GL_TEXTURE4, 4); + if (!eglImageBayerOut_) + return -ENOMEM; + + if (initBayerShaders(inputCfg.pixelFormat, outputCfg.pixelFormat)) + return -EINVAL; + + return 0; +} + +Size DebayerEGL::patternSize(PixelFormat inputFormat) +{ + DebayerEGL::DebayerInputConfig config; + + if (getInputConfig(inputFormat, config) != 0) + return {}; + + return config.patternSize; +} + +std::vector DebayerEGL::formats(PixelFormat inputFormat) +{ + DebayerEGL::DebayerInputConfig config; + + if (getInputConfig(inputFormat, config) != 0) + return std::vector(); + + return config.outputFormats; +} + +std::tuple +DebayerEGL::strideAndFrameSize(const PixelFormat &outputFormat, const Size &size) +{ + DebayerEGL::DebayerOutputConfig config; + + if (getOutputConfig(outputFormat, config) != 0) + return std::make_tuple(0, 0); + + /* Align stride to 256 bytes as a generic GPU memory access alignment */ + unsigned int stride = ALIGN_TO(size.width * config.bpp / 8, 256); + + return std::make_tuple(stride, stride * size.height); +} + +void DebayerEGL::setShaderVariableValues(void) +{ + /* + * Raw Bayer 8-bit, and packed raw Bayer 10-bit/12-bit formats + * are stored in a GL_LUMINANCE texture. The texture width is + * equal to the stride. + */ + GLfloat firstRed[] = { firstRed_x_, firstRed_y_ }; + GLfloat imgSize[] = { (GLfloat)width_, + (GLfloat)height_ }; + GLfloat Step[] = { static_cast(bytesPerPixel_) / (inputConfig_.stride - 1), + 1.0f / (height_ - 1) }; + GLfloat Stride = 1.0f; + GLfloat projIdentityMatrix[] = { + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + }; + + // vertexIn - bayer_8.vert + glEnableVertexAttribArray(attributeVertex_); + glVertexAttribPointer(attributeVertex_, 2, GL_FLOAT, GL_TRUE, + 2 * sizeof(GLfloat), vcoordinates); + + // textureIn - bayer_8.vert + glEnableVertexAttribArray(attributeTexture_); + glVertexAttribPointer(attributeTexture_, 2, GL_FLOAT, GL_TRUE, + 2 * sizeof(GLfloat), tcoordinates); + + // Set the sampler2D to the respective texture unit for each texutre + // To simultaneously sample multiple textures we need to use multiple + // texture units + glUniform1i(textureUniformBayerDataIn_, eglImageBayerIn_->texture_unit_uniform_id_); + if (!ccmEnabled_) { + glUniform1i(textureUniformRedLookupDataIn_, eglImageRedLookup_->texture_unit_uniform_id_); + glUniform1i(textureUniformGreenLookupDataIn_, eglImageGreenLookup_->texture_unit_uniform_id_); + glUniform1i(textureUniformBlueLookupDataIn_, eglImageBlueLookup_->texture_unit_uniform_id_); + } + + // These values are: + // firstRed = tex_bayer_first_red - bayer_8.vert + // imgSize = tex_size - bayer_8.vert + // step = tex_step - bayer_8.vert + // Stride = stride_factor identity.vert + // textureUniformProjMatri = No scaling + glUniform2fv(textureUniformBayerFirstRed_, 1, firstRed); + glUniform2fv(textureUniformSize_, 1, imgSize); + glUniform2fv(textureUniformStep_, 1, Step); + glUniform1f(textureUniformStrideFactor_, Stride); + glUniformMatrix4fv(textureUniformProjMatrix_, 1, + GL_FALSE, projIdentityMatrix); + + LOG(Debayer, Debug) << "vertexIn " << attributeVertex_ << " textureIn " << attributeTexture_ + << " tex_y " << textureUniformBayerDataIn_ + << " red_param " << textureUniformRedLookupDataIn_ + << " green_param " << textureUniformGreenLookupDataIn_ + << " blue_param " << textureUniformBlueLookupDataIn_ + << " tex_step " << textureUniformStep_ + << " tex_size " << textureUniformSize_ + << " stride_factor " << textureUniformStrideFactor_ + << " tex_bayer_first_red " << textureUniformBayerFirstRed_; + + LOG (Debayer, Debug) << "textureUniformY_ = 0 " + << " firstRed.x " << firstRed[0] + << " firstRed.y " << firstRed[1] + << " textureUniformSize_.width " << imgSize[0] + << " textureUniformSize_.height " << imgSize[1] + << " textureUniformStep_.x " << Step[0] + << " textureUniformStep_.y " << Step[1] + << " textureUniformStrideFactor_ " << Stride + << " textureUniformProjMatrix_ " << textureUniformProjMatrix_; + return; +} + +void DebayerEGL::debayerGPU(MappedFrameBuffer &in, MappedFrameBuffer &out, DebayerParams ¶ms) +{ + /* eGL context switch */ + egl_.makeCurrent(); + + /* Greate a standard texture input */ + egl_.createTexture2D(eglImageBayerIn_, glFormat_, inputConfig_.stride / bytesPerPixel_, height_, in.planes()[0].data()); + + /* Generate the output render framebuffer as render to texture */ + egl_.createOutputDMABufTexture2D(eglImageBayerOut_, out.getPlaneFD(0)); + + /* Select the method we will use for bayer params CCM or params table */ + if (ccmEnabled_) { + GLfloat ccm[9] = { + params.ccm[0][0], params.ccm[0][1], params.ccm[0][2], + params.ccm[1][0], params.ccm[1][1], params.ccm[1][2], + params.ccm[2][0], params.ccm[2][1], params.ccm[2][2], + }; + glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm); + } else { + egl_.createTexture2D(eglImageRedLookup_, GL_LUMINANCE, DebayerParams::kRGBLookupSize, 1, ¶ms.red); + egl_.createTexture2D(eglImageGreenLookup_, GL_LUMINANCE, DebayerParams::kRGBLookupSize, 1, ¶ms.green); + egl_.createTexture2D(eglImageBlueLookup_, GL_LUMINANCE, DebayerParams::kRGBLookupSize, 1, ¶ms.blue); + } + + setShaderVariableValues(); + glViewport(0, 0, width_, height_); + glClear(GL_COLOR_BUFFER_BIT); + glDrawArrays(GL_TRIANGLE_FAN, 0, DEBAYER_OPENGL_COORDS); + + GLenum err = glGetError(); + if (err != GL_NO_ERROR) { + LOG(eGL, Error) << "Drawing scene fail " << err; + } else { + egl_.syncOutput(); + } + + /* Teardown the output texture */ + egl_.destroyDMABufTexture(eglImageBayerOut_); +} + +void DebayerEGL::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params) +{ + bench_.startFrame(); + + std::vector dmaSyncers; + + dmaSyncBegin(dmaSyncers, input, output); + + setParams(params); + + /* Copy metadata from the input buffer */ + FrameMetadata &metadata = output->_d()->metadata(); + metadata.status = input->metadata().status; + metadata.sequence = input->metadata().sequence; + metadata.timestamp = input->metadata().timestamp; + + MappedFrameBuffer in(input, MappedFrameBuffer::MapFlag::Read); + MappedFrameBuffer out(output, MappedFrameBuffer::MapFlag::Write); + if (!in.isValid() || !out.isValid()) { + LOG(Debayer, Error) << "mmap-ing buffer(s) failed"; + metadata.status = FrameMetadata::FrameError; + return; + } + + debayerGPU(in, out, params); + + dmaSyncers.clear(); + + bench_.finishFrame(); + + metadata.planes()[0].bytesused = out.planes()[0].size(); + + /* Calculate stats for the whole frame */ + stats_->processFrame(frame, 0, input); + + outputBufferReady.emit(output); + inputBufferReady.emit(input); +} + +void DebayerEGL::stop() +{ + egl_.cleanUp(); +} + +SizeRange DebayerEGL::sizes(PixelFormat inputFormat, const Size &inputSize) +{ + Size patternSize = this->patternSize(inputFormat); + unsigned int borderHeight = patternSize.height; + + if (patternSize.isNull()) + return {}; + + /* No need for top/bottom border with a pattern height of 2 */ + if (patternSize.height == 2) + borderHeight = 0; + + /* + * For debayer interpolation a border is kept around the entire image + * and the minimum output size is pattern-height x pattern-width. + */ + if (inputSize.width < (3 * patternSize.width) || + inputSize.height < (2 * borderHeight + patternSize.height)) { + LOG(Debayer, Warning) + << "Input format size too small: " << inputSize.toString(); + return {}; + } + + return SizeRange(Size(patternSize.width, patternSize.height), + Size((inputSize.width - 2 * patternSize.width) & ~(patternSize.width - 1), + (inputSize.height - 2 * borderHeight) & ~(patternSize.height - 1)), + patternSize.width, patternSize.height); +} + +} /* namespace libcamera */ diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h new file mode 100644 index 0000000000000000000000000000000000000000..ecb22fcb7f3a7d74c3a605a5351ea5871df24f5d --- /dev/null +++ b/src/libcamera/software_isp/debayer_egl.h @@ -0,0 +1,171 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2025, Bryan O'Donoghue. + * + * Authors: + * Bryan O'Donoghue + * + * debayer_opengl.h - EGL debayer header + */ + +#pragma once + +#include +#include +#include + +#define GL_GLEXT_PROTOTYPES +#define EGL_EGLEXT_PROTOTYPES +#include +#include +#include + +#include + +#include "debayer.h" + +#include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/egl.h" +#include "libcamera/internal/framebuffer.h" +#include "libcamera/internal/mapped_framebuffer.h" +#include "libcamera/internal/software_isp/benchmark.h" +#include "libcamera/internal/software_isp/swstats_cpu.h" + +namespace libcamera { + +#define DEBAYER_EGL_MIN_SIMPLE_RGB_GAIN_TEXTURE_UNITS 4 +#define DEBAYER_OPENGL_COORDS 4 + +/** + * \class DebayerEGL + * \brief Class for debayering using an EGL Shader + * + * Implements an EGL shader based debayering solution. + */ +class DebayerEGL : public Debayer +{ +public: + /** + * \brief Constructs a DebayerEGL object. + * \param[in] stats Pointer to the stats object to use. + */ + DebayerEGL(std::unique_ptr stats); + ~DebayerEGL(); + + /* + * Setup the Debayer object according to the passed in parameters. + * Return 0 on success, a negative errno value on failure + * (unsupported parameters). + */ + int configure(const StreamConfiguration &inputCfg, + const std::vector> &outputCfgs, + bool ccmEnabled); + + /* + * Get width and height at which the bayer-pattern repeats. + * Return pattern-size or an empty Size for an unsupported inputFormat. + */ + Size patternSize(PixelFormat inputFormat); + + std::vector formats(PixelFormat input); + std::tuple strideAndFrameSize(const PixelFormat &outputFormat, const Size &size); + + void process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params); + void stop(); + + /** + * \brief Get the file descriptor for the statistics. + * + * \return the file descriptor pointing to the statistics. + */ + const SharedFD &getStatsFD() { return stats_->getStatsFD(); } + + /** + * \brief Get the output frame size. + * + * \return The output frame size. + */ + unsigned int frameSize() { return outputConfig_.frameSize; } + + SizeRange sizes(PixelFormat inputFormat, const Size &inputSize); + +private: + static int getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config); + static int getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config); + int setupStandardBayerOrder(BayerFormat::Order order); + void pushEnv(std::vector &shaderEnv, const char *str); + int initBayerShaders(PixelFormat inputFormat, PixelFormat outputFormat); + int initEGLContext(); + int generateTextures(); + int compileShaderProgram(GLuint &shaderId, GLenum shaderType, + unsigned char *shaderData, int shaderDataLen, + std::vector shaderEnv); + int linkShaderProgram(void); + int getShaderVariableLocations(); + void setShaderVariableValues(void); + void configureTexture(GLuint &texture); + void debayerGPU(MappedFrameBuffer &in, MappedFrameBuffer &out, DebayerParams ¶ms); + + // Shader program identifiers + GLuint vertexShaderId_; + GLuint fragmentShaderId_; + GLuint programId_; + enum { + BAYER_INPUT_INDEX = 0, + BAYER_OUTPUT_INDEX, + BAYER_BUF_NUM, + }; + + // Pointer to object representing input texture + eGLImage *eglImageBayerIn_; + eGLImage *eglImageBayerOut_; + + eGLImage *eglImageRedLookup_; + eGLImage *eglImageGreenLookup_; + eGLImage *eglImageBlueLookup_; + + // Shader parameters + float firstRed_x_; + float firstRed_y_; + GLint attributeVertex_; + GLint attributeTexture_; + GLint textureUniformStep_; + GLint textureUniformSize_; + GLint textureUniformStrideFactor_; + GLint textureUniformBayerFirstRed_; + GLint textureUniformProjMatrix_; + + GLint textureUniformBayerDataIn_; + + // These textures will either point to simple RGB gains or to CCM lookup tables + GLint textureUniformRedLookupDataIn_; + GLint textureUniformGreenLookupDataIn_; + GLint textureUniformBlueLookupDataIn_; + + // Represent per-frame CCM as a uniform vector of floats 3 x 3 + GLint ccmUniformDataIn_; + bool ccmEnabled_; + + Rectangle window_; + std::unique_ptr stats_; + eGL egl_; + GBM gbmSurface_; + uint32_t width_; + uint32_t height_; + GLint glFormat_; + unsigned int bytesPerPixel_; + GLfloat vcoordinates[DEBAYER_OPENGL_COORDS][2] = { + { -1.0f, -1.0f }, + { -1.0f, +1.0f }, + { +1.0f, +1.0f }, + { +1.0f, -1.0f }, + }; + GLfloat tcoordinates[DEBAYER_OPENGL_COORDS][2] = { + { 0.0f, 0.0f }, + { 0.0f, 1.0f }, + { 1.0f, 1.0f }, + { 1.0f, 0.0f }, + }; +}; + +} /* namespace libcamera */ diff --git a/src/libcamera/software_isp/meson.build b/src/libcamera/software_isp/meson.build index 59fa5f02a0a5620fa524d8a171332f04e0f769b2..c61ac7d59d37c5ef49ac67fe74cbcda3d89c30cb 100644 --- a/src/libcamera/software_isp/meson.build +++ b/src/libcamera/software_isp/meson.build @@ -2,6 +2,7 @@ softisp_enabled = pipelines.contains('simple') summary({'SoftISP support' : softisp_enabled}, section : 'Configuration') +summary({'SoftISP GPU acceleration' : gles_headless_enabled}, section : 'Configuration') if not softisp_enabled subdir_done() @@ -14,3 +15,10 @@ libcamera_internal_sources += files([ 'software_isp.cpp', 'swstats_cpu.cpp', ]) + +if softisp_enabled and gles_headless_enabled + config_h.set('HAVE_DEBAYER_EGL', 1) + libcamera_internal_sources += files([ + 'debayer_egl.cpp', + ]) +endif From patchwork Sun Aug 24 00:48:38 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: 24209 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 3379DBEFBE for ; Sun, 24 Aug 2025 00:49:33 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8E4B969335; Sun, 24 Aug 2025 02:49:32 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="W9fTnZj5"; dkim-atps=neutral Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CF1CF69318 for ; Sun, 24 Aug 2025 02:48:59 +0200 (CEST) Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-3c6abcfd142so521730f8f.2 for ; Sat, 23 Aug 2025 17:48:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996539; x=1756601339; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=cGnuc3oH2Zv0CIpm6TpMDmVr85UAoXc4ZgYEook1x98=; b=W9fTnZj5o6sMfbmMayBlJvNehIiQ98SLkbSfZST8ZyqmUvaGtcCfQ6MT7Rf3hwmb+4 c7VxTZeVzjeo5r+aAG9nCdTDpw68wuNqcdRtDpaJpctGA7roNt8qvXVC1gihk0NBLkKM RBUBAQiaQ68TaJ9ZOYezsXfqjEqK9p7b218oI+7MfFgqQkcIpXljJCeY+OO77AzRIy+l A3/fY5LxczXkoR1qqeWm+DDTdiGwAGz3fmnYcXfDTvC77fkxPGmr2MPITDTteHKr9Ral khIncRNy3vNPdnoOnknWkbwxBdLDSs/fOB81kMeSOpRFx+AITDR7sr70pYqQdDPIZQG7 wZcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996539; x=1756601339; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cGnuc3oH2Zv0CIpm6TpMDmVr85UAoXc4ZgYEook1x98=; b=W0nxce0VDbRFTrF5GKYGjAnyfmX/jDJ/yM5PoT106ruSXbeYK3g/QutfU7nAJb1V0D QzNXhsaTRyaVX8U1MzKr5ottcv6SuBhpzvQDxp5FeRcjlHf7biY7DQGlxTvHHf1tt0tg rEUGzaFUQmw0QsLR/z9gjzrpwDpViLT/shY4xAbdvwQWwB/BTmqV3XQKXC+bM8oJoCEE GgomrSqkAjZThx/EQALFcK7T8EbLdtFYEMwmc69KhBQPZADqIyDLqkkFqY+77QfVq60J 2tRqvUCBXosscEOWnUs56gmcW+1FbqkvkQNmN44hc5wphTmiFwbZEdEsFciHEXgVvspv BkFg== X-Gm-Message-State: AOJu0YxZfqTm6DfMeBF5alY+5XhI2dNgmvE317t0jgyCxiA2/ODeEKJL E2ui01SZIE3ZlOmq0I3iM6TpHOi9Zy6yEds4Y1C68plewSF5SiD2F8ZXuieg26xSkGE= X-Gm-Gg: ASbGncsSwL3c4NgDj7AKkfkl1Zfid+Is65SwSIhwNbSToWX5+DUFkGNZupeffdJ+EW/ nsWbyxBPXDhTx6Kft+fsbOVkRELxlSaQ/dtAELRWZWzKykAK4D1IdfU45LmG+4iQ8i4ghJUJ1o2 3dTWBvWmynaCv0bg6hmIMD885fHu1eca0eFizog2WCsarWpAQSBBW35hwUQ/UZAJRxtLqh0sI1J f6JE8hpKYCtX/2oZ72jg4W3QvwYiyzMPRdiiDfBMmzjHlCoW1aa2r/am4ijNb5MIJBJnBj3Pw3w yXI5TH3sWw9mdkpUrZr6E02HYjI1sDbGX0cOEkXUYVouZPA1i1sJJgFf51ccEePZeXhjxhbAeAh tNqFLDcBjB8YGRygUqy4k0UsW/iKIk20Nfm0hKB+RH1VEHKQCF6DAD8IqQrsjkowrMv/c84WxaN hxjZQijLY8Ei0dktKqoBcgg/9MJdxYyRA= X-Google-Smtp-Source: AGHT+IGZUlWIRSduMFuwzidZXW9fNNd17+UNu/ghKCIcwOsdWhTItZryN63/FtXEwMgzHFqYN96BmA== X-Received: by 2002:a05:6000:2902:b0:3c7:c94f:6630 with SMTP id ffacd0b85a97d-3c7c94f6996mr1470303f8f.19.1755996539412; Sat, 23 Aug 2025 17:48:59 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:59 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:38 +0100 Subject: [PATCH v2 26/37] libcamera: software_isp: debayer_egl: Make DebayerEGL an environment option MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-26-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2003; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=S+AGi1xySbJ7v3eeQdyrHBWqFirnsX1ibi33DOs9eFI=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFhwMkoZmCmvPqvOYIbA2A+SmtvhPpUxAglo O+t4mB2T0GJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYQAKCRAicTuzoY3I On2lD/4iUX7rTUtiS2krUP2S67wtkSIfRt+wHrzun4B5yhDszWcKXMPX1Exq+zf3WKn7gwazqmv ED28QlVL/vvqu6i7hlNymL58T03kwBlo86fEpZ0VREmN41RFWUWE5XT6xw6MiVqR9dkP2aOm0t1 IHg1ZosmfDG/0UJ8Bm5xlWb41DEdc59H4X93ZbruJxIbZhlqI9QEGrMHEqM3mAlOKvKHMAqedy4 JUNctll9IdJv4+m1JVxpVTA836wRc4P5qvBPwOzoi4EpZKjvEEz3BKFp6yD83a2FZ9O+k3UxUM2 YdHMIItnZKvfGpjuTusEtiMnmR37xirhAFvVqNlttFPZtAZFnbqeFpo0L2tkMzmeNd9+Mw/lWbS TjehgYowKXo1E0yuYUXNgnlvAw+NuHdDKIkZs6vCrE/XquUhEelnwD9nJfA42ma+QPKlChrokEK TvI+xBKwrhozOLYGu8wNIvYumYtyZi3VEDo9D2efaNcYo7tHmj8btUvduSQBt68EI85mULI30pY h2fYysTTU4ppzSd3rBJqJp0IiZyf5xitEfwVQ1zBaqj/LrEU92rkvH91yVsFGxF2DxUNqhEK30p iqOjbm6MhACIOgJfSXO3TYAegVVu+3zQzsX8/qi3R2HuSb6F/t+6cqQMVlVZe+edJYxTRCQ3Loz aj81O+om0BpGfVA== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" If GPUISP support is available make it so an environment variable can switch it on. Given we don't have full feature parity with CPUISP just yet on pixel format output, we should default to CPUISP mode giving the user the option to switch on GPUISP by setting LIBCAMERA_SOFTISP_MODE=gpu Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/software_isp.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index e6bf76f214280194bc20aaaed4b5bc96598436fb..583f16ebb2b0f08ba1df055fbe08c44b5aac5a01 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -25,6 +26,9 @@ #include "libcamera/internal/software_isp/debayer_params.h" #include "debayer_cpu.h" +#if HAVE_DEBAYER_EGL +#include "debayer_egl.h" +#endif /** * \file software_isp.cpp @@ -114,7 +118,20 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor, } stats->statsReady.connect(this, &SoftwareIsp::statsReady); - debayer_ = std::make_unique(std::move(stats)); +#if HAVE_DEBAYER_EGL + const char *softISPMode = utils::secure_getenv("LIBCAMERA_SOFTISP_MODE"); + + if (softISPMode && !strcmp(softISPMode, "gpu")) + debayer_ = std::make_unique(std::move(stats)); +#endif + if (!debayer_) + debayer_ = std::make_unique(std::move(stats)); + + if (!debayer_) { + LOG(SoftwareIsp, Error) << "Failed to create Debayer object"; + return; + } + debayer_->inputBufferReady.connect(this, &SoftwareIsp::inputReady); debayer_->outputBufferReady.connect(this, &SoftwareIsp::outputReady); From patchwork Sun Aug 24 00:48:39 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: 24210 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 0A2BCC32BB for ; Sun, 24 Aug 2025 00:49:35 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7BD606932C; Sun, 24 Aug 2025 02:49:34 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="S5vMiQlX"; dkim-atps=neutral Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B7E07692FB for ; Sun, 24 Aug 2025 02:49:00 +0200 (CEST) Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-45a1b0bd237so24685235e9.2 for ; Sat, 23 Aug 2025 17:49:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996540; x=1756601340; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=p+mSSXAM4EsMOfaffp1veBC/N4dTalrnPCw/wGGa18w=; b=S5vMiQlX0u6akXIFSDy5OvMFeUPt8pFBe6A11euDYm+K/fq3A+kRfw2/pl3U9D3L8H OpkxIvQpgNWGZIYvSUMO4VSI2CepmR/KFtuYEGc3YOLpxdUTeW1RorIjeonlqEdLBbvf X02xg2a+xyD1HxVl410NkXr1Eov9jYrGMvyHW2tXqujhZ8lp9OgXC+WAYH/QMn8CLBl/ 9e06hGq4IKd7IzoXDYQGbZg+weTuMedX0NiCqUpvAaWmnxexJGoHVPugNg83kMiq5Gk6 PHFcBBa1E4sBE/ovpetmp0W0LoSdSnZ85nTpzTE2uQzL5N/idD66j6w40lO4ehvJ+8nD WpRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996540; x=1756601340; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=p+mSSXAM4EsMOfaffp1veBC/N4dTalrnPCw/wGGa18w=; b=w0iChuKE1UzNdtGHRqxYTeD7u8GZGCDKshFwtRE/Hw+KZ3ZYsnadDqaHQJMdmTKzlj BocSZ0jOc3O0LwEV3dLvznTryQDL1KMvY5N2D1RHi17nPu/C2AmcX3h7rgMGa+cnscf4 Zcz98WDXQyP2f39n+E+5/+9fIfcWFj9F7Ar6PmPr91Pd77KczJAQSqwgn0KeSBAek/rP M6J91Mcc26+ynIA3oEWud0qcYNyjeYrtJhvk4HX10fIsIaZLVgbe7gukMJzaV8T4KX5Z BQUWE52h4tA7vprMyeQgTqznCcRUfzqo/Atpc0Ar6Rdj4jT/dcWxHjSFYH3/ClkLP3Pk 1tig== X-Gm-Message-State: AOJu0YyrCX1+kiO8iZyMGPrNH6zSOySc3ABUvsz1sxB7efgCkAa5ufDp ttJu20S8Pk1OdHDc+KxwIgZugMqtGziYPHtbtodaHPn8u6sQNkasWKiP5eU8Gdb8/nNVxuPYTDI tFLExdyQ= X-Gm-Gg: ASbGncu5XznPRM8i2DNUjenZdNoLJL/pv00+T25irrzHMsDAXJ1v7+JpleXww/KzHQo qFIwMe1i+kWbRv04Hi6yw/sOX+e8crI0BUPoWOe6InHpvqN+4/gQCIvOQXcHVyXEiESdN+QKyNX 6FpDvE23RzVQ5EHeYToeiX4/wymq6mg+guuwNEXPA+QnNz01JcETwxwrFfMo8EAB2p31Tg8iIhm zHVsP1xQYE4/yZW1eCwmVWI5oXVc/tfvj4ySgm3YFgCpP1fzS1L8O6/OZGLjdeq+0RZ73bJQZlK 9zDd13W4I5yHbtY43evIAFvEjy2RwRs9bjn+3tv81HFZVVywQ1z8/f21MfY6OtcWj8WJRZ6QbzP NVex6FuxrPHiDWPL3JY+QaPd9XXzq9vpCFsN6IfzyTwsTXuc5DbLNXbfQJ1MydQbWfM6BRfooco SCr6FlVwPKF1bLy33yEnHp X-Google-Smtp-Source: AGHT+IEHWEcVZwGDKhKzapQqG3M6oOe/KsEYo6qMrWBtRKgREkilTufq3lDJoKFrl9/GbCJb35iavw== X-Received: by 2002:a05:600c:b95:b0:43d:fa59:af97 with SMTP id 5b1f17b1804b1-45b517d2f5cmr57733165e9.32.1755996540194; Sat, 23 Aug 2025 17:49:00 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.48.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:48:59 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:39 +0100 Subject: [PATCH v2 27/37] libcamera: shaders: Use highp not mediump for float precision MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-27-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3421; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=mArKPdK06uVUTR5pGsztmhyPt1VhLbfZlNX0eWU6g3U=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFhAAApkDQ2Iq7sjC20UqrAl0CpY2bu9CBIf SpEAjYbSseJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYQAKCRAicTuzoY3I OqJ2D/wPUOlHPqtIuPe674Q1VZtn9YpOFdNL7unOSqZyk83ZyFHtbW6pILTeMsFphHDo9ueoEwa UIghC5k8vnJfqFe7v3arnrCt07WTHFHFUgh7PDLwcGQCw4Wof8HlWIXfEBP+J0yw++v6J3sq4Pc j23E6N5l6AjF1kXc6tVIknf1arS+s3GPDDJmBbU73lKTIHj51wffBllppZbzHHDexweA+dtCOs6 xmqx/XAILtcLsecHaZUl3tq91nDrhZqSSnOzjID4l2fvpKPt5vlrFarn0UCxHCNEZ9rBKfjJt2U 9R/w5JuODE+ZKoq9mRsEFcRGk4L6vffSapygMA7NjNjj+hFaNS0mDi3W1EF6ZywUnt/le/95O8B hKstPO00gcRtxJglOBsyv5Z7S/XfUqxrmITYHmIM/6crv+3QjtWgKKbDWw+KgT55pHVmWaufkwq P31RD42jpI1kTD2CBcqkOyw2qpfOs/79UMLNCApUXPD45pLxIw6pUqlprr0ZnCsFfWZwKRftoPf y9MwQEifoEF1Pev0V+1sxcUgW/7WKfn52RyHMPXD0Z3YMC9OkT+ZePbjLun3nZwjdJ9FxMdb673 JIcuPsX/58YEYkn/NSGyrOwKl95fdDfgBQgHegCITEyMC4TIOhFZL8hNIOM7hJ+4MOAw7+wovkE KzDPEWFVEUPqJRw== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" We get better sample resolution with highp instead of mediump. Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/shaders/RGB.frag | 2 +- include/libcamera/internal/shaders/YUV_2_planes.frag | 2 +- include/libcamera/internal/shaders/YUV_3_planes.frag | 2 +- include/libcamera/internal/shaders/YUV_packed.frag | 2 +- include/libcamera/internal/shaders/bayer_1x_packed.frag | 2 +- include/libcamera/internal/shaders/bayer_8.frag | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/libcamera/internal/shaders/RGB.frag b/include/libcamera/internal/shaders/RGB.frag index 4c374ac980958281506771d30584dc56f10735bb..7243958941cfed1e5e7f203173864e46ac07fed3 100644 --- a/include/libcamera/internal/shaders/RGB.frag +++ b/include/libcamera/internal/shaders/RGB.frag @@ -6,7 +6,7 @@ */ #ifdef GL_ES -precision mediump float; +precision highp float; #endif varying vec2 textureOut; diff --git a/include/libcamera/internal/shaders/YUV_2_planes.frag b/include/libcamera/internal/shaders/YUV_2_planes.frag index 1d5d1206248f3a53e5e0c93c3a3ce6eba73e4437..d286f1179f7b998dd2f9f0406a68c5b45cccddce 100644 --- a/include/libcamera/internal/shaders/YUV_2_planes.frag +++ b/include/libcamera/internal/shaders/YUV_2_planes.frag @@ -6,7 +6,7 @@ */ #ifdef GL_ES -precision mediump float; +precision highp float; #endif varying vec2 textureOut; diff --git a/include/libcamera/internal/shaders/YUV_3_planes.frag b/include/libcamera/internal/shaders/YUV_3_planes.frag index 8f788e90a6f86a584673c5706caaaf2bca25c97a..8e3e0b4a57039142d9741a0be8a6d71475d134a5 100644 --- a/include/libcamera/internal/shaders/YUV_3_planes.frag +++ b/include/libcamera/internal/shaders/YUV_3_planes.frag @@ -6,7 +6,7 @@ */ #ifdef GL_ES -precision mediump float; +precision highp float; #endif varying vec2 textureOut; diff --git a/include/libcamera/internal/shaders/YUV_packed.frag b/include/libcamera/internal/shaders/YUV_packed.frag index b9ef9d41beaebdbeb04901b51d77696e28f7c6b7..3c9e3e397ada3eea7e3e31f12559e2fd92bb5026 100644 --- a/include/libcamera/internal/shaders/YUV_packed.frag +++ b/include/libcamera/internal/shaders/YUV_packed.frag @@ -6,7 +6,7 @@ */ #ifdef GL_ES -precision mediump float; +precision highp float; #endif varying vec2 textureOut; diff --git a/include/libcamera/internal/shaders/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag index f53f5575802628d79c03c83a0565cee2d51429bd..19b13ad08b3a71e408774dbb8e75ca4e22d9ba8e 100644 --- a/include/libcamera/internal/shaders/bayer_1x_packed.frag +++ b/include/libcamera/internal/shaders/bayer_1x_packed.frag @@ -20,7 +20,7 @@ */ #ifdef GL_ES -precision mediump float; +precision highp float; #endif /* diff --git a/include/libcamera/internal/shaders/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag index 7e35ca88e7ff516e81b751382e4e3e463c2c36fa..aa7a1b00436ae15d2ed6af7d666441d20db6bb0b 100644 --- a/include/libcamera/internal/shaders/bayer_8.frag +++ b/include/libcamera/internal/shaders/bayer_8.frag @@ -16,7 +16,7 @@ Copyright (C) 2021, Linaro //Pixel Shader #ifdef GL_ES -precision mediump float; +precision highp float; #endif /** Monochrome RGBA or GL_LUMINANCE Bayer encoded texture.*/ From patchwork Sun Aug 24 00:48:40 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: 24211 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 8D48BBEFBE for ; Sun, 24 Aug 2025 00:49:36 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 10EC36931C; Sun, 24 Aug 2025 02:49:36 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="tS61ZYPl"; dkim-atps=neutral Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C33BA69319 for ; Sun, 24 Aug 2025 02:49:01 +0200 (CEST) Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-3c8b0f1b699so53779f8f.0 for ; Sat, 23 Aug 2025 17:49:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996541; x=1756601341; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ifoFUbMkssRsOpI6z9cjwZnmKjTOulEJYtGZzT5bor4=; b=tS61ZYPlTM8fBrMjkJSrVXfP3GPwC6Y4yNq12vnqC/hb3WEFaywfy9JMUhuOpdJV3K wXgpWzTt9wUibmLU/xXrtPMjcAtMhL30eJ4KE13W5YorMmtBqDx+oE5JhRVH++Q/ypkp OX3wzmhm1a7zBLmYAcvc1FmYz1rJu5bYMqCPPD9DbpMcw9k6PNOfVAA6BOWVINdxlaYO wz1dz0OjNr0hk7wBXyF1aqt5caSlhig5u9IG97iVZ1HdknDOPY9NjZPhQG7wKjRSLf11 VQ2qXqqpMGo+HubQcyX9slEm4GfoxXVKNKIkS0Um/uqf1CUUDXJwiWagrPsXUMehEsvA 15/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996541; x=1756601341; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ifoFUbMkssRsOpI6z9cjwZnmKjTOulEJYtGZzT5bor4=; b=P47TuPLhxLXb6XYEqkmDEmH0NvCXVm3UQz+D5S4vKPEGGmhoptsL+HHcGSOI5lNisv 6tQPB53SRpM7cJcX+Rq0KSeCxJ35Cq+tfLCfj+sAV+ilX/LZqa7jxWe9mTDBZzn43kyk ysnOhfWS/oEWtg64r1vVKlpx424XG4D7DECXF29n6DGGsengJWTcu/9CnCJFq49zQeOY f4uJbYzWnCPBxnvqjx54QA0naxB4/E39JdTRmOzd02wtPwsX+ebeumVdVwd6EtZRWPTu szGMb3FWymu3UCcXtfTUMIqGx0hAgVMVRIOoc7BtE3vtJ/paG7zwqCKJ4SgrW68+AUev r0qQ== X-Gm-Message-State: AOJu0YznK3HFMpC+LVU4w5liEwVAimhApaKnypxdJE4SB4RaptIgW/Um XpJwjNDsrj7Hx+Vpuy4nSoIMHEOLlC0CEK3gY5/Sz++N0rNQRy/VMerE+fnZMJgLMif6oKhwFEK f48Wdf4E= X-Gm-Gg: ASbGnctZPNA71Eb7wQud5PipcJ0k61qIUT6gp313j1ny3v4v8zOnNwGFYRAsGhvJaZa HRoQbyDp70i/TnGOJ1qaWFH81blCwYCVfASrRhd8Edh/l/0RbsS86lf2tE4twEbxnSvI3eUikGf oL/Bx4hJWp7yK6ks9MmjpTyN4FebhrNs4nxwPP3SvobIC2g1BV2nAIEmcR2Zrx3p22XWGhbgN/w xSCt4Hikxcc6ny4FVQvoIAvpdBzFjPXZzpUPyWXCsYBOYpSjBjOoDGskF9k9Q8fd+Rf5R4KZzol BoZyDJDFpqwaHbOZW362E33yyucjDbXHKVteKr9noBj3WnHu6IGDAeqZUc2Av+gPypTcEHgw7TD 0MNXXNpZlrarzKBLEdeFbnzYOy+r6xYiNNpZdbeXQFWdYcoqFYFWyR6hxvTJVTLkg419TjBJK44 SS3/KBM2CO/IcF6qUy9qhtbhkNBgxmiZA= X-Google-Smtp-Source: AGHT+IGxDUQDr4z767fW5JA6YAXtWJp0dgbTAZjuzydKBP+XNgYFAOYSB7iZqn7hK5kXzHL9q5bILg== X-Received: by 2002:a5d:5d0a:0:b0:3b9:14f2:7eea with SMTP id ffacd0b85a97d-3c5daefc2a3mr5291965f8f.18.1755996541133; Sat, 23 Aug 2025 17:49:01 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:00 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:40 +0100 Subject: [PATCH v2 28/37] libcamera: shaders: Extend debayer shaders to apply RGB gain values on output MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-28-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6534; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=lmx/VP/ABJfrY2JJzolQMppLP6ALvW2gpux/pMgOaa8=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFh30aFF5nA+PO59kP1VAPh0aeS/uNxVvVVx x23u2+RqISJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYQAKCRAicTuzoY3I OhhnD/wPl+G04cCfWRvy7BJeGqkzxWRAEehCfq22RsUCAOn2aVSjmTi7YwciEAluk0352Z9ZfCB EpNFYhLKoBHL1YzPK048sI3QTuH7bVKP68MiYLgsxT3LLLLcFwuzZSJN4ZiuvJrg0HK2mORWmDo /jDba+EpGYVgpDYpGvcyqntx4PtrY9b+HuZmfe5UxC98206BVFNYokJR+1ApZjxjJgKN2X5jE1B aLdoZ+lWR5EURIpJ0XOnefIG/8oXj7LlMJ/9+sz70zaI9LAuhhmKwKFM8ZS4dPp5yKaWp0ccttb CZHw92qQ8mZVGQ1capeepvsZ6R3NQ6bI4MpBp1/SMI+eZqjCbwGp+RTq3VB75swhiBQD4ZHfJUO CRb4lYXqzPQgclVwk4EzzwtHhd949fGfETxEoCMGGCOjdx3FXG8KzsjNyHxen/qpyTzrmdqamtJ ESuOXYPM18ErQtpSlOWCnVO02RIr8SK+9tZMKRIgtXb9xcegkdbM5fJf7UvmWjX1Eb6wyAx4Uki 3aHC2DngWT7C2LduXr6kDSinPC2CtUgzStTo2SjJrlcr8tN2vhxot7P1O3znf15W18eaHztLQ9j tYs9e+sLwetk4bjAxW0FXdcz6YRcwbl26Tvkv4fConWzUaWQRe0Y6l1rdMX9jVHUoMkNlx/bKnB YfN4jwFPPeVd3+Q== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Extend out the bayer fragment shaders to take 3 x 256 byte inputs as textures from the CPU. We then use an index to the table to recover the colour-corrected values provided by the SoftIPA thread. Signed-off-by: Bryan O'Donoghue --- .../internal/shaders/bayer_1x_packed.frag | 56 +++++++++++++++++++ include/libcamera/internal/shaders/bayer_8.frag | 62 +++++++++++++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/include/libcamera/internal/shaders/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag index 19b13ad08b3a71e408774dbb8e75ca4e22d9ba8e..90bd645709e02d8cf9bee112b25cbb26c681db0a 100644 --- a/include/libcamera/internal/shaders/bayer_1x_packed.frag +++ b/include/libcamera/internal/shaders/bayer_1x_packed.frag @@ -65,6 +65,10 @@ uniform vec2 tex_step; uniform vec2 tex_bayer_first_red; uniform sampler2D tex_y; +uniform sampler2D red_param; +uniform sampler2D green_param; +uniform sampler2D blue_param; +uniform mat3 ccm; void main(void) { @@ -212,5 +216,57 @@ void main(void) vec3(patterns.y, C, patterns.x) : vec3(patterns.wz, C)); +#if defined(APPLY_CCM_PARAMETERS) + /* + * CCM is a 3x3 in the format + * + * +--------------+----------------+---------------+ + * | RedRedGain | RedGreenGain | RedBlueGain | + * +--------------+----------------+---------------+ + * | GreenRedGain | GreenGreenGain | GreenBlueGain | + * +--------------+----------------+---------------+ + * | BlueRedGain | BlueGreenGain | BlueBlueGain | + * +--------------+----------------+---------------+ + * + * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin + * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin + * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin + * + * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); + * + * CPU + * float ccm [] = { + * RedRedGain, RedGreenGain, RedBlueGain, + * GreenRedGain, GreenGreenGain, GreenBlueGain, + * BlueRedGain, BlueGreenGain, BlueBlueGain, + * }; + * + * GPU + * ccm = { + * RedRedGain, GreenRedGain, BlueRedGain, + * RedGreenGain, GreenGreenGain, BlueGreenGain, + * RedBlueGain, GreenBlueGain, BlueBlueGain, + * } + * + * However the indexing for the mat data-type is column major hence + * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain + * + */ + float rin, gin, bin; + rin = rgb.r; + gin = rgb.g; + bin = rgb.b; + + rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); + 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]); + +#elif defined(APPLY_RGB_PARAMETERS) + /* Apply bayer params */ + rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r; + rgb.g = texture2D(green_param, vec2(rgb.g, 0.5)).g; + rgb.b = texture2D(blue_param, vec2(rgb.b, 0.5)).b; +#endif + gl_FragColor = vec4(rgb, 1.0); } diff --git a/include/libcamera/internal/shaders/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag index aa7a1b00436ae15d2ed6af7d666441d20db6bb0b..5955c2eafbe03678158b240740e18c7f00e58057 100644 --- a/include/libcamera/internal/shaders/bayer_8.frag +++ b/include/libcamera/internal/shaders/bayer_8.frag @@ -21,11 +21,17 @@ precision highp float; /** Monochrome RGBA or GL_LUMINANCE Bayer encoded texture.*/ uniform sampler2D tex_y; +uniform sampler2D red_param; +uniform sampler2D green_param; +uniform sampler2D blue_param; varying vec4 center; varying vec4 yCoord; varying vec4 xCoord; +uniform mat3 ccm; void main(void) { + vec3 rgb; + #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r float C = texture2D(tex_y, center.xy).r; // ( 0, 0) @@ -97,11 +103,65 @@ void main(void) { PATTERN.xw += kB.xw * B; PATTERN.xz += kF.xz * F; - gl_FragColor.rgb = (alternate.y == 0.0) ? + rgb = (alternate.y == 0.0) ? ((alternate.x == 0.0) ? vec3(C, PATTERN.xy) : vec3(PATTERN.z, C, PATTERN.w)) : ((alternate.x == 0.0) ? vec3(PATTERN.w, C, PATTERN.z) : vec3(PATTERN.yx, C)); + +#if defined(APPLY_CCM_PARAMETERS) + /* + * CCM is a 3x3 in the format + * + * +--------------+----------------+---------------+ + * | RedRedGain | RedGreenGain | RedBlueGain | + * +--------------+----------------+---------------+ + * | GreenRedGain | GreenGreenGain | GreenBlueGain | + * +--------------+----------------+---------------+ + * | BlueRedGain | BlueGreenGain | BlueBlueGain | + * +--------------+----------------+---------------+ + * + * Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin + * Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin + * Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin + * + * We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm); + * + * CPU + * float ccm [] = { + * RedRedGain, RedGreenGain, RedBlueGain, + * GreenRedGain, GreenGreenGain, GreenBlueGain, + * BlueRedGain, BlueGreenGain, BlueBlueGain, + * }; + * + * GPU + * ccm = { + * RedRedGain, GreenRedGain, BlueRedGain, + * RedGreenGain, GreenGreenGain, BlueGreenGain, + * RedBlueGain, GreenBlueGain, BlueBlueGain, + * } + * + * However the indexing for the mat data-type is column major hence + * ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain + * + */ + float rin, gin, bin; + rin = rgb.r; + gin = rgb.g; + bin = rgb.b; + + rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]); + 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]); + +#elif defined(APPLY_RGB_PARAMETERS) + /* Apply bayer params */ + rgb.r = texture2D(red_param, vec2(rgb.r, 0.5)).r; + rgb.g = texture2D(red_param, vec2(rgb.g, 0.5)).g; + rgb.b = texture2D(red_param, vec2(rgb.b, 0.5)).b; +#endif + + gl_FragColor.rgb = rgb; } From patchwork Sun Aug 24 00:48:41 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: 24213 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 272AABEFBE for ; Sun, 24 Aug 2025 00:49:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 94E1169320; Sun, 24 Aug 2025 02:49:39 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="dFXtDxCi"; dkim-atps=neutral Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A28B6931C for ; Sun, 24 Aug 2025 02:49:02 +0200 (CEST) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-45a1b05d252so25649055e9.1 for ; Sat, 23 Aug 2025 17:49:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996542; x=1756601342; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=MCZVtAok6y/MLcW9t2f6X5YGJfebHokaMzonAZwcxFk=; b=dFXtDxCihA1QDP9FKubDc4ecJPHGmv1PV/sNJaQvnHP3cVHONoJ8MGepHvPIHnAnDH h5vsawWpL/aek3Cv3iRO5uoInu47ZwrapqcmrbZp9Gxf8PnlbmUOA+P3SZnN62KSby0n R9Tpy+D0R2WPbv7zb4VjSO6Gr4tWVcqA9rdqMAh2vgaQzQ4xPG+ijOx0cZOV6ax/DTGO Q95vROt1L66e2JtEvyaegBE0oAXH8vJqTRzaZ2zrO2sMJ/Nw6smwofOwe26IUbAF7dV9 ni6JiaPcuBh3R13qw1HSEv7hkbX8qy5GxwqLrhhA3PtapsUnKSBReEsI/hJnqIylMh8Z uyIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996542; x=1756601342; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MCZVtAok6y/MLcW9t2f6X5YGJfebHokaMzonAZwcxFk=; b=S5shPf09XH3IrNLXy4DOXm7hoWcmDcN+fBbtMAGv8GLqk8o8QlE9X4QAKjNYnPC6mT 6aMoiVMJEyr6P8zIl2aF3JawGyK1Z1Wjq+m0NLQgKDu+tdVa+mIh8nP5ufG7skB4lJfQ GFtb3UnIQNaeb84GZtW514msYgpUJ6QnL+x3GezNfC778P9lzXh5FCiZpJGfB1zI0GMO ug3feFPVHwYQOG74v+L55rfk4EgHTJtXoQi2+WLvyD8I8JclvHOLeGpIawF+IKn/4lCy hMw3uAoZ+b1KCsnIl3hjgDKErxqwyKZT7zcXKJTOSidhZ3dRNOt0JRaYlH/2uIBgh33y 60MQ== X-Gm-Message-State: AOJu0YywivZ8RDLhfcrvFxLJYVVSKg1vNawe8IlXPPKnbILDHPfYcWpC Kk9FU6LUnYFmESzXsHVhKx1h4B8le9xFFRgtjSiVSqPbeL9asLAIwXyMPUziIeZQvJ8ZlXAnMtR jlCDf55Y= X-Gm-Gg: ASbGncsmgGVIx8w2MsgvyJNx0uENsWENQk1IBov6C0+kMsqIYn7c4+P5OwRyYLZ3wMr Sb/NaZZu71Fx4W8wZxXtmGBuH1XD1Wkj24GVQ9Ay9PNiEd5j3V955A61+ECDXUlbv6SOWJCiu+8 C0mIVxDKdepKYcicvj7UA8t43SrWaf9uY+dWAaNPvjn40iX4WomC+adXThtDLCAOPz3xc357QCP HG+2YcAmQJ7n87gf1248XdZr1lzjxUl/nAbTnNItV/0LHT+KVdQU2osFeLNekb2pa4lyNEaHa9Q 5hrDROj1BPc22y1jaVElDh5tBcyye/gm4QmGdef2GsMcVCkDfB+X2aSUhpkSWq8Y5mYJuUWhxeS WKVlBlsYf4LXudGzRvFbFRLxYwv8zVqrJlrjYUZMsIi+7xeVrh+RWs5018u9ji4cBqcbg1ADbZG azpaTqBQ3rZ6B4foEG+oES X-Google-Smtp-Source: AGHT+IHFq7EIadsCdBCk7dVjFxeUEt3soyM2X7j6RK1keknQN+Yul3Vt2rzEwtJDA9OV0WoZvh2f3g== X-Received: by 2002:a05:600c:458a:b0:459:da76:d7aa with SMTP id 5b1f17b1804b1-45b517dc897mr72312575e9.25.1755996541966; Sat, 23 Aug 2025 17:49:01 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:01 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:41 +0100 Subject: [PATCH v2 29/37] libcamera: software_isp: Switch on uncalibrated CCM to validate eGLDebayer MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-29-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1012; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=Cu3Wk6xuqyoPaYvcVZrA79eqnd63bd+Z8F2b/6T+2aQ=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFh4Kt/e20fBAnlIFIxVeFSCFg1B66nCBA4t w9Z7EVx7w6JAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYQAKCRAicTuzoY3I OioED/9KmF/306Y1YqPu5CZdrbnk7l52ft9am00Kbu67ucF0TZcVCdAADmD/tvMCUqLB4lndxJC jbYRKYpQ74IoE/pUG2tZBuwQjhTAgop30iiV1vOQNj0GqGI/sXMQazGodlXHszxXEPCtIkyzcQW SboNg/lwwt6NKgmopVHz5jevpp3w8Yxh3Zl088LSteS/NgjHS58lcODwp5VELFWdKxyKPdU04qN ODE8PdcUydoAmHcuDKfVTeoa6NOQT029L0UUFcBAuHF3CRSmGI6pF2heLLe4mCPogfDjw3sQ7dX 21LvY+VITm2hoz5phzjz14WgKNGCMBTh76sw3KO3uiZ8PCCNnMQmg7iDrfsfc2elaPIbPtQl/80 JKyH6+c/Sjin5e8SeRgNxoF2Qv4U5ImbTMAwGrH0fpNa4oSd+D2phVlzCefz+hH923f29HlMfaP NBZH6vAwVLdztdTrN6VYZYPrlab7wejYZupN6rhL3YFwc9kgrT1Bn4/ILTKT6ri/kiN5fZcr4vx HadAEcAW264ZdS00QG4PzVbS3BK+qB904yLu2pK+bfILd5cmxnI2UOD2NSd4QvnD5fcJ8pwBY6w wHrxxBuiXA38pVOFieDjud/yyAYxDGL6t5+IncdwSGGecb0vBMN1oFFe2um8aETaLjYwT0gVs1v 14Rb+i4wffQE0Rg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" As a validation step switch on uncalibrated CCM. Signed-off-by: Bryan O'Donoghue --- src/ipa/simple/data/uncalibrated.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ipa/simple/data/uncalibrated.yaml b/src/ipa/simple/data/uncalibrated.yaml index 5508e6686a095b27b3f0da071c5fe2f2f8a643db..8b6df9afcf71583489e578a4c45457fee372aeb1 100644 --- a/src/ipa/simple/data/uncalibrated.yaml +++ b/src/ipa/simple/data/uncalibrated.yaml @@ -8,12 +8,12 @@ algorithms: # Color correction matrices can be defined here. The CCM algorithm # has a significant performance impact, and should only be enabled # if tuned. - # - Ccm: - # ccms: - # - ct: 6500 - # ccm: [ 1, 0, 0, - # 0, 1, 0, - # 0, 0, 1] + - Ccm: + ccms: + - ct: 6500 + ccm: [ 1, 0, 0, + 0, 1, 0, + 0, 0, 1] - Lut: - Agc: ... From patchwork Sun Aug 24 00:48:42 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: 24212 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 72ED7C32BB for ; Sun, 24 Aug 2025 00:49:38 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DA4F0692F5; Sun, 24 Aug 2025 02:49:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="NujLdt0o"; dkim-atps=neutral Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1F7DB69320 for ; Sun, 24 Aug 2025 02:49:04 +0200 (CEST) Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-45a1b00a65fso15763895e9.0 for ; Sat, 23 Aug 2025 17:49:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996543; x=1756601343; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=vMrbw9d1/FHsHfu4si9YVFB94SXY2f2CzibKxyx5pTw=; b=NujLdt0ou7MG+NXmZuV+Ix++oUx3T/X6kUOyTEh/M2MvM59n407K1LNELgS1gK8XIf 6ZkaF51c5Ht75OTTfRASmEe/E5qNUKvfjuv/5hcqYQ4jIHrKIjvqNfFCp0eNhblwCaXE jnQaL6bGdYjs+gLlrXZiwGcDeOH/GF0/EMBqBv2QK9qLhNcf2a8oYHZEwVZFQKxO/jVd H39u5hEU0RHJFelftXuzfK8bxByWz0O3fWGHJ9wDyWW+S0IdnRljvCJXJtJJK2HLyMWi 72dSZtSaFXwYv42IJ2Fy7/vmPGUpEAKq1o01DWTel1pOl4kT3QGT2/3dpA1p1FvYoiIt OVBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996543; x=1756601343; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vMrbw9d1/FHsHfu4si9YVFB94SXY2f2CzibKxyx5pTw=; b=fkNokLBoi/lc4S4dCLnYPvK0JMzNGcRZSAZvITSryrxJ83QRlLzMnex1pouIr/qEQw fBdn30pHdOPWTHw6bm2drMT334j+mV0uZWf0pjXjqh6c+cvX1hX9qM1m+BIiwBlfT3c0 485yKPGljQ64ome4r0zmTzsBYli2rXZw/PgcSej2RG1DE+jmEU/YluxsTEmyfvtnyGy/ +Li1KrE4KKKMZ1r8fcXZ0d2phBrc3srcgURMrviPn7wpourKsGYg8feCPAeCvgRoDYAx yham+MjDASAROLvM058nSTkicXiJ1FHV/m4Qb2wbpQbOQfY+kpP+672X9KH8uA3Uhr+V fj5A== X-Gm-Message-State: AOJu0Yx1O1s0UK5NBbQGVWntw+J1M9x4dfibtDWEhQboeCimcmne/qpL VvIJlSAeOxMwniSvWegsb0g7YX2nB/w1dbf6RDCh5D43CO9GCklv60l84SaoxmUj5+LD8R0wgX9 mlEM10VU= X-Gm-Gg: ASbGncvZ81oaPT14paj9YBZB56SCbMHHycMOY8mJimfyW1FxA5wA4/qghJxBQzv0ZGv AeFv5NgSOJnqtpBdiP1jKI8RmuChLxrCC+rl7hwyYDhQbrAN1y/N286pDu7k0qsj8Q/oIFGxosv V8gdni22DNqmuStzdDGpuEgtWOeRx53dowezVFVIAuCRtDwyIEVK6BPVxrxZ7SZdinuoQ28x/EB WsWRJtzq5tJvO0px+KFJ/apJR3nMGOag6QI8bTRpjJxLVaF0AfHTDAh4PholPmkO+nV+4MNFk2b K8PayFctV91upC19cMj0JrzSPEQt1jODeBEfsmq2l8WLUnNEytbaCSxFeRLDix6vSrow94Ey28q KPY1qIZ37JyQoQZzlpLABMhdusnXK2dx0EmSM8jziA7vXrdY03ACY55xa0JvcX11u1k1ToD7CtO UkeIDgqYYCc+OhZSPVicb4 X-Google-Smtp-Source: AGHT+IE/7ea/ypLT2meNtklj+FOX0HpUv+iMjaGbPkmOBCV9NBE6lfn9uRwtLIiOQ9XIUFTbu1ulhQ== X-Received: by 2002:a05:600c:6209:b0:456:161c:3d77 with SMTP id 5b1f17b1804b1-45b56e7b0abmr61273925e9.16.1755996543481; Sat, 23 Aug 2025 17:49:03 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:03 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:42 +0100 Subject: [PATCH v2 30/37] libcamera: software_isp: Make isStandardBayerOrder static MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-30-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=894; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=HuuI+9+lkL2welEgJYRKkEdNyPtsypiSHLvZa1Y6J5g=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFha5z6nQzZZa8K3xYRcBm5XVVBikoKMUGzt psiY+qtoDKJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYQAKCRAicTuzoY3I OmtaEAC8Ve1J9+dJkaPrPpVtWaGCw4hwndQxmqjqZzkZxXGNJJbzAeDPmJSpJMYdYuTnNzHNWAi Lbzq3NHF33WCu0VdNJgfzZfCqP58JLvN9FdHJkrnIhKxMybo53TkbaK+sBnggB90yTL1CCzHT8h RUABYWSO+XzMvJD4hAoaRGty51H9TDceEw7Bg+J7v0gMJl4TBy/FYWCiid0wa2AaT6c5Q1w4FqG w9YoXGJENlEQlMNyWMfhlCp1zYNejQSg9mIhr39yYrBr8vEgdTfP54Hg4k7h29UrNzjroaHcDvR Rv7Pg8MqKrQfWnW1qMfZrxclmHLvJtSxCnSVKNaV93Bbrblgv4seXohyo9q7hJOlBIm92QT6U4w AnUQlouRsXzY5KUJBiNHkDl6snwsmm/O2IUIosUPGKpPbWu/wP5CfL2sNHi7/VrnE3Ianh/UI95 RYZxYMiicGpmXYiTKwWyXfI9RaBklC4Hmck4eYiP4BkTOlXrqL03Knqs3LLDjSHgnDfrBrkrc4g J1d7M8X6KWi6DfKhQL/mdhUigEEhmzz2WgGgjGV8j/i7fm2nTyzpvbp/VJoQ0ckUm85yV6zEJ33 KTMspnWsLoqM//9EsikVJTLxgtxX7Xhw1RS/gTCYjUY/2ErQcdk/5uudotxbef0PB+T0gibVgfu 7STNMJ5kzBjwyPw== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Make this member function static so that it may be called from static members of derived classes. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h index 352ffb89ad9d5a32ed1bbb14253af5e3f21d508c..e149c94e1c66666996adf254060308b2688ca2a1 100644 --- a/src/libcamera/software_isp/debayer.h +++ b/src/libcamera/software_isp/debayer.h @@ -89,7 +89,7 @@ private: protected: void setParams(DebayerParams ¶ms); void dmaSyncBegin(std::vector &dmaSyncers, FrameBuffer *input, FrameBuffer *output); - bool isStandardBayerOrder(BayerFormat::Order order); + static bool isStandardBayerOrder(BayerFormat::Order order); }; } /* namespace libcamera */ From patchwork Sun Aug 24 00:48:43 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: 24215 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 85637BEFBE for ; Sun, 24 Aug 2025 00:49:43 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E7AD76930B; Sun, 24 Aug 2025 02:49:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="h76ciJwy"; dkim-atps=neutral Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C485C6930B for ; Sun, 24 Aug 2025 02:49:04 +0200 (CEST) Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-3c68ac7e238so724802f8f.1 for ; Sat, 23 Aug 2025 17:49:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996544; x=1756601344; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=DCqHCxet1Q73SPTtfGHoaCKptnhz0Gi4nTZH0aC6nUA=; b=h76ciJwyGdkU+e866Er71iARwIHga9E3TzWdY/5B8yG0ZO3togOqebsKRIG42o4cnI mHDJqTeFZwYG9MfDtnNq1Dr+tWYAcKoHrEhhBZKKMGZmmG37VnEdK7QHZJCh9dbNm+x2 z4FLUoB9wDANInC8Yh7wj+wL0V8jX9jnLNs9k4Mu/B0Kh2VBpM6V7GL3FvkoAMnSXG3l 3yz3ppSfSZ77vYYAAEu+ZRs7kgkvHmHUKt3fNDNTgU0DJZSn3kKSG8FOpyyEWqgLmFr1 WpuqsZF/j2ouSH50yCFSYukacHijlJbTaNmzH7dn+22/HIG45zQ47i1ZWeyJ393XgpXJ SNdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996544; x=1756601344; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DCqHCxet1Q73SPTtfGHoaCKptnhz0Gi4nTZH0aC6nUA=; b=p5UCeL7U15NE8VvgmZ8y3/AShUB8ZXr+ZFieJjAG7iNvgh+NjtmLIVdpSPerDhfrR9 ELOjUmeSDdK6Sq4U7bSxqDl1GZyx84J6m3z3RkD9gv8FkAIwwdN8aPOgy2bEQIR6niUf mFD8W8U8ysXb1opKuru94fAxwUyC0kkIdPdgHvss2OKObql/eHf8754qiW0Pc+ZMM3Aj tyYoI1o+7Gt+0vQKJ1HWCxYPTYaUPj2D8vihCAZq/fkUGI4KFqPUzqULdFnJmb0GGhJ9 aX3FhzWaH6uJk4EE8NPD66dRt3uo6aS0NmlsPlpRff+r/B1oP65yWAH9oHHqAfYLINVO GyZg== X-Gm-Message-State: AOJu0YxuI9ugLJAobs7BNJIINzN8AfgzI4THRkfowwijxhBj/HCfqgJz X+bNzUTfpoTuHUa2qCFDyFTzyCM/JMFxCDUpchmPnTEiC1xKMTVkX3Bb+Xlb+RDapBS/bpGbRnE osiXLdmc= X-Gm-Gg: ASbGncvI3xNGG3nHIz23y0QgYwpW1o2cRm5ItT//dEz9WjKqetssaZ5E8lsCq0GjWaU QZJSH8aK/DZKLtawfnFJYPWjw0qZ9cLeSLb3nxTSXP71f/rN5P4zIyLe8Rl+99Km/4kahsHSqV8 guC+sTSiKmMvkqbJoTe6i7DGGB7CDaHk4svpNQr4y1sos5cvD+hISh/UAKG74xFrvK4YclJ1eZs xmfOtAPwGasUfMCOTAY52aNZiESzd38dim1DWlCPWwsMb8MHPJ1JGGqMXz2tdAtr0mF5S6PMEDi Anpkr/VevChUp8a4YSIytB0NPEuqbSEfMcdMmxUQz7zYURe6FQ0RKITD0kYc/Uz4refyNt16TAF oBXJvo/fKsPGvGQkOdu6Ij2oVHgYsBa10lj+e5fwV3bWMPQ4ZLcOaN+4CB61mrEAZ1+COB5Bk4p IAPyz4hwr3mezUygL7eLVd X-Google-Smtp-Source: AGHT+IFnPwGQndyghYCISxXw9NDWzLmjB29eNNcvoHjtoul1ztFmmccfp5gusOCAg1gAgkQNgfe52A== X-Received: by 2002:a5d:66ca:0:b0:3c7:2491:a2e with SMTP id ffacd0b85a97d-3c724911079mr2607611f8f.44.1755996544327; Sat, 23 Aug 2025 17:49:04 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:03 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:43 +0100 Subject: [PATCH v2 31/37] libcamera: software_isp: debayer_cpu: Make getInputConfig and getOutputConfig static MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-31-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1447; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=DekyQy3uJSqo4rRn9kndIfkU+fGKhdQvubE9arMaarc=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFipwGj+ZbhCzxGk7+xP71T5U+AW054gmK7K YHSYg4aKoCJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYgAKCRAicTuzoY3I OrMwEACUjaXSuGnCd3d91oVOg7X6fqGDPzo4/d9qRheQT80Z7evk6AZPbuP+sWzbGM8GHeEDOy2 rJ+UnqSRdk+zU5Ab/kQqLK2RqtZQEx1/9fURfmhMZ1n1JI0FZMgvlnVq5XFjwAHIbBDc9xDpwl/ +jLhzWa9ZihJAJywNMhs3FgT9gKf5h7+lYJrMWDODMc3xOU+SRKs0r1e3kI1z9vJvvJzWKtUFfq //CDOZ/rhyG31ZZ7P0MwQf55ug5MwNfjW0zTrdl5xDioJYaOn9tnOsFvAb8OTbzeXOdKsjOao5q wWZ70L0C8UGpJpEJey1uPWvZaXjDodX2AZrd0uZOnf0W1HT/MW8m+Kg3JuBcc7vOxNPGHnDXFIh 5l/lldStqwLqcrnEX43M7cvr9OWN9vR4CANuVo8HlWkjNuzgQ//7vwcx+oN8aV4Ym2knTS8zPBp B3N2ldZuKMLHRS/4KOm+NQYlgsmQn2b+7jpUA3VP8aM6o39c194+f3FVqhziPJqrgwh+FoDyLug XKzdQ+zIhzPQZjNFQSqXjn8cyYvh2HcdqWfeQfMyoy5f7jAEH4UTXYg73x3gKmZZXoMoXo6rd3M X/ZuWKz+ndZEcpStc5aJT246kPKwsJVnZhuQvAknd9kVF5Vuy4IZtL5zTKrcBzXIf+i7hoOoDGe DvoqJhnOanPKClQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" Make getInputConfig and getOutputConfig static so as to allow for interrogation of the supported pixel formats prior to object instantiation. Do this so as to allow the higher level logic make an informed choice between CPU and GPU ISP based on which pixel formats are supported. Curretnly CPU ISP supports more diverse input and output schemes. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/debayer_cpu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h index a043a954134e71c625a8d2e493c45f9ed22624cf..999e3421c5152380926ec46e4233f053a089803e 100644 --- a/src/libcamera/software_isp/debayer_cpu.h +++ b/src/libcamera/software_isp/debayer_cpu.h @@ -102,8 +102,8 @@ private: template void debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[]); - int getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config); - int getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config); + static int getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config); + static int getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config); int setupStandardBayerOrder(BayerFormat::Order order); int setDebayerFunctions(PixelFormat inputFormat, PixelFormat outputFormat, From patchwork Sun Aug 24 00:48:44 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: 24216 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 81AFBC32BB for ; Sun, 24 Aug 2025 00:49:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0D15F6933E; Sun, 24 Aug 2025 02:49:44 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="BYMnFYl3"; dkim-atps=neutral Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C371869322 for ; Sun, 24 Aug 2025 02:49:05 +0200 (CEST) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-45a1b05a49cso25529425e9.1 for ; Sat, 23 Aug 2025 17:49:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996545; x=1756601345; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ESRMJTblPPvZq2GFxDEIxtOdNxshCNwucJs6WtvfNbE=; b=BYMnFYl355tbMsxuWcC+Rk1iPWAeD/hqAalu3PvYdv3b6rCOiNx/tkuFztVuMv1o1J vk8HX/ZBtP4gPxiKF6YYHdjtg78h51mHDs90vCIgUvoJlBvDCh9mHTriE/BOOyp93BAT yeEj21Dn5QKkZU3W8Cd+1PQImjT8Kp5uL4sSjneKLHkxD2JyB/XFtxTNZvud+5wPEoaN HHarqkITgsr91DWneyF5gnmulh40CxrvWzwShMvWawaZuOnUXWI+CsZz86eJr36Pk19S ACxZJ1yaElK4BBlNRA5lPtNQr0BBAzwHnMb3XkCXOD3KNVwRaT3Wf5rcfPHW0s8jeeWe znjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996545; x=1756601345; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ESRMJTblPPvZq2GFxDEIxtOdNxshCNwucJs6WtvfNbE=; b=gS6Xj5j1Q7uucV+Zw/08BaBzKnsGlliTqnjsrHNiCH/fvBlGJCBcvFuPccBx4jTltw 5/EedIo+5LffacHbRKTApPAiYP6WyEK3dBBLQ53CgLXMh2rgfgcxhSMiLAvkoWIYg9bZ Oj2qr36AtzVxQtfl9r3FPqP7mBbg4iI6/2Gd8eH5nWpLPqtCcSeAMutR6fFqC+2YbPiq NtBQ/jgfB7H8Bz0cEyLU8AhnPNyfZwY9LW5pMAS05lcc1ZE7Yj9SnMRc7xA/2H9ln6e7 zT6YU95auyCoE8K9FFG6p0n7h+erTwDmSkmeKZtXbceU4Lr57jMCG4C4a+V4ienkUtmz rsUw== X-Gm-Message-State: AOJu0YwwIJlNB2PttUz7Fy8sdBYWyj80Na2RysFZleYomxNqspsn8OcC TUiqGZWQM1RnaURpboeE4vswAb9tcw62N2Z3NgufuB0DYpiNPO1k7ujgLNGKcWlf9Kc= X-Gm-Gg: ASbGncvXeJLafY+VJe5dkK97RQAVzZHOLPW71Eo3nbuVt4UaIsnPYO1rmR1fENHYt1r I/fYnmcDUa4eFKS2X/G9RaPuPaivUQP93U+67zf5KEq57EGxdiakA3V99De0MvaXE1FgFpn4CHA ckDTGec17MUFCxkVvuoXU+koOSWRK3Y4+v6lR4fc4f1JQBXZlOYoh4CikkQ0NhJUAotRsrXCdJj bnlHe2Kd6TiEN7lRZgdHxmJlRTR1/6gu7Vh/qsfsw+dYU+0+wigIEu07iUBWxl9ALOlImYpOtkY nH4V5+sgN0NDwiojyGpaimTo2vTjkaNTdyHKIdslePAP+m6wsLecg3IVl5GTwLizg8GKGj5tOTt ykwaw9FiGTgXdLrQYIXPq76NJQw18BGWBMFqjFQ3f4nLKxkQxLbif9AmIYIsv+VCU00mDH2PRYZ LhSW6HkK0wGPNqdhmQhJ2P X-Google-Smtp-Source: AGHT+IERtlDc63AGtTIOKTaXXl+Nik/ssWCk8hAnfKNbJ/nhl6shrxoLWRsm8ilkuYJWNNMzhI4c8w== X-Received: by 2002:a05:600c:4687:b0:459:4441:1c07 with SMTP id 5b1f17b1804b1-45b517cba51mr62510545e9.20.1755996545262; Sat, 23 Aug 2025 17:49:05 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:04 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:44 +0100 Subject: [PATCH v2 32/37] libcamera: shaders: Extend bayer shaders to support swapping R and B on output MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-32-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1571; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=Ib7hryM3y+nj3Dvp5/I7OoKBgzicY5DGoVAJZWOVdiw=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFiRLDbsLQxoedzZH3XvYuFi41e+qF19dSgh D80P66df1KJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYgAKCRAicTuzoY3I Ol2nD/449du316Nb4JhRUrUcNI15eTuGVx/+tAf+j+ffJwzsySC/mUZoXH4YQsybWt0CVE4qti8 eP1Me7UYVRdGAQh8/VEN69cmeYFMtNOZW+lE5QZtS8nIVxD6hBU5e1KJjT5gVAWi7/EiDg/n3Ev ZdowfEv0CwQm8PjQfN3l+RQXr/64e61+H5YYyFhQj3ejQkugweVpg9bSZGa1YYwLB1JeNyAfP+t jH6p9wetu2+3zBla+B4W0SQj/LaDHtDD7I3gSbsa31Bflu3yr9izT70fUUSwiYqdRG7AmhRprD+ Nrumrij7vhO0Kl315RJpCBdZJ3uQSTf0jaY7+saKMmIev1dUnZVAmXhpXWW8RmAdRLlpkRYEKfZ ri5J6IBysCXxn10p2rJob9843CxoPYbjP/8q+zsvxUsA22LRpktsB7j7X/tebPsiizBo3oAE41S SNqRZ8EQwxgu3MAmmkcUQ/BjuLPrsRtMuZjiYvS1TacT5rNn/nyoToWlZLtkoPniOQAO5hWXysg 2p++Gk6rwTrK62WSrhg3MqadqKatq5UfRkasZCW6QuqiqhvNVuTdRjOdgmLUrtcGzRiqRD+6Kdv wnXbn2ZVTrXMSrHyU2rYtroKOJsT3b25+1CzScs8h9nqEXlOy3vm9rLHqRb2ASlPTwx39C1bIVW Z3JeZGDpfoYE9wQ== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" We can easily facilitate swapping R and B on output. Pivot on an environment define for this purpose. Reviewed-by: Milan Zamazal Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/shaders/bayer_1x_packed.frag | 4 ++++ include/libcamera/internal/shaders/bayer_8.frag | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/libcamera/internal/shaders/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag index 90bd645709e02d8cf9bee112b25cbb26c681db0a..c0632eb1f2089522cadb548a163607354bf7688f 100644 --- a/include/libcamera/internal/shaders/bayer_1x_packed.frag +++ b/include/libcamera/internal/shaders/bayer_1x_packed.frag @@ -268,5 +268,9 @@ void main(void) rgb.b = texture2D(blue_param, vec2(rgb.b, 0.5)).b; #endif +#if defined (SWAP_BLUE) + gl_FragColor = vec4(rgb.bgr, 1.0); +#else gl_FragColor = vec4(rgb, 1.0); +#endif } diff --git a/include/libcamera/internal/shaders/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag index 5955c2eafbe03678158b240740e18c7f00e58057..74ce15096ac0b8a221175d111d982d1222b7db38 100644 --- a/include/libcamera/internal/shaders/bayer_8.frag +++ b/include/libcamera/internal/shaders/bayer_8.frag @@ -163,5 +163,9 @@ void main(void) { rgb.b = texture2D(red_param, vec2(rgb.b, 0.5)).b; #endif - gl_FragColor.rgb = rgb; +#if defined (SWAP_BLUE) + gl_FragColor = vec4(rgb.bgr, 1.0); +#else + gl_FragColor = vec4(rgb, 1.0); +#endif } From patchwork Sun Aug 24 00:48:45 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: 24214 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 DB276C32BB for ; Sun, 24 Aug 2025 00:49:41 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3792769318; Sun, 24 Aug 2025 02:49:41 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="aTwkWI30"; dkim-atps=neutral Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2A7086931D for ; Sun, 24 Aug 2025 02:49:07 +0200 (CEST) Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-45b4d892175so15072415e9.2 for ; Sat, 23 Aug 2025 17:49:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996546; x=1756601346; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xjd+e35XGRyCcjAf/q+jMn0VY9rYr8yYKkhDmX1kIWI=; b=aTwkWI30aCeJHo14fSgSq7COAA0Qz4WBRTj45p4uIu/hcyf2YbhcUyat8kmFUdXWrY EJUMeu0yPeltf43DcjkpOzdz87UOnGCC3ftz1UTTYEEz0sJbv+ml4eHT2dzgjMpYgk2s 3p9cJ4rda0ipQ/tbAwLmXDQkWNCYrmYWQlvUSlTmPr5JldUxFfqtOvHvBHPw747fFGzd Yon0ZjpajUJutzlaF9Xccf3i1y12QcMwmM3t9A+1ZcjdYLgbw60bdMnbScwTR+nbpLbk zJ1BI8nwwHuZQj/AeYdTiM4ZfWX5qh2r/rnXZ5+ebAQGqJXBbLmTk0yhaVPwGtOT5pee nDhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996546; x=1756601346; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xjd+e35XGRyCcjAf/q+jMn0VY9rYr8yYKkhDmX1kIWI=; b=gJ3qcuIRCEYmE2Fh07jZdg9QgLvwLxds9TGaztlL7aeF73auAvXUybJAll5rOazNPG kQefAbmMie9/6dnKyQRFAUxtDAhP7bvcu57ieDqozHDP1AhH/pq/MKKBtXkvg4o+apwM E7apwpnYDrqSDNX62ZkvOy/LeRuKxwxr1MFpp94RpBKiS5aTfSURHeChKen8XRoPZtEO MfOFs3DL68RVq7zAJQQ57VAVE7LxdJSLYdWoQVGfrHzaXk/JHBzx5pAjsi++V+58PUTe fYYeAnOd8EJRGPcuvoyLwOVxBJ3RDWNwr6ll4Ak68twflqr/ZC2v06sPPGudqSxvn7fl 6xZg== X-Gm-Message-State: AOJu0YxJhrbr21Up+uysNT1mRdXHty1xyoIddU4JsTYOrkr5N7pJ+twE tGLkZ+pBHh6Jv1YHihPopqYFTvcSMrsVpCf+KngPm3s/3OMpXLe6mylaBkWvSC+0Ypk= X-Gm-Gg: ASbGncuZ/3LdRaxqwgywcH2JIxikPjan8/KGlM+TtBiDnb5D6UqebCZf2D182P51Sav OwlZ0HapPhb07J+qNMaIy5RFzSlTlwRsBrSN1mywGBrWUPeAv6cEA6hbIfE4kQIJrMjzVMugbKN r14mR1dgn3rT2MOkDjDwqDcD6ti4cJFOTPdAht4BaJclS4TVZ/gLreo9fAfxTCcygI5n7s89sEF ymhbJ+8B5kMr+UOypZQYii3xAiYSfD5I+2uM+eUOrtZPBwykzjXiML7sfRJYhB0TEVmsTlDjdA9 Kbt4FMn/Hr37LdH5yJ4d0AMk31b1azPp/DaGfiNJLszPYwPcKwWrGr6Nh/RxL22NPP52zGdtawM NI5SzdiO3K0KIwOx4GT15PwBc0wpdyh6rCjaX3/5UojBCWroSmGov2mG7tZz3BJ4I4ztYSgYV1/ iDbTUO6+OSi3EOMnaCEYQg X-Google-Smtp-Source: AGHT+IF74a8LNFkLt9QfyfMNBZ0VTJJkh3a/dfbAznwGUu6ZpN2eeEXukBDCIo5rNC4Hz9huXbeXtA== X-Received: by 2002:a05:600c:1c87:b0:456:173c:8a53 with SMTP id 5b1f17b1804b1-45b5179cdd5mr53665335e9.2.1755996546348; Sat, 23 Aug 2025 17:49:06 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:05 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:45 +0100 Subject: [PATCH v2 33/37] libcamera: shaders: Fix neighbouring positions in 8-bit debayering MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-33-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1932; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=jkyIf6VT15/NL0QWBEUviS0cZy+665gBkjAmjr6MTjI=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFi8cBG3nEuUupIUu5IL1GsAfs/SH3QzGPT8 xiH/ibit4yJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYgAKCRAicTuzoY3I OjUqD/oCRUts1rWJPnUKeD4TCldVu/w47UAwrboXEAV4NMCiPhyCOoydKo9CfctqWrPVEKCRUau 8XH1YVkepKgsU3fy6GJR6V5ozcngceIYOiuoxPnAcM9n24wQhNQpESK5W7MstxjEBv4tPR4fEnr Xa0B/gXPf60u+2bgb0AWs4cgxl6wn41wp1aHHuXY7fLYanNBkhpujD3jCuOakVbI7rm3FdNtxrb 9LDhlY6dw1MTQQzhV5KqbaobX2LL99GMDx3UW8TBfyAZvWAg26OInkVvZVE5lTLmvNAlxFO0nZi lYVmodanJxGvqIBstWTYyjWvNHNlIcDRokzEhY382EQGcwlMkeksPI32YiHG20XhV4P4Xygf3hb /LvkH2cYGu5HdttaxQTbFapJM7XnpiYVXaUvOWkBP4sCl2x34R/spzQ56tIIjAmWJRyGtXQsjV3 8UaNCHiWAj5YFBU7IGXNP2+wMeXD0lGICZ+dlQBKjf4KfgIbBsPYwCKriOXMjc6IzshqunWjs3Q OtG9D6WUsDwX5D/wnndupIe9w27Wq0QvdNy23kzxLWiD/2THjiIIyJ0E02+wN8CKwzRJrKL7r1x MU9m/WoI5HqTrqd5RlEasGCglpbqgqCXHQZ4nps8eCwuPZj314ZbsivqXfIii8faA7RQN2d4ka7 q5dkIRQEXutcl9Q== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Milan Zamazal When accessing a texture position in a shader, the pixel with the nearest centre to the specified texture coordinates (as mandated by specifying GL_NEAREST parameter) is taken. The current vertex shader determines the positions of the neighbouring pixels by adding the provided texture steps to the exact centre pixel coordinates. But this places the computed coordinates, from the point of view of GL_NEAREST, exactly between the pixels and is thus prone to floating point inaccuracies. Wrong neighbouring pixel coordinates may be used, resulting in artefacts in the output image. Let's fix the problem by shifting the initial coordinates a bit from the pixel border. Signed-off-by: Milan Zamazal Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/shaders/bayer_8.vert | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/libcamera/internal/shaders/bayer_8.vert b/include/libcamera/internal/shaders/bayer_8.vert index fb5109eee3f556e4f4e4e444899eff8d922be573..fc1cf89f2d98acf8ebc4501cadad194fd07985bd 100644 --- a/include/libcamera/internal/shaders/bayer_8.vert +++ b/include/libcamera/internal/shaders/bayer_8.vert @@ -44,10 +44,10 @@ void main(void) { center.xy = textureIn; center.zw = textureIn * tex_size + tex_bayer_first_red; - xCoord = center.x + vec4(-2.0 * tex_step.x, - -tex_step.x, tex_step.x, 2.0 * tex_step.x); - yCoord = center.y + vec4(-2.0 * tex_step.y, - -tex_step.y, tex_step.y, 2.0 * tex_step.y); + xCoord = center.x + 0.1 * tex_step.x + + vec4(-2.0 * tex_step.x, -tex_step.x, tex_step.x, 2.0 * tex_step.x); + yCoord = center.y + 0.1 * tex_step.y + + vec4(-2.0 * tex_step.y, -tex_step.y, tex_step.y, 2.0 * tex_step.y); gl_Position = proj_matrix * vertexIn; } From patchwork Sun Aug 24 00:48:46 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: 24217 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 EB846C332A for ; Sun, 24 Aug 2025 00:49:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 459FE69340; Sun, 24 Aug 2025 02:49:45 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="OBQKZwbW"; 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 F0D1569326 for ; Sun, 24 Aug 2025 02:49:07 +0200 (CEST) Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-3c7ba6c2b2cso301099f8f.1 for ; Sat, 23 Aug 2025 17:49:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996547; x=1756601347; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=y98V/Wfhw54+CkoioSLFFdRNZUBWzOwveM7ePFBUm2o=; b=OBQKZwbWiSQHoWUlPAHe6aC9xOdO/kUKgYmvX+5zok8rbEUJU1X8eAbEcErKXRKyBC 7xy4jgDL5hIRmxJy5noJZdKsD+4Lzg37Ukcs+UvDpPMHONGvHOYLA56WSwTW4YByayft VuODAzvhtFsN3XULQouapnYNZLhOmgXIQSJOPEca6rrRwJ3AFNzfuY+cMPXSsaVjpq6I 3F77W20jjTdEaAS4lBm2S6IQfAoD/RueIq/NhDOLCpg5Z5eQWU9ucUVLaiRBYy3AnmUz MuobKFSdknDqScMMlayPZjEc1Sc2I/C2GYLwrqSxwwaqpBxktacRbmy8TXSCDaCr4ppK Y4Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996547; x=1756601347; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=y98V/Wfhw54+CkoioSLFFdRNZUBWzOwveM7ePFBUm2o=; b=fhQHYMESppeV8z3ZREOOY3T0jAFjp4/1aIhtoS1d+q9p6USdLp/AmNhkinL7z+q23Q tGRxc9ZlL2Z+AD0CERS3kCZO2DSodytHdKo1bM/Can4dlxpruwCvpSEJixd5DureF9sm iVe7ikT5aC2OgSrgGxfHAModFcgK5ZEjdlwg1Xd4jvpBdFuD1KvgB+ugTB3vPyLs3MoE citUYMO1WzruOo+IGmYAltPMgFCmXPdAMDwSGcH1XlfenpC7TgwzlSgVsPcs+SGIP3CT VMXLnuRyCO/RVLLAv79Ogb1eLeE7XhjUW2quFd3OozxFFhqOMosnd57mm30GdIQdUsAv ZQhw== X-Gm-Message-State: AOJu0YwgQhW570xjJeQ83YAs2/qUyXlSii5bSbuVHWDYp2KY6KkhY7NX OhmvNDuXatGAnyafhRXgLDfGZo6s8rya7nHvGiWNQdcUVOvcAbCj2cSJsUPjNZX/L0g= X-Gm-Gg: ASbGnctSy9rcSBnma/X6pzncd6kzSjQ6fiCjspW1+XAXtj07viba2lmq2HQfXh/aINY +cQjq9eB377rK5Fe1pvg//gAZuhtmcC64BjPLflPUGW2pYWI9OBVB1JyoXspPH0utzLL5WFzhtJ UW0uj5jvfFnRqNLkxvCCkzDvdLkrpsJrMbRaxi5Z8810z7aQMJ2pKbQbTBuwGRqVUk0Fe638nH3 2PA9u9EMQv2X8elKl+o2SebpcbPn7psfq8s2nG8ODgZJNtucoMDR0ArIZ6OqQHMp0YH9dxdDaNr P4IAsZki1zOstKgZoypIHt2x2QZ/dImcv18UTFIuppHrMTUzsM1d6Q0BqrwZiNOSQ55cZNxueqA +J0NHOVwkfM1hXAVtlRLG96tMIgoZvQjEG+immx9VuAJ42XG0/fI/LKFF1DoPmycJxtzCidyjCK 3LYWE+TvTswd6wDBwGx0sl X-Google-Smtp-Source: AGHT+IGArlkhupXYgsQjNG4MdbioOyMc+4EZMkfpe65Hae/rUtLg6FKVbuAsi4/GpPfdowXluA+V1A== X-Received: by 2002:a05:6000:4181:b0:3c6:cb4:e07a with SMTP id ffacd0b85a97d-3c60cb4e5f4mr3965469f8f.30.1755996547458; Sat, 23 Aug 2025 17:49:07 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:07 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:46 +0100 Subject: [PATCH v2 34/37] libcamera: software_isp: GPU support for unpacked 10/12-bit formats MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-34-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1983; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=nA+2gEBXhbesAcyA55e+vkj/TQlUo/6L5jrjUpeJ3/g=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFiJ71gXX+WwDBmSTWhQeaF5CcLJSDs/fOXq /DQ13ML0UKJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYgAKCRAicTuzoY3I Og5vD/9PfpFJeUYLqjGDlZlUO5uXDmMqIbgY+HSUZHTiX6wrl6kdVdRLCJBl0+g1f3IB2QRKA2A x+MEznuY72XjUujgK+ZO1OXGPdaSW90N1zHRgtcEY+KA16EZWeRAKPRxkjfx1sS8N5MiVKgScrq 4avQE9tqr/rsfoQ2Xg213tYNnFb0R882DmfKCCXZlbcaNGN7hdL4ZKbZK4hJXs2yOJZY4dDxLgB cm+dq3P/J9NtQgpOmo84l/eAKKy3MVQHk/8pQBJ8Z5XC5iYM/JbFrI6Q3kzqMqJKJuJrMrDwweM vKG3c/OLzj0nPO0Ei0gElCBrZ1ejAQu7m1JZt0GIOqepgWCkpTc3rhmB2coX0BqjnIJaBNI47Y4 z+6HUbBrSXNWrPIfw+z7CU2nXKmmOXfuzt07m0S/CHJo/1B3WhxarqKdMCcqS5+XwMToxSw/v7O cSiBTmS4vw75Qd84xw3cL/A2UnBFMp2EmBUb0pqDNc+lf43Icd7LdrCIyvLszQwCY6FjEu1inds aYMN/pt/Ve2oQ7mhDGT0RAyBf9T4DCJ6pHsBt1HUPko/7UdvLSkwQvIPWkW0MKDImu3XhKhoiLe bm0Q8sQ8KX9nu7Ekz1BgPo/jhzPACxiexX6p4DQP8yZ4qxGW2/TEZuiM1ANniKbKIN+lP/YyGT9 M9/f37e72Nl7Uig== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Milan Zamazal The GPU processing supports 8-bit sensor formats and 10/12-bit packed formats. Support for 10/12-bit unpacked formats is missing, let's add it. 10/12-bit unpacked formats use two adjacent bytes to store the value. This means the 8-bit shaders can be used if we can modify them for additional support of 16-bit addressing. This requires the following modifications: - Using GL_RG (two bytes per pixel) instead of GL_LUMINANCE (one byte per pixel) as the texture format for the given input formats. - Setting the texture width to the number of pixels rather than the number of bytes. - Making the definition of `fetch' macro variable, according to the pixel format. - Using only `fetch' for accessing the texture. Signed-off-by: Milan Zamazal Signed-off-by: Bryan O'Donoghue --- include/libcamera/internal/shaders/bayer_8.frag | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/include/libcamera/internal/shaders/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag index 74ce15096ac0b8a221175d111d982d1222b7db38..78c2609c26d115e9d7522cf18a3ebbb7d82a7267 100644 --- a/include/libcamera/internal/shaders/bayer_8.frag +++ b/include/libcamera/internal/shaders/bayer_8.frag @@ -32,9 +32,17 @@ uniform mat3 ccm; void main(void) { vec3 rgb; + #if defined(RAW10P) + #define pixel(p) p.r / 4.0 + p.g * 64.0 + #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y))) + #elif defined(RAW12P) + #define pixel(p) p.r / 16.0 + p.g * 16.0 + #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y))) + #else #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r + #endif - float C = texture2D(tex_y, center.xy).r; // ( 0, 0) + float C = fetch(center.x, center.y); // ( 0, 0) const vec4 kC = vec4( 4.0, 6.0, 5.0, 5.0) / 8.0; // Determine which of four types of pixels we are on. From patchwork Sun Aug 24 00:48:47 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: 24220 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 CAD16C32BB for ; Sun, 24 Aug 2025 00:49:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2BD0269345; Sun, 24 Aug 2025 02:49:48 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="lvxMuKEd"; dkim-atps=neutral Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E5EEB69328 for ; Sun, 24 Aug 2025 02:49:08 +0200 (CEST) Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-45a1b0cd668so17315795e9.3 for ; Sat, 23 Aug 2025 17:49:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996548; x=1756601348; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=/20L6tlWwYRY8DTJuz1yDUOAn1XNk35+RBXylKD+rFA=; b=lvxMuKEdYpK2d7zYrz+HaPL/01LLKyFJmd3QE34H0Pz2br578gWe0SdxYk0O5bQvf+ 8nx0Y4l78U2+JZuEkhU9qeSkiCTTz4fIIq15mEPPdunyE87wxlJ0xESM37DcPrm/ykwM CFAarHtR2yTNnK5xlyIIaekR4/Z3lp3l9AHD84GDgAGhHG4OWI0lRVc8VEE0tCesORO3 Is2o8IKQnOnI6PBxFSOfKxpzFtJmfxWaZESqKSnBpXh82cfdfX9YRWGIv0ucd1YEYC0c 8oyl8qESgeUXU8xhv533ip9yNxi+DD6MD+WTgzF/taqsQ/SUi9OexD2jsJ8VrAuHEuiJ nuAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996548; x=1756601348; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/20L6tlWwYRY8DTJuz1yDUOAn1XNk35+RBXylKD+rFA=; b=FR9ZuaX4opDomwvvbnOC+1O2m7irhJuYsa8xcWUrHeqs/R4lCDgT8VjFF2fEYkJZHF +dI04JRv8hUYyeWEwsq86mCJrFoVEKz4GmNMvramXkFDT73+YVq4LdZuZ+kk33wS7joO //7vrIU6EjUCriykfcrQ0xhz4k68E/U0y6T6OZUhqSVNlnfeJmkcVeSvU9wuyd7qNxFB thjkIjPbE4a8ljE2924e3EcVcmMW9Z585+2z/O5RSLIQ2zzcWN0iyc+J+AS3KJBKAOoX WnSi/QRjFKxhvmd1hVNILE/lNP4WY2+MBfGrkwYbu5b9ZIPEcXglPRTdkomIobniB2yj kNng== X-Gm-Message-State: AOJu0YzieL/67cxEXuC1XKDNbtm2M+sP34Ml7uYr1W0MsQbMKC7cB5rA ce4a1nUv5i3uV5eTEx1IG0XrgGoViHX5BQL0zY7T+FMoacElwcZthZLl2/DBXtolmKM= X-Gm-Gg: ASbGncvY5YlqVzhKh1uku9k081mcBsz6YPzFK4IYzVd2OKWiuan7h1wE/vB71Z4l3Ka 2jQ+I7jpAfNwJGQcs/AXbYoWkXFX8Vxj/hSiqZnAHxg9tGMT3CWgPVl+FCQuPXqMLCY5UpH1pJC P3agd6AYkuHQxkMWyo15FXQUjxM/Dx39gj4lb9PGc6emdHjrl/JVy7ofjQItjUe79r5zyFXTdvj ZrSiROiJ4/ZIMO7bL/KGKqnAY3w1kHNNuMxA783nB+nifaBMG+t0zMp1yZfbK99AbdoHHmzfafc r42ayHEvJMNCyTZcRDaT94SF0SHdf3U8yRTkJTuXU3liv+VHrpRFVJkbDNOCoN3EEX8sePoPt8n khT30z6h1vErgy75tkv/vFPc+DkgAhTwTyZUFu/nhiEMiNFsoRZVPT9bdK03MpN650st3E+IWm+ BNevfIL1e2jpMBd51eQgBB X-Google-Smtp-Source: AGHT+IEoi3qCLFocZrehiwxSFAFr0fz3ssI2gs1Sct6GYXBtcHNxL2qMbpoPdXMBKPl9fJNXlOoLoQ== X-Received: by 2002:a05:600c:4687:b0:45b:47e1:ef71 with SMTP id 5b1f17b1804b1-45b517f8e7fmr62114425e9.36.1755996548467; Sat, 23 Aug 2025 17:49:08 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:08 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:47 +0100 Subject: [PATCH v2 35/37] libcamera: shaders: Rename bayer_8 to bayer_unpacked MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-35-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5027; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=IVK2WYEtHjy9TXfF8vGpMJ8qVd56wUL9Oe+1YL++eaA=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFir+ayVXY3yuTjtQp+DlZrar520kT73UOK7 xSgOLd4y5yJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYgAKCRAicTuzoY3I OgI4D/9zkgFS4p9cBsWKhNMw8Dzn7apX+wlYVaYlu3wqOlVqurWX11SZ7J4KL8h+7mqbtu+59dC Gd0qfxg68P/m+ps6lS8ukaVmpxiy1Il0b5QGClmHOnys5XWV7imcw+blG/Y6FiMivufEkbD2H58 UVcPdrPoNOd9LG/H75csDQk32vV+STaz4UnMY5DiKRaQ1/f66Gbv049JLduOMzeGHWuhlSOCYbN iDjRLsoFlvWNy7rmSTo/hy0DV9r/szA9sBnFaupWz+LJ8wGoO6dAUkQYHTEIoKWHrKeLOAazsRP rnjiuzY8Hi6wZrIBYkURmAMsJWLLH5pyFco/oHEY/6QGvArEJlfLaBwG3VJQRwuxAx7dwHgne8V 9GpLz/sdOD+qg2RAy6MFVN1ugrmtQF97cWx/djrX7y2HjsqIL6Az9GGrGTiVeVv6pFOst4xCBv2 czVykFK7vjyDGgPdJOjgeLREsgRcctyj3Ecp4EjwpFr7dNnEk1p4K8FysHUi/L1BeGhMTxAgvsJ OsdiInvcRJwqXJrKQvcl7PqAhQYGv1TGKkMZN79lMscSQ/tkvqMyEs8aea/DIh1Dd4x4Ds/6Lsn q3Ro3MaI7lzJRmgGRpj4icEoBcwfFZ24x2zDM83MHhlXVHsjy2PEWVJjYc2DixzsULdHSfEcUma lI4T8Kaj2dC93mw== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Milan Zamazal bayer_8.* shaders are now used for all unpacked sensor data formats, regardless of the pixel bit width. Let's rename the "8-bit" shaders to avoid confusion. Signed-off-by: Milan Zamazal Signed-off-by: Bryan O'Donoghue --- .../shaders/{bayer_8.frag => bayer_unpacked.frag} | 0 .../shaders/{bayer_8.vert => bayer_unpacked.vert} | 0 include/libcamera/internal/shaders/meson.build | 4 ++-- src/apps/qcam/assets/shader/shaders.qrc | 4 ++-- src/apps/qcam/viewfinder_gl.cpp | 16 ++++++++-------- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/libcamera/internal/shaders/bayer_8.frag b/include/libcamera/internal/shaders/bayer_unpacked.frag similarity index 100% rename from include/libcamera/internal/shaders/bayer_8.frag rename to include/libcamera/internal/shaders/bayer_unpacked.frag diff --git a/include/libcamera/internal/shaders/bayer_8.vert b/include/libcamera/internal/shaders/bayer_unpacked.vert similarity index 100% rename from include/libcamera/internal/shaders/bayer_8.vert rename to include/libcamera/internal/shaders/bayer_unpacked.vert diff --git a/include/libcamera/internal/shaders/meson.build b/include/libcamera/internal/shaders/meson.build index 386b342d03b106e8303121ae9b84b2d2ee4e96d8..dd441a5776700f6ffc17eb9e73652d728aee02c9 100644 --- a/include/libcamera/internal/shaders/meson.build +++ b/include/libcamera/internal/shaders/meson.build @@ -4,7 +4,7 @@ # for the purposes of inclusion in OpenGL debayering shader_files = files([ 'bayer_1x_packed.frag', - 'bayer_8.frag', - 'bayer_8.vert', + 'bayer_unpacked.frag', + 'bayer_unpacked.vert', 'identity.vert', ]) diff --git a/src/apps/qcam/assets/shader/shaders.qrc b/src/apps/qcam/assets/shader/shaders.qrc index 04f9d7061b16d0bcd6c1fe1aceeaac97bf0fc295..32dfa51bfef01b3a80a4255fe83807f9b76cdbf5 100644 --- a/src/apps/qcam/assets/shader/shaders.qrc +++ b/src/apps/qcam/assets/shader/shaders.qrc @@ -6,8 +6,8 @@ ../../../../../include/libcamera/internal/shaders/YUV_3_planes.frag ../../../../../include/libcamera/internal/shaders/YUV_packed.frag ../../../../../include/libcamera/internal/shaders/bayer_1x_packed.frag - ../../../../../include/libcamera/internal/shaders/bayer_8.frag - ../../../../../include/libcamera/internal/shaders/bayer_8.vert + ../../../../../include/libcamera/internal/shaders/bayer_unpacked.frag + ../../../../../include/libcamera/internal/shaders/bayer_unpacked.vert ../../../../../include/libcamera/internal/shaders/identity.vert diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp index 70f600650b7b925f10d2f699e6498a6cbd0a238a..95965ab7170e5ea951869dda83537ed0bca9978d 100644 --- a/src/apps/qcam/viewfinder_gl.cpp +++ b/src/apps/qcam/viewfinder_gl.cpp @@ -235,29 +235,29 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) case libcamera::formats::SBGGR8: firstRed_.setX(1.0); firstRed_.setY(1.0); - vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; - fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGBRG8: firstRed_.setX(0.0); firstRed_.setY(1.0); - vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; - fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SGRBG8: firstRed_.setX(1.0); firstRed_.setY(0.0); - vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; - fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SRGGB8: firstRed_.setX(0.0); firstRed_.setY(0.0); - vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert"; - fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag"; + vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.vert"; + fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_unpacked.frag"; textureMinMagFilters_ = GL_NEAREST; break; case libcamera::formats::SBGGR10_CSI2P: From patchwork Sun Aug 24 00:48:48 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: 24218 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 BE968BEFBE for ; Sun, 24 Aug 2025 00:49:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2D9CB69342; Sun, 24 Aug 2025 02:49:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="XZkdN03+"; dkim-atps=neutral Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2646069329 for ; Sun, 24 Aug 2025 02:49:10 +0200 (CEST) Received: by mail-wm1-x333.google.com with SMTP id 5b1f17b1804b1-45a1b0c82eeso27029845e9.3 for ; Sat, 23 Aug 2025 17:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996549; x=1756601349; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=DTTcwJfG7ak8JDbsC+gvp8t3BtyZQS47SSilc/BHVNE=; b=XZkdN03+Qy7eNNNE2y0OgCOvuFCRkJFKhlD90YkwW4KuJt02eZ94BzYh518sdjWVIo BhYU3A6H+cAH3PQZS2WqzH4WmZo8Usr+k0wQJObkri48UemwxhYP4wDa0s7pcRWuc2PN 88U2zF4DZIbOIuVSnTgUODaO+8YJuTDQRhxWGRpGZw9+BIeki4nNddEYsz4rd5QCj0S4 U/RbwBAuaID4OXtHgHvbA4NA9aR+8gXcErWRnxTuocHN/ltnJAdgFIlPgmJswxGpOLaH jfTs7itXmf/DJNQkS7/UdfQcNz6HNoc96c72m1E14yrh60c5dE6fbRHPzhQ16OezcmyA Gyhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996549; x=1756601349; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DTTcwJfG7ak8JDbsC+gvp8t3BtyZQS47SSilc/BHVNE=; b=tQA1DoCWQNfxP1n24/3QCGGZn6VkKDPw4u4qpzGLkcosgsE9mH9BfWs9zqf9uQ10pX i4vg9/GpE1Rpcml4wL+1Of1WMJOC/kU/QwGHp1xXeZ+E6/X2tyeXe15/E4vAef+WizuD 0i1lWUAc3p30xmTpv0xoBojxXAC6UodtVlviGmoqHfRIQnR/IX2/PYOrfVJM6L+FlCrc 2NWL+njAd3ewIEg7G6ko09oFNvm/sg+HPHvaWkoqMJBJ+wCH+wue4bZ/4v9GW4M0bJ0Z 7S6YhPl27t6eiweN3WFS1RZ6zJ6vRoWdRomQ0EKAOVOQ1pc4/GagZ6hjbc6lhT08rgRp CwpQ== X-Gm-Message-State: AOJu0Ywr3h1XiGRX4IVblsTEA3oPoZ/9ao2tvEQRzqLPt22Q0zStEDoP 4zWR3ajWFq+LmjzBPSRAChfOn+z02DCa1UKtwrCAveCAc48j5TlHq1LM3qRK0+hIm3pvXLp3lCo w0MtQMnA= X-Gm-Gg: ASbGncubyNDk4EKbPcgs9Ew8fGGlS4p5rNUd3x2tiAHN1h5ePB57Pu06i9NhBldNjEm BW9KHzwNbYtb8y3uvw90Wwgb/F+MsawRzU+SGFSve9rr/JQk6Xa95HutdvnayD/Ac7LOfP7+1hm AZMoLInCjVvK0zokwqsIQ6+cEynT+IOkWFJwNntBD0Y8j1z+xYUDkVzUmqvaqBCQyo4xDO81JSq 5KS28BnVsGmsjRTDCenuLu6BcGtx3M8AcOTK2FUkxsu85ucJkpAWkZM9/pFvrgEaA/B1msCpxpK CxRloavGRA892efnyLm8bx/mMk6q14TFnM7zKLKwaj2XS0P7bx1U69eDk9nY+8q16nuWnqaKjYQ 6IRS5GT5vtTphqY8f/BxgAO+anBFp916VmiqnqwThz+dnDiXOjDtb+ut3hkNuqryPw/RayXvpoO 9AcSHb2N04wlv9eLbsYMiv X-Google-Smtp-Source: AGHT+IHxExngAvTts5eFr72F2OqlFav1cKsrzg4+O3442fpQkH5wQYkFeve3xd3u2gXQf1X/k4qs+w== X-Received: by 2002:a05:600c:3b2a:b0:453:2066:4a26 with SMTP id 5b1f17b1804b1-45b5179f3d1mr90594065e9.16.1755996549319; Sat, 23 Aug 2025 17:49:09 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:08 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:48 +0100 Subject: [PATCH v2 36/37] libcamera: software_isp: Add a gpuisp todo list MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-36-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3052; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=fkjJdxpwJCUqkX+i6uEWQGqq/pTEpLO+hSigKW03abk=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFifMwU/iPZVmSeEQPpeXThnFXdg8dMtnCoN oL0+CMes5GJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYgAKCRAicTuzoY3I OkhFEACT/4I0D0wz+IL3JLsvDp88MQU2iTV8CpoqWWLi2fHPnZSPlwm+7FaAtYjELHFvw8BnUuI B1GUTenXy4GzWB5D3h/kcVIqQ70qyASAdvf8O7EAQAyc9roHtnoiwERo9HKxFruwnYE9+sxqgoA oAF3/VMzYtNbFqT2+jFDpSlzhmfFlblDLEmg7QGCIroJBRLGck0+RAiom284erBdApIRKMhKu1A cO0ix4kphZRsZ2ETN29F+WKca02r2ndqYFfryj4nnkyl2zUHFoFYaCqGIIKKhqDVxKG/5PdwImA NYu5IRwbcyDut3vB0eKg9XAzAkwKvAM68RKYRCZ6SdTXfSYyxdBBUb6KXXy2n7bTMrL26DJ2HHo sEyyChkV/F3ik+UVhmU5A8f6/UrTdGwJoWU6gZO6LrxelGGHHtA05sR1URXBe0PL+GhHgpYPhos wT1pUUpGd8/fF1mOMPyzlAag+RXhJEIHlqHId7nNKX9DMRUrcrSxC4t5z5WY7v1tLcIQs9c68T8 HQRXFWB3cTTna5f6zxGFCkOruSkeRpZv0Z2VralO8Ml35iFsgnKP2tTbYow3EHwRe7drShKe+ri Z1Eicw+GL4hIKIglTRVTuIHKMYe9YdlEVQmIWyzoYizCNod1KvDdE5UA/Vm4pXQO0/qvcjtNoFf rCQRtmRV5I5u8tg== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" List the series of things to do in GPU ISP in perceived order of difficulty. Signed-off-by: Bryan O'Donoghue --- src/libcamera/software_isp/gpuisp-todo.txt | 61 ++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/libcamera/software_isp/gpuisp-todo.txt b/src/libcamera/software_isp/gpuisp-todo.txt new file mode 100644 index 0000000000000000000000000000000000000000..d283959c3ee2864f8ec3534107938505ae858c61 --- /dev/null +++ b/src/libcamera/software_isp/gpuisp-todo.txt @@ -0,0 +1,61 @@ +List the TODOs in perceived order of ease. + +Version 2: +Make GPUISP default: + - Right now the environment variable allows over-riding to swtich + from CPU to GPU. + - Once we support 24 BPP output on GPUISP we will have the same + pixel format support as CPU and can set the default to GPU without + regressing functionality + +glTexture1D: + - Initial code was developed for < GLES 2.O but since we have fixed + on GLES >= 2.0 this means we can use glTexture1D + - Provided this is so amend the shaders to do val = texture(x, y, 0); + not texture(x, y, 0.5) the 0.5 is because of using glTexture2D + +Denoising: + - Run a denoise algorithm in the shaders + - Supply a control to influence the noise-floor ? + +Dead pixel correction: + - Add logic to correct dead pixels in the fragment shaders + +Version 1: +24 bit output support: + - Take the BPP we already capture and get a 24 bit GBM surface + - Pass a compile-time parameter to the shaders to tell them to do + gl_FragColor = rgb not gl_FragColor = rgba + - Version 2: + This is not possible. + gl_FragColor expects vec4 not vec3 on the output. + If you really want RGB888 run cpuisp. + +Surfaceless GBM: + - We get a GBM surface and then have to swap buffers + If we rework for surfaceless GBM and EGL then the swap buffer can + be dropped. + - Version 2: + Complete GBM surface removed, memcpy() phase removed also + +dma-buf texture upload: + - Currently we pass the input buffer to glCreateTexture2D. + We should be able to make the upload of the input buffer go faster + by using eglCreateImageKHR and enumerated the dma-buf contents. + - Version 2: + Complete sm8250 test platform shows 20x performance increase + with CCM. + +Render-to-texture: + - Right now we render to the GBM provided surface framebuffer + and then memcpy from that buffer to the target output buffer. + This necessitates flushing the cache on the target buffer in + addition to the memcpy(). + - Render-to-texture where we generate the target framebuffer + directly from a dma-buf handle will mitigate the memcpy() phase. + - It should be the case then that the consumer of the output buffer + i.e. the thing that's not libcamera is responsible to flush the cache + if-and-only-if that user writes to the buffer. + - We need to flush the cache on the buffer because we are memcpying() to it. + - Version 2: + Done in version 2 From patchwork Sun Aug 24 00:48:49 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: 24219 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 BF533C332B for ; Sun, 24 Aug 2025 00:49:47 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 41B7269337; Sun, 24 Aug 2025 02:49:47 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="vKS0OlIO"; dkim-atps=neutral Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DCA106932C for ; Sun, 24 Aug 2025 02:49:10 +0200 (CEST) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-45a1b0bde14so18322595e9.2 for ; Sat, 23 Aug 2025 17:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1755996550; x=1756601350; darn=lists.libcamera.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2etWwA6J1SYpTDI5CoVSwI33oPVBanpyO7HgTRHCDS0=; b=vKS0OlIOp/J8EswmlDaTIH4rhprILb2HKUE6RSRZI7FH2OaFWGSiR6gGRQso2t18A5 62RAabOsdmgcQ1GEKny0obAQyFeyXcn8wbZpoxT/2VOQMCLsud+52ETefu+GHbeag/eo 8gFbHaI0RaVBmxDfLxDBRtlcyQybSeeEXs62pgY4SQB80J2xmUV38APEymES+SxdPaCy ql4l6HfDWFJ1ud0zlD4q1oks4JyzkNnM7nOsVtoZ1wlO6HHb0wPaLMlnBy6Lu8erqoZ+ vTbprfWt8r8Kdlg8vCHbI+B30nxY9f/Qf6SBW3zNd5v/wYVUxF+3xopwjfNVhquEjrjE j/ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755996550; x=1756601350; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2etWwA6J1SYpTDI5CoVSwI33oPVBanpyO7HgTRHCDS0=; b=OGDYh25fn2VWRrqcBVmdLrOBxipMU5Zoer+AyufTPqyGRiHcPrYd5vAFRVS+wV9x2I bruJMbwiWfaTNJQRXIrgMsKHHuUNmosMbZRD1+/kH1tjVYLVwpkz+PVMZEFvgVUHLt5t u0cEVGT8LdAmprGWutLBKuZt5l9PVtssp9xcX7MJDVmbnyNQf0WYKsXvao1JZP/VV86e i3dGqipwgQ+y5VPVPfxy1VwI31QchnMz4FukmRa9KD/GlwZu0R/rQOiuI+8XA92GaYXR df0dPVshcrVVjFppQ/Ob3DfkCtimp/MXn8XH8ERKfNa9Ufwv8TjKa3PBMB3hij8U3wwY HSyQ== X-Gm-Message-State: AOJu0Yx3uR5NkCvPJw0q9LWrV7Fuav5PWyaSSQr+0yLBVTrSvUUz2Cor 4YA47jTKVz73Qy7eCaOKXzy7Q6IeJFmZcuwuNi+aTwOSZxK4eqkh91ZAJXJA0da4cgQ= X-Gm-Gg: ASbGncuGtHfBHl3s/9CjqDWghzdJeE0n13GcSdYZqQ2dF5dm/GOiTd2lH1ODp2lkQ+7 P3bneDDqiWXC10ZD5bJkXRVVPomObZxXySAhs/XZnwNx81V2u3cx0INnQO1bLxqTVaGPRY5ubli 52Gt7KgJ4WMZj2/si8tlJNbRYkaku/SOsBp7TYZzrHZ3gqGqigbaYspK4jiNeIS2+lJn8bN5jrf OXseIHFdc54m0nhxj8Drk4yJh2Spafc+JvLXrc/xsdra1VzqGdti/ddItJTezQzYJMGeZX6KxK5 ZnqiJDEOJX+Xshr12wMqsA2o1A4PKMOR+j5BOwUUlZSjC8Shiu/tPgAt41u5ytZ1vj2/YgLrxH1 MuG7VoyGpqiogSx05bfTTj5Xl18tyqjeAELZLJNk+8RCZfzSx5hASZHzya1TGgKu17AUCo2oXjt sWnVfzNmpRzgK2EbfrJqheKzKRwrbB0Y8= X-Google-Smtp-Source: AGHT+IGYxZTEaWf1wZW5sT9kXdfmPIgF4YtTManMjAXTaOuv14+p6lTd9Idlb3dFaG+PUp3DdGmF4A== X-Received: by 2002:a05:600c:46cb:b0:458:bf7c:f744 with SMTP id 5b1f17b1804b1-45b517c2d5fmr54970585e9.32.1755996550418; Sat, 23 Aug 2025 17:49:10 -0700 (PDT) Received: from [192.168.0.13] (188-141-3-146.dynamic.upc.ie. [188.141.3.146]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b4e1d530esm69347225e9.0.2025.08.23.17.49.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Aug 2025 17:49:10 -0700 (PDT) From: Bryan O'Donoghue Date: Sun, 24 Aug 2025 01:48:49 +0100 Subject: [PATCH v2 37/37] libcamera: software_isp: Reduce statistics image area MIME-Version: 1.0 Message-Id: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-37-96f4576c814e@linaro.org> References: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> In-Reply-To: <20250824-b4-v0-5-2-gpuisp-v2-a-v2-0-96f4576c814e@linaro.org> To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal , Kieran Bingham X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1809; i=bryan.odonoghue@linaro.org; h=from:subject:message-id; bh=bRnKLUJjXpxW5OOLk8SuBI4fSZ62DWkB8yvaqS8TeDk=; b=owEBbQKS/ZANAwAKASJxO7Ohjcg6AcsmYgBoqmFjiqIo2cIrllvz6JtiqpJNEwjIjEJEx39Pv rHrBe7nekiJAjMEAAEKAB0WIQTmk/sqq6Nt4Rerb7QicTuzoY3IOgUCaKphYwAKCRAicTuzoY3I OuPlD/42q5/hcPeEsjKWvhxHAiHGIpYAf80gyme+F6iN6ie5Jj2aJBUdbXNcnJDgmdWTFaUWC71 I0px3JYxyys/nclOoXNbdDhyauYSSvQx6fMveuBe0qpJTgIJM4pN022AP9lCn7j2tfvsfQVTqma 8QJTpu97yda3R1ll+rLW3BUWcqkUQA/xoOzQoOxzbDnJtNGYhPBZAstKkjSFiAowQTX+pkV82xF jomi/VtRh7+JvwZtz45rPiPFTFn2/gZO9hMJu3wek+fs2nPFJQrbuyUf8ubuENAPmwvNNcerXoz AeezR4UaPcrbVkYdS/EtVaoPQGB8JH9a8bGOfoENT5E1DSMlb9HLzQSuFrrTZYk/5wFckQ9J0UU yRW0RlRz26ZXtGI1j7Kt9+pgfucMyUb3qDMnE3vWJ1SnYJ7EhPFd9L2TfJMPybKG9nsqIp77T3L 0zpD1isFPAxdb4PTh8Nozcxi7PfpQWqi355oeAUj+VgLYTwdSOJ8JfR4lQa1vGa1ECY/UFqWaJu LqbAP21kP5Off0cWY1RUe6HRc2FhfvCY6w5gqVd9id8hgMqd93KS+BWa00Kwegn6rbmNL/VHU29 GuizFeQmkkmg/NkSMNdHojFXWeUPCG84dhMZoMKmOjUtSK+yS1Kd/trM3BWi6JaL8K4WvnNdHAl U7kcODz+fW4J6MA== X-Developer-Key: i=bryan.odonoghue@linaro.org; a=openpgp; fpr=E693FB2AABA36DE117AB6FB422713BB3A18DC83A 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" From: Milan Zamazal The statistics in software ISP is computed basically over the whole image area, although only on part of the pixels. It is not necessary to cover the whole image area, it's sufficient to compute the statistics let's say over the central area of 2/3 of the image width and height, which should be both sufficient and faster. The speedup is not that important with the CPU implementation but it may save CPU work more noticeably with GPU debayering implementation. Signed-off-by: Milan Zamazal Reviewed-by: Kieran Bingham --- src/libcamera/software_isp/debayer_cpu.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 7bd1fc39266f651845cc7a87ac991aa67c36c094..b19d89c1cae04104d6d8377555b306128e700f62 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -526,8 +526,13 @@ int DebayerCpu::configure(const StreamConfiguration &inputCfg, window_.width = outputCfg.size.width; window_.height = outputCfg.size.height; - /* Don't pass x,y since process() already adjusts src before passing it */ - stats_->setWindow(Rectangle(window_.size())); + /* + * Don't pass x,y from window_ since process() already adjusts for it. + * But crop the window to 2/3 of its width and height for speedup. + * The speedup is more important with GPU than with CPU ISP; we want the + * same implementation on both. + */ + stats_->setWindow((window_.size() * 2 / 3).centeredTo(window_.center())); /* pad with patternSize.Width on both left and right side */ lineBufferPadding_ = inputConfig_.patternSize.width * inputConfig_.bpp / 8;