From patchwork Fri Aug 21 12:59:52 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 27956 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 54D31C3337 for ; Fri, 21 Aug 2026 13:00:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F1ADE68362; Fri, 21 Aug 2026 15:00:15 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="N52z8f7J"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 82C8068301 for ; Fri, 21 Aug 2026 15:00:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1787317212; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=RWAc6L86dUHvnwTRbh300qAscERpN1YajYaYHD/qOZ4=; b=N52z8f7JHvmk+4Lb9j1Rloi/4XoW2YSYomMPgJTT7uaaN50ejhfE6QPC1cgyIsuQgQgov1 zGa1+F2Y6qB2A6ZuPcahG4GOMPY1uXHX1I5OsPeW8uVpyaKhGwV8K+UHyZUrZ22+N9aVnm d+LfSHP1Q8KhLReL/XPK09iBIerCtGU= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-pDy0RDRuN8aftJcemKaxIw-1; Fri, 21 Aug 2026 09:00:08 -0400 X-MC-Unique: pDy0RDRuN8aftJcemKaxIw-1 X-Mimecast-MFC-AGG-ID: pDy0RDRuN8aftJcemKaxIw_1787317207 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E7E4B180135C; Fri, 21 Aug 2026 13:00:06 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.redhat.corp (headnet05.pony-001.prod.iad2.dc.redhat.com [10.2.32.117]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9F3531955F06; Fri, 21 Aug 2026 13:00:04 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Bryan O'Donoghue , Hans de Goede , Laurent Pinchart , Robert Mader , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= Subject: [PATCH v14 0/6] LSC for SoftISP simple pipeline Date: Fri, 21 Aug 2026 14:59:52 +0200 Message-ID: <20260821125958.95928-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: RiIOybMWDtIP_oz7powYVicgdVs9mVYt6BxFdfSiJpU_1787317207 X-Mimecast-Originator: redhat.com 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" Lens shading correction for software GPU ISP. Based on the initial work by Hans’s students, taken over and significantly modified and eventually reworked to use LSC from libipa (the ongoing work by Jacopo and others). The LSC is not implemented for CPU ISP within this series; it may be added later if needed. Example YAML for grid based LSC, no-op values, place it after Awb: - Lsc: sets: - ct: 6500 r: [ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 ] g: [ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 ] b: [ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 ] Example YAML for polynomial based LSC, no-op values, place it after Awb: - Lsc: type: "polynomial" sets: - ct: 6500 r: cx: 0.5 cy: 0.5 k0: 0.0 k1: 0.0 k2: 0.0 k3: 0.0 k4: 0.0 g: cx: 0.5 cy: 0.5 k0: 0.0 k1: 0.0 k2: 0.0 k3: 0.0 k4: 0.0 b: cx: 0.5 cy: 0.5 k0: 0.0 k1: 0.0 k2: 0.0 k3: 0.0 k4: 0.0 Changes in v14: - Adjusted for current master. - A missing lscLutVersion param increment added. - The patch adding parameters to createTexture2D dropped. - Refactoring of texture handling as suggested by Barnabás. Changes in v13: - Missing identityLscLut docstring added. - identityLscLut initialisation changed to work with older gcc versions (fixing the CI failure). Changes in v12: - eGL class changes put to a separate commit. - eglImageLscLookup_ moved to setShaderVariableValues and lscTextureCreated_ removed. - eglImageLscLookup_ reset in DebayerEGL::stop. - lscLutVersion_ wrapped by std::optional and reset in DebayerEGL::stop. - DebayerParams::lscLut* reset together with the other parameters in IPASoftSimple::init. - DebayerParams::LscLookupTable copy avoided. - Improvement of DebayerParams::lscLut initialisation suggested by Barnabás. Changes in v11: - Updated for Jacopo’s libipa patches v7. Changes in v10: - Rebased on Jacopo’s libipa v6. - Quantized uint8_t texture used instead of float, for a better GPU compatibility. - The texture is updated, rather than created each time, and only if the underlying data changes. - A forgotten statement, previously inserted and removed in intermediate patches, removed. - The grid size changed to 17 to be the same as in rkisp1 tuning files. - RGBA is used instead of RGB to prevent OpenGL alignment issues. - cx & cy set to 0.5 in the cover letter polynomial example, to centre the pattern. Changes in v9: - Rebased on the latest master. Changes in v8: - LscValueType removed. - A named constant introduced for minimum temperature change. - A clarification comment added to the LUT value computation. - lsc-enabled shader flag and the related variables removed. - Wording corrections suggested by Bryan. Changes in v7: - Updated for libipa patches v5 (temperature access). Changes in v6: - Rebased on Jacopo’s libipa patches (v3). - Not updating LSC tables on small or no temperature changes. - Using libipa LSC algorithms; the implementation in ‘simple’ IPA algorithm reduced to the minimum needed. - Grid tables are defined using integers rather than floats, because libipa LSC supports only quantised values and not floats. - New boolean uniform to enable or disable LSC dynamically, rather than only in shaders compile time; to be able to honour the LSC control. - Specific handling of polynomial LSC removed. Polynomial LSC is already handled by libipa, by making a grid-based LSC from it. While a direct polynomial computation may be a bit faster with a minimum number of the polynomial coefficients, the simplicity wins. If we liked to have direct polynomial LSC computation, it should be implemented with help of libipa. Changes in v5: - ‘grids’ tuning file item renamed to ‘sets’ for consistency with rkisp1. - Underscores appended to Lsc::lsc* names. - Other minor stylistic changes. - Proof-of-concept polynomial LSC implemented. Changes in v4: - glFilterParam -> param - Indentation changes in the shaders. - A commit message part about temperature reworded. - Updated for YamlObject -> ValueNode. - New constant kLscValuesPerCell to distinguish between the constants for the params array size (values) and for the stride (bytes). - The lookup array switched to floats and the texture to half-floats. Changes in v3: - LSC scripts patch dropped due to missing licences. - DO_LSC -> APPLY_LSC - textureUniformLsc_ is assigned unconditionally now. - New constant DebayerParams::kLscBytesPerCell. - LSC values in the tuning file are floats now and converted to bytes internally. - Source code comments added to clarify the usage of the byte LUTs. Changes in v2: - Remaining issues from the reviews (hopefully) addressed. - Especially there is only a single texture now and LSC is fully conditional. - Major cleanup, hacks removed or replaced, typo fixes, cosmetic changes, making linters happy, etc. - See https://lists.libcamera.org/pipermail/libcamera-devel/2026-January/056883.html for an example how to add the grid data. Milan Zamazal (1): libcamera: software_isp: Pass LSC availability to debayering Xander Pronk (5): libcamera: software_isp: egl: Add filter parameter to createTexture2D() libcamera: software_isp: Add LSC data to DebayerParams ipa: simple: Add LSC algorithm libcamera: shaders: Add LSC support libcamera: software_isp: debayer_egl: Add LSC support include/libcamera/internal/egl.h | 4 +- .../internal/software_isp/debayer_params.h | 24 ++++ .../internal/software_isp/software_isp.h | 1 + include/libcamera/ipa/softisp.mojom | 4 +- src/ipa/softisp/algorithms/lsc.cpp | 103 ++++++++++++++++++ src/ipa/softisp/algorithms/lsc.h | 51 +++++++++ src/ipa/softisp/algorithms/meson.build | 1 + src/ipa/softisp/ipa_context.h | 6 + src/ipa/softisp/softisp.cpp | 9 +- src/libcamera/egl.cpp | 13 ++- src/libcamera/shaders/bayer_1x_packed.frag | 9 ++ src/libcamera/shaders/bayer_unpacked.frag | 9 ++ src/libcamera/software_isp/debayer.cpp | 42 +++++++ src/libcamera/software_isp/debayer.h | 3 +- src/libcamera/software_isp/debayer_cpu.cpp | 3 +- src/libcamera/software_isp/debayer_cpu.h | 3 +- src/libcamera/software_isp/debayer_egl.cpp | 36 +++++- src/libcamera/software_isp/debayer_egl.h | 11 +- src/libcamera/software_isp/software_isp.cpp | 5 +- 19 files changed, 317 insertions(+), 20 deletions(-) create mode 100644 src/ipa/softisp/algorithms/lsc.cpp create mode 100644 src/ipa/softisp/algorithms/lsc.h