[RFC,v6,0/6] LSC for SoftISP simple pipeline
mbox series

Message ID 20260708141436.119165-1-mzamazal@redhat.com
Headers show
Series
  • LSC for SoftISP simple pipeline
Related show

Message

Milan Zamazal July 8, 2026, 2:14 p.m. UTC
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.

It’s RFC because:

- It’s not yet completely tested although it seems to be working in my
  environment.
- It’s based on the libipa patches not yet merged.
- Further changes will be needed once GPU ISP multipass is merged.

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              |  6 +-
 .../internal/software_isp/debayer_params.h    | 11 +++
 .../internal/software_isp/software_isp.h      |  1 +
 include/libcamera/ipa/soft.mojom              |  4 +-
 src/ipa/simple/algorithms/lsc.cpp             | 93 +++++++++++++++++++
 src/ipa/simple/algorithms/lsc.h               | 50 ++++++++++
 src/ipa/simple/algorithms/meson.build         |  1 +
 src/ipa/simple/ipa_context.h                  |  6 ++
 src/ipa/simple/soft_simple.cpp                |  7 +-
 src/libcamera/egl.cpp                         | 17 +++-
 src/libcamera/shaders/bayer_1x_packed.frag    | 10 ++
 src/libcamera/shaders/bayer_unpacked.frag     | 10 ++
 src/libcamera/software_isp/debayer.cpp        | 39 ++++++++
 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    | 37 +++++++-
 src/libcamera/software_isp/debayer_egl.h      | 11 ++-
 src/libcamera/software_isp/software_isp.cpp   |  5 +-
 19 files changed, 299 insertions(+), 18 deletions(-)
 create mode 100644 src/ipa/simple/algorithms/lsc.cpp
 create mode 100644 src/ipa/simple/algorithms/lsc.h