From patchwork Mon Jan 26 10:42:53 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rick ten Wolde X-Patchwork-Id: 25963 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 98C7EC328D for ; Mon, 26 Jan 2026 10:48:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3711F61FD0; Mon, 26 Jan 2026 11:48:15 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="O++7Y6JV"; dkim-atps=neutral Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2BCD661FC6 for ; Mon, 26 Jan 2026 11:43:07 +0100 (CET) Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-b8845cb5862so655827066b.3 for ; Mon, 26 Jan 2026 02:43:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769424186; x=1770028986; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=s9qGY5xhUN7J9aorua9sfoM5bJq/KrIFPoQOSqH6Ufk=; b=O++7Y6JViseowHgXOvwc1IlifyiBcQ2/d5mPvwvalLr0pqTUxwM8SFCskCKrJD2jld 5T7OEMCHdbL/yeD2X81iiH9+aT/u0qzXKjspRzkTJ1TACAigGcNEsezPJqqB3onEkzp4 8cpsU2R+ptfe37smCFxFMyTlyNK/8QRz8j/CWOH9HDh7PJTxZ72EQVGvmdP6yFeDdMq8 vEQEMKRM7f2/dc4WGlk4pApAHNlZxNFG5LBNNhmiirGAEjHmGSJf7ZxL9bdpV5H8qr/M VoIfQImyUnDiQ8sOmAfSByC92hEFhKg36vPC8pydkKUwu3FoJdIDR8FHs1XISf9RVusf ggLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769424186; x=1770028986; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=s9qGY5xhUN7J9aorua9sfoM5bJq/KrIFPoQOSqH6Ufk=; b=OmZOjiySD+rUDPMgDA3dUEwKTBq82MSkb3K3H8Sp8uGJL8DOJZBZoot3n9lhzGyz1f 4gseVuXGtGC8l8stJa3juRHMW/of0WZjHTbM4RhTttPx3FidsMJYmzNoKNFTisQ8CNxC GO+Y+KSI4yZXdh/DIhj7MWHmWhQmAvIxHaVoWoR7T/GRtFGZANIWTE74aWAN9kWvAEE4 ZhNTMkAedG81H3y8+knIQTGDsHg2mTuEoHSOggz2O8muUaCFdtf6cqIyoSUR4XIaWxrZ ZeW6b8uxD/xp+SFRdjch1m96IJMwhLkZ+3CRhTUB4LkWSCGZSnEfa+jZgeD4/hSf5sLa qisw== X-Gm-Message-State: AOJu0YyvNFEVrrVYykK6eGy7LKMY6lnqPoAqyLqLXVgr06UgOHkkUF3y Iuqtw5tZSYcOtOSahaYyfc+ak1/lyr2ObIJf7cqOPu3hvfC6lj7GrsoTJFbNlg== X-Gm-Gg: AZuq6aJEjTb48RixPOU132upIyGaGtTRqSuDloZFw8i71s7fHWyvzZU4qP2uYcYkWdS cK2bj9Nfu3LUNw7k6sQEkS656ViUc9L8MtUQmIhL/peSn3TnP3ISgcNTedTW83GzxXsBtM6sGdm NVB9JENVcE61vL8Zj3zk8ZGjOVUiu0m61ED5Z0ZJD9P7fhHlKOUy9aVLTZvIE3mQ6dVQR19h8s5 7XhRlkGaam6aIxYZc2nZqklAARwmyJL0ljPZGPEtSkorZ2xU50B3P0LewLpIXakJBBbXSUAD1SV eF/QOBxPXmiifQVTf2GvSuJSrQY1uisHvKp5sh7Ge6/AP3JOmo/iBWKATyjzGyeu4ZbY9VKWIdT VstYX+UFRC50O9C/Ljwuj/ugvOEDXIsqTtO+FciyTFXxsD9/zFP5N8IwZVx1j+5EOKa/Ie+pHS4 OToP6nYiU0DUDoVqvfdOTB5gaLD+POa++sqwu1kzlKUwEV4MRa4iBq/XjAi/Bx2PA= X-Received: by 2002:a17:907:868e:b0:b87:2f29:2060 with SMTP id a640c23a62f3a-b8d20d83807mr311882566b.26.1769424186118; Mon, 26 Jan 2026 02:43:06 -0800 (PST) Received: from castortop.wolde.loc (195-240-110-192.fixed.kpn.net. [195.240.110.192]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b885b7661f7sm599220366b.54.2026.01.26.02.43.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jan 2026 02:43:05 -0800 (PST) From: Rick ten Wolde To: libcamera-devel@lists.libcamera.org Cc: xander.c.pronk@gmail.com, derekgielen@outlook.com, 22012540@student.hhs.nl, rick.w.ten.wolde@gmail.com, johannes.goede@oss.qualcomm.com, Rick ten Wolde Subject: [PATCH 5/7] libcamera: software_isp: debayer_egl: Add LSC support Date: Mon, 26 Jan 2026 11:42:53 +0100 Message-ID: <20260126104256.119697-6-rick.w.ten.wolde@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260126104256.119697-1-rick.w.ten.wolde@gmail.com> References: <20260126104256.119697-1-rick.w.ten.wolde@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 26 Jan 2026 11:48:05 +0100 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: Xander Pronk Add support for passing the LSC tables from debayerParams to the shaders. Co-authored-by: Rick ten Wolde Signed-off-by: Rick ten Wolde Signed-off-by: Xander Pronk --- src/libcamera/software_isp/debayer_egl.cpp | 21 +++++++++++++++++++++ src/libcamera/software_isp/debayer_egl.h | 9 +++++++++ 2 files changed, 30 insertions(+) diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp index 8e089032..0f36b149 100644 --- a/src/libcamera/software_isp/debayer_egl.cpp +++ b/src/libcamera/software_isp/debayer_egl.cpp @@ -111,6 +111,10 @@ int DebayerEGL::getShaderVariableLocations(void) textureUniformBayerFirstRed_ = glGetUniformLocation(programId_, "tex_bayer_first_red"); textureUniformProjMatrix_ = glGetUniformLocation(programId_, "proj_matrix"); + textureUniformLSCRed_ = glGetUniformLocation(programId_, "lsc_tex_red"); + textureUniformLSCGreen_ = glGetUniformLocation(programId_, "lsc_tex_green"); + textureUniformLSCBlue_ = glGetUniformLocation(programId_, "lsc_tex_blue"); + LOG(Debayer, Debug) << "vertexIn " << attributeVertex_ << " textureIn " << attributeTexture_ << " tex_y " << textureUniformBayerDataIn_ << " ccm " << ccmUniformDataIn_ @@ -140,6 +144,9 @@ int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputForm /* Specify GL_OES_EGL_image_external */ egl_.pushEnv(shaderEnv, "#extension GL_OES_EGL_image_external: enable"); + /* Always use LSC */ + egl_.pushEnv(shaderEnv, "#define DO_LSC"); + /* * Tell shaders how to re-order output taking account of how the * pixels are actually stored by GBM @@ -349,6 +356,12 @@ int DebayerEGL::configure(const StreamConfiguration &inputCfg, */ stats_->setWindow(Rectangle(window_.size())); + eglImageLSCLookupRed_ = new eGLImage(20, 20, sizeof(GLubyte), GL_TEXTURE5, 5); + eglImageLSCLookupGreen_ = new eGLImage(20, 20, sizeof(GLubyte), GL_TEXTURE5, 5); + eglImageLSCLookupBlue_ = new eGLImage(20, 20, sizeof(GLubyte), GL_TEXTURE5, 5); + if (!eglImageLSCLookupRed_ || !eglImageLSCLookupGreen_ || !eglImageLSCLookupBlue_) + return -ENOMEM; + return 0; } @@ -488,6 +501,14 @@ void DebayerEGL::setShaderVariableValues(DebayerParams ¶ms) glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm); LOG(Debayer, Debug) << " ccmUniformDataIn_ " << ccmUniformDataIn_ << " data " << params.ccm; + egl_.createTexture2D(*eglImageLSCLookupRed_, GL_LUMINANCE, 16, 16, ¶ms.LSC_red, GL_LINEAR); + egl_.createTexture2D(*eglImageLSCLookupBlue_, GL_LUMINANCE, 16, 16, ¶ms.LSC_green, GL_LINEAR); + egl_.createTexture2D(*eglImageLSCLookupGreen_, GL_LUMINANCE, 16, 16, ¶ms.LSC_blue, GL_LINEAR); + + glUniform1i(textureUniformLSCRed_, eglImageLSCLookupRed_->texture_unit_uniform_id_); + glUniform1i(textureUniformLSCGreen_, eglImageLSCLookupGreen_->texture_unit_uniform_id_); + glUniform1i(textureUniformLSCBlue_, eglImageLSCLookupBlue_->texture_unit_uniform_id_); + /* * 0 = Red, 1 = Green, 2 = Blue */ diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h index a5033bc6..61feadab 100644 --- a/src/libcamera/software_isp/debayer_egl.h +++ b/src/libcamera/software_isp/debayer_egl.h @@ -85,6 +85,11 @@ private: std::unique_ptr eglImageBayerIn_; std::unique_ptr eglImageBayerOut_; + /* Pointer to object representing input texture */ + eGLImage *eglImageLSCLookupRed_; + eGLImage *eglImageLSCLookupBlue_; + eGLImage *eglImageLSCLookupGreen_; + /* Shader parameters */ float firstRed_x_; float firstRed_y_; @@ -98,6 +103,10 @@ private: GLint textureUniformBayerDataIn_; + GLint textureUniformLSCRed_; + GLint textureUniformLSCGreen_; + GLint textureUniformLSCBlue_; + /* Represent per-frame CCM as a uniform vector of floats 3 x 3 */ GLint ccmUniformDataIn_;