From patchwork Mon Jul 27 06:41:52 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Qi Hou (OSS)" X-Patchwork-Id: 27509 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 2F268C328C for ; Mon, 27 Jul 2026 06:42:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A744E67F53; Mon, 27 Jul 2026 08:42:05 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="E6MShwZ3"; dkim-atps=neutral Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazlp170100001.outbound.protection.outlook.com [IPv6:2a01:111:f403:c201::1]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4558867E5C for ; Mon, 27 Jul 2026 08:42:03 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zBVrQ0R4yHeAMnqxOfNz8QUocp0xssZttvvVY7Fx5DPWe9u9GbbapmmQpCGvzIF3E/sSS7+nP6a4FIityg4alNis/v9mHVhS1M64kjITGFxaqaqtoT/7WH4cb7eP4lMsUu/EzzqY45UAnXePjB+bJ7hGgDltKg+3cNDjIxxAqpBddmFCqf800OaHiWJgZ21CBAg9uoH1a8LKMmKE7QLWjEP3WYV7QLiMAAFew8zChklesrY/F/6Jccjqg+e+ENUKLvTwLH0LdzvXinvt6qSi9vUl4f3Ll/E/sgsfBCCKZjo1mTxrz6SsRoDlaFP9z7upTQXJV6epA2PDglnPLZQVGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=fNstNEDLAmXTpCbIGemiGhK8Zjz9nZdx/91cBsDlQVw=; b=ba/JogmmXyuq6FxUn8eroFDDnTvCYOxhALJcsulvgHJSvn7EYRm7zXByI0pKvk2lXzXz5WepUCyqcx9ZvxV88Qiqfq3KZ69Cz2p/KC41focyBXMkOHq/fw72Nb/Ga3EMfSBdeXe2YOGjO9PdIiYNqtrTayVuV7SWhL1yMOIl8GKSqVdERcwnVZ8wa1mzDXj9cCaRfX3fu2dEALXVcbyLlHfnAWVcSQGAKUacGpxHTH6C6qQBedcgcD2kwZEJXvfbuWrB7qPjosc5ALTlq7MexJshHzyw070oEscck276vPcNBtPBwt4AZMLCOwlkaCQV4B4LNliWj97RM3vgSUGwaQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fNstNEDLAmXTpCbIGemiGhK8Zjz9nZdx/91cBsDlQVw=; b=E6MShwZ3kCGc87JIUSzogddyQkUXy3zMjd2/99041MSKBqrMI7EGAGu5Wl46HegFa/6izacQomfZqkCgHW6/zLx5uuV1yE3KFygXyt5/BzlK7fX2JgB61VBZ/cMg44HXGrdJr071ruf+czm6X9f6uyonzQtIxPid0CtCcoAjDcm8xCW3dCTXc3lg1Ruti1J8ZWtz1u9U3wdYuM0IizXQ7iiwtzo1pbjicckS92vOC0aRFtNRjgim+ARTJ2RTIdeIc7grWwTg4X9lGMq4tUeRLECR+9sjgAISFbCQI5yVkLBpKDJrXsRR9oHOGMFMlq10XIBUhFOaRRjoOF3f4WIZyQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM9PR04MB7556.eurprd04.prod.outlook.com (2603:10a6:20b:2df::11) by MI3PR04MB12659.eurprd04.prod.outlook.com (2603:10a6:290:80::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.245.13; Mon, 27 Jul 2026 06:42:01 +0000 Received: from AM9PR04MB7556.eurprd04.prod.outlook.com ([fe80::8599:94b0:43ea:32ed]) by AM9PR04MB7556.eurprd04.prod.outlook.com ([fe80::8599:94b0:43ea:32ed%7]) with mapi id 15.21.0245.012; Mon, 27 Jul 2026 06:42:01 +0000 From: qi.hou@oss.nxp.com To: libcamera-devel@lists.libcamera.org Cc: jared.hu@nxp.com, qi.hou@oss.nxp.com, julien.vuillaumier@nxp.com Subject: [PATCH v2] libcamera: egl: Pass EGLDisplay to eGL constructor to avoid double init Date: Mon, 27 Jul 2026 15:41:52 +0900 Message-Id: <20260727064152.2161526-1-qi.hou@oss.nxp.com> X-Mailer: git-send-email 2.34.1 X-ClientProxiedBy: SEWP216CA0034.KORP216.PROD.OUTLOOK.COM (2603:1096:101:2b5::11) To AM9PR04MB7556.eurprd04.prod.outlook.com (2603:10a6:20b:2df::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR04MB7556:EE_|MI3PR04MB12659:EE_ X-MS-Office365-Filtering-Correlation-Id: fa3a58d4-2711-4c57-f094-08deebaa2986 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|23010399003|376014|19092799006|366016|11063799006|10067099003|56012099006|6133799003|18002099003|3023799007; X-Microsoft-Antispam-Message-Info: AGOu+txlNRuLQFaQyO6XqhKBDASuSxmYjTEbwlFMN9/Pp6FOEK39OwtB+vNvQeyyZm63naBQzOWbyzaPBMNk4ED3wvT/DeKCpZ7B+nWcs2P5DwCuKhN8YmoavJtdKWZIbp2pz4kY6FLgqQ9/2WW1gxuPuGcoye4CsYi4tqTuG+ejyxvbBG0yGQ1OiTPkRMj1Sv3er8z8VVojnsy7TPcu8kZ3tlkQV98wOYvz4Fk+M+aA6Q+xtuNyVmR1Zj17iv/2F+S/u5VJ1GK2/QDDh9XXC7IWt2jYqlQZSTvHBBFw1jdcxKZuTAijwAGZ6oJrHLV6lGcxgvSXF4/hoyhbdTjsQTrg/Uy5/6BrL38mA/MRHW5kTicil6Tv4UGDb64WD7Sjh9MKVUIDaROPidez/iPH7hTaqEaUP3qvFDlTPS3vRUig7XVIfTc4s/E+SWZD/YJSA35PjuS2hwRWi5j53Gf1P09NRMDJ8jyqUedQqf1KSDW9F/Ad7SgMnOggFhBYeinpDMjTWMzvnUzo/+LUJYKRqfrEPkZKL4M74K9N0v/4eEZ+JirZ2QV6J1WhY2pKGadycH/tvFLOGrbr9MWDGi6ubD6a4n6wEPvqsPW62T4fJLL+iD7VhAJ8vY52p3yPgeWc5QxfKDIoN+rRCCk2v6gBI0/PbtWk5IhneiFWZHxgZBs= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM9PR04MB7556.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(23010399003)(376014)(19092799006)(366016)(11063799006)(10067099003)(56012099006)(6133799003)(18002099003)(3023799007); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1Z4pmrsrUnYdSxu1gOurBfBYl3TEMzidAlihowxXUFrwvplJmnJwml3WsNOISzLYgA4CMAZZHAz6lm2IlcW4ILbtZv4GK5vrPnUbCP2xq5HZIeYTAEfyUNAtQ0QgqJ9Vy4cVMDNxM5jyHb5GQo0mzj2/dvKPM8Vjx/oqvwqNPUNTz7tudT4mgpJO5QRfhi4c3mpFV7n/kdX9NNDeXL1ifCX/gL10ExarmrrfHkQPDaQ4qLGYXzRizhBd+gmJDse2iE443g4M2Ua0yUKxvzmhO7HrWCxVz7vKOCY58comRTghnVGkxlFTdfrFZurtbKMZbPvD/8dVvNiS2cgrl9PNlgUn7bMJgRO/ueTU86QRcCT6tstoPUFIY5EGstm9Rzlb+9zJCtprvoIseExOfkXDE+HzxSVZYSoaNIz2IOcAILN+Dhqbupie34YbjLM/BGRluv8FkCEKtnz4w+pFJUlHzP65X1oNETy56DrVCo0dli7KW9gBlk7vt7Tal+F7voPI4ajLFqevDvWhFbC/EWRowpbHiduDaTc/08pgg/yT6l+CcwZ315AhDvmiaVWvvANmPht9cYScK3IlaqsChJU8zQdVSrDK8eHgO21aSnAyPsYXWV/KuAoP8PQIs7yNWk0Fdi+7ElXkrzJUlP5e3mYlgciHJYu4iQlqRwgOdmgDrsPMxah57nXW5EFzQZR0yGdNEm6mycFZgVYVS2msGo2BNbpAhMo7UniG/o2WRls7lgu66QVlzq4pPp4TYOLCaClBeHuf2ykrWk51IEzBF9kZDzfu2ffJJCOwQIYbsG+1xRjqxUygt2LuGqVfPtEP0/p8mxqPvnGvjYL0uBU77FuSJl2zLevG12ur6pWQbsxmR6sZ4JId2IPrd5jYAGwW83b7QMqmdhm+ecuiLoIdkU+JmF3PL2Rftjyvq6r8vXq47avMIREm+fQQ9YbsJ8SEY5ji4EFTJn5NjIKaGxF2mTEtIwj0wsvHeTK7c8P7f62QubILs2tQ/21bz3ArXFP1r26aDLo8VsoVtDlJEBm8mqXppOiibv/Qe8zVuoqx/SSBhl5w/nGaP8ep6XiAnCc0Ur6bYQE0sdCJyWS6+nfsWZdigaK2xv+pSpHZ8Tk/dgtZzcLwCDeEhmGZK6Mx0p8HaZ9SaBnMVxcShq/ShmXGD0OrnfS4Ok+Adp1oPU+gD8V7rKbjvHa73XlddjtDEz+mNnDcTwy99xQ3rxAf9e6/9Qto3LFQafXskYpS6pPhruPeMRze1OsDeViY7cveNZkXxVUxrE5IPF5yWggyGnV8V+bjX+xuX9DgJEaa0qAFB75NWMwsnIyON47hldlL22bp1HaAmoRhYFBTXgQB036LQmVeHWS19ozS1T2iTNrJYS6Lrd6FIxYBp+9ksqVVlSW1OPLpSROjwCldMi1tL6jMXdupjw83tCfi3UsnEPfOTj8ad97sNMB/uBwGcMdV0KzeOHqAScX2eRW4C1Qs9uMg0XczPJJUe0QtqnpyY99bvMuutdgUIBqe6EjG26BmJNvCnovlLwNLlXAqXe9bP+mz792y9FjkcfX3TdCYhjdTQad9JpxFVg3GxEAqXxSp0TmytSTwFdwRJlssB8Yr723cNeaRaxSXJ5RVgFSPiEJgfnb4j+O96qTbc76V1ogqmmyEohO4SSzF/OVrx+Lm1dZELovCFEmwtNcqSmlmKebnGBKy1IXmS49WQA4YiPMyX268R/QlH1cgDNLwQqJcLv2Zp28IfoOVVjXJDnWIz1y73I3g4YA= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: fa3a58d4-2711-4c57-f094-08deebaa2986 X-MS-Exchange-CrossTenant-AuthSource: AM9PR04MB7556.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jul 2026 06:42:01.0526 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PkKPSf3hhXEywO/jmZ0GX/BPQI+nb6Csbboo509bRulthUWwxOPUeCQ4hp98eAnP0LAUniykjA4VIT8z9utIq7rOe53W0O0eV/Jxbwu8g2I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MI3PR04MB12659 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: Qi Hou isAvailable() previously called probeDisplay() to run a full EGL initialisation sequence and then immediately terminated the display with eglTerminate(). When SoftwareIsp subsequently created a DebayerEGL instance, initEGLContext() would call probeDisplay() again, repeating the full initialisation. Fix this by reusing the display obtained during the availability check. probeDisplay() is promoted to a public static method and isAvailable() is removed. The eGL constructor now takes the EGLDisplay as a parameter and stores it directly, so initEGLContext() no longer needs to call probeDisplay(). DebayerEGL is updated to accept and forward the display to eGL, and SoftwareIsp calls eGL::probeDisplay() once, passing the result straight to DebayerEGL when EGL is available. Signed-off-by: Qi Hou --- include/libcamera/internal/egl.h | 5 ++- src/libcamera/egl.cpp | 38 +++++++-------------- src/libcamera/software_isp/debayer_egl.cpp | 5 +-- src/libcamera/software_isp/debayer_egl.h | 2 +- src/libcamera/software_isp/software_isp.cpp | 5 +-- 5 files changed, 21 insertions(+), 34 deletions(-) diff --git a/include/libcamera/internal/egl.h b/include/libcamera/internal/egl.h index 1e31d490b..7ef1ca0d9 100644 --- a/include/libcamera/internal/egl.h +++ b/include/libcamera/internal/egl.h @@ -99,11 +99,11 @@ private: class eGL { public: - eGL(); + eGL(EGLDisplay display); ~eGL(); int initEGLContext(); - static bool isAvailable(); + static EGLDisplay probeDisplay(); int createInputDMABufTexture2D(eGLImage &eglImage, int fd); int createOutputDMABufTexture2D(eGLImage &eglImage, int fd); @@ -137,7 +137,6 @@ private: EGLContext context_ = EGL_NO_CONTEXT; EGLSurface surface_ = EGL_NO_SURFACE; - static EGLDisplay probeDisplay(); int compileShader(int shaderType, GLuint &shaderId, Span shaderData, Span shaderEnv); diff --git a/src/libcamera/egl.cpp b/src/libcamera/egl.cpp index 7ec7a654d..b5ed0e13a 100644 --- a/src/libcamera/egl.cpp +++ b/src/libcamera/egl.cpp @@ -64,12 +64,15 @@ LOG_DEFINE_CATEGORY(eGL) /** * \brief Construct an EGL helper + * \param[in] display The EGL display to use * * Creates an eGL instance with uninitialised context. Call initEGLContext() - * to set up the EGL display, context, and load extension functions. + * to set up the EGL context, and load extension functions. */ -eGL::eGL() +eGL::eGL(EGLDisplay display) + : display_(display) { + ASSERT(display_ != EGL_NO_DISPLAY); } /** @@ -299,6 +302,13 @@ void eGL::createTexture2D(eGLImage &eglImage, void *data) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } +/** + * \brief Try to create an EGL display for surfaceless rendering + * + * Tries to create an EGL display for surfaceless rendering. + * + * \return A EGL display handle if successful, otherwise \a EGL_NO_DISPLAY + */ EGLDisplay eGL::probeDisplay() { EGLDisplay display; @@ -325,24 +335,6 @@ EGLDisplay eGL::probeDisplay() return display; } -/** - * \brief Probe whether EGL surfaceless rendering is available - * - * Checks if an EGL surfaceless display can be obtained and initialised. - * The display is immediately terminated so that no resources are leaked. - * - * \return True if EGL surfaceless rendering is available, false otherwise - */ -bool eGL::isAvailable() -{ - EGLDisplay display = probeDisplay(); - if (display == EGL_NO_DISPLAY) - return false; - - eglTerminate(display); - return true; -} - /** * \brief Update a 2D texture already created * \param[in,out] eglImage EGL image to associate with the texture @@ -403,12 +395,6 @@ int eGL::initEGLContext() EGLint numConfigs; EGLConfig config; - display_ = probeDisplay(); - if (display_ == EGL_NO_DISPLAY) { - LOG(eGL, Error) << "Unable to probe display"; - goto fail; - } - 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); diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp index dd2041219..20b478b1c 100644 --- a/src/libcamera/software_isp/debayer_egl.cpp +++ b/src/libcamera/software_isp/debayer_egl.cpp @@ -40,9 +40,10 @@ namespace libcamera { * \brief Construct a DebayerEGL object * \param[in] stats Statistics processing object * \param[in] cm The camera manager + * \param[in] display The EGL display to use */ -DebayerEGL::DebayerEGL(std::unique_ptr stats, const CameraManager &cm) - : Debayer(cm), stats_(std::move(stats)) +DebayerEGL::DebayerEGL(std::unique_ptr stats, const CameraManager &cm, EGLDisplay display) + : Debayer(cm), stats_(std::move(stats)), egl_(display) { } diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h index e613639f5..30e51a477 100644 --- a/src/libcamera/software_isp/debayer_egl.h +++ b/src/libcamera/software_isp/debayer_egl.h @@ -40,7 +40,7 @@ class CameraManager; class DebayerEGL : public Debayer { public: - DebayerEGL(std::unique_ptr stats, const CameraManager &cm); + DebayerEGL(std::unique_ptr stats, const CameraManager &cm, EGLDisplay display); ~DebayerEGL(); int configure(const StreamConfiguration &inputCfg, diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index c73a16ce0..c7165771c 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -120,8 +120,9 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor, } if (!softISPMode || softISPMode == "gpu") { - if (eGL::isAvailable()) { - debayer_ = std::make_unique(std::move(stats), cm); + auto display = eGL::probeDisplay(); + if (display != EGL_NO_DISPLAY) { + debayer_ = std::make_unique(std::move(stats), cm, display); } else { LOG(SoftwareIsp, Info) << "EGL not available, falling back to CPU debayer";