[v10,00/24] Add GLES 2.0 GPUISP to libcamera
mbox series

Message ID 20260106170059.56193-1-bryan.odonoghue@linaro.org
Headers show
Series
  • Add GLES 2.0 GPUISP to libcamera
Related show

Message

Bryan O'Donoghue Jan. 6, 2026, 5 p.m. UTC
v11:
- Rebases on today's tip of tree
- Applies Tested-by from Hans
- Applies RB from Robert and Milan
- Fixes ~ every issue Barnabas raised in previous cycles with exception of:
  a. Header checks for GBM and gles are required in at least one
     of the ci checks respectively
  b. programId_ removal happens in stop() not in destructor

Full testable branch
Link: https://gitlab.freedesktop.org/camera/libcamera-softisp/-/tree/0.6.0-gpuisp-v11-a?ref_type=heads

v10:
- Drop selfEnumerating Ccm object - libcamera-softisp meeting agreement
- Switch on uncalibrated yaml CCM @ 65k by default - softisp meeting agreement
- Pass contrastExp from lut into shaders instead of calculating contrastExp
  for each pixel as @ v9 - softisp meeting agreement
- Adds in RB as indicated by Milan and Robert
- Fixes check of unique_ptr - Barnabas @ v8 review

v9:

- Rebase on 0.6.0-tip including precursor now merged

   _______
  |  YAY! |
  |_______|
     |||
    /|||\
   / ||| \
  /  |||  \
      |
     / \
    /   \

- Number of fixes from the formatter now that I'm aware of its existence/use - Bryan/Milan
- Includes Robert's changes for the projection matrix
- Fixes the case where the uncalibrated.yaml file is enabled.
  Iterates through list of loaded algorithms matching Ccm. - Milan/Bryan


Bryan O'Donoghue (21):
  libcamera: software_isp: debayer: Latch contrastExp not contrast to
    debayer parameters
  libcamera: software_isp: gbm: Add a GBM helper class for GPU surface
    access
  libcamera: software_isp: egl: Add a eGL base helper class
  qcam: viewfinder_gl: Set no-op Bayer shader values
  libcamera: shaders: Use highp not mediump for float precision
  libcamera: shaders: Extend debayer shaders to apply CCM gains
  libcamera: shaders: Extend bayer shaders to support swapping R and B
    on output
  libcamera: shaders: Add support for black level compensation
  libcamera: shaders: Add support for Gamma
  libcamera: shaders: Add support for contrast
  libcamera: software_isp: Add member variables to track selected
    input/output pixelFormat
  libcamera: software_isp: Add a Size_ member variable to pass to eGL
    later
  libcamera: software_isp: debayer_egl: Add an eGL Debayer class
  libcamera: software_isp: debayer_cpu: Make getInputConfig and
    getOutputConfig static
  libcamera: software_isp: debayer_egl: Make DebayerEGL an environment
    option
  ipa: simple: Add a flag to indicate gpuIspEnabled
  libcamera: software_isp: lut: Skip calculation lookup tables if
    gpuIspEnabled is true
  libcamera: software_isp: lut: Change default Gamma to 1.0/2.2
  libcamera: software_isp: Switch on default CCM at 65k
  libcamera: software_isp: debayer_egl: Make gpuisp default softisp mode
  libcamera: software_isp: Add a gpuisp todo list

Hans de Goede (1):
  libcamera: shaders: Fix input sampling when width != stride

Milan Zamazal (2):
  libcamera: shaders: Rename bayer_8 to bayer_unpacked
  libcamera: software_isp: GPU support for unpacked 10/12-bit formats

 include/libcamera/internal/egl.h              | 152 ++++
 include/libcamera/internal/gbm.h              |  55 ++
 include/libcamera/internal/meson.build        |   2 +
 .../internal/software_isp/debayer_params.h    |   2 +-
 include/libcamera/ipa/soft.mojom              |   3 +-
 src/apps/qcam/assets/shader/shaders.qrc       |   4 +-
 src/apps/qcam/viewfinder_gl.cpp               |  42 +-
 src/apps/qcam/viewfinder_gl.h                 |  12 +
 src/ipa/simple/algorithms/lut.cpp             |  78 ++-
 src/ipa/simple/data/uncalibrated.yaml         |  12 +-
 src/ipa/simple/ipa_context.h                  |   2 +
 src/ipa/simple/soft_simple.cpp                |   3 +
 src/libcamera/egl.cpp                         | 608 ++++++++++++++++
 src/libcamera/gbm.cpp                         | 107 +++
 src/libcamera/meson.build                     |  33 +
 src/libcamera/shaders/RGB.frag                |   2 +-
 src/libcamera/shaders/YUV_2_planes.frag       |   2 +-
 src/libcamera/shaders/YUV_3_planes.frag       |   2 +-
 src/libcamera/shaders/YUV_packed.frag         |   2 +-
 src/libcamera/shaders/bayer_1x_packed.frag    |  77 ++-
 .../{bayer_8.frag => bayer_unpacked.frag}     |  92 ++-
 .../{bayer_8.vert => bayer_unpacked.vert}     |   6 +-
 src/libcamera/shaders/meson.build             |   4 +-
 src/libcamera/software_isp/debayer.cpp        |  17 +-
 src/libcamera/software_isp/debayer.h          |   3 +
 src/libcamera/software_isp/debayer_cpu.h      |   4 +-
 src/libcamera/software_isp/debayer_egl.cpp    | 651 ++++++++++++++++++
 src/libcamera/software_isp/debayer_egl.h      | 124 ++++
 src/libcamera/software_isp/gpuisp-todo.txt    |  40 ++
 src/libcamera/software_isp/meson.build        |   8 +
 src/libcamera/software_isp/software_isp.cpp   |  28 +-
 31 files changed, 2106 insertions(+), 71 deletions(-)
 create mode 100644 include/libcamera/internal/egl.h
 create mode 100644 include/libcamera/internal/gbm.h
 create mode 100644 src/libcamera/egl.cpp
 create mode 100644 src/libcamera/gbm.cpp
 rename src/libcamera/shaders/{bayer_8.frag => bayer_unpacked.frag} (53%)
 rename src/libcamera/shaders/{bayer_8.vert => bayer_unpacked.vert} (90%)
 create mode 100644 src/libcamera/software_isp/debayer_egl.cpp
 create mode 100644 src/libcamera/software_isp/debayer_egl.h
 create mode 100644 src/libcamera/software_isp/gpuisp-todo.txt

Comments

Robert Mader Jan. 7, 2026, 9:39 a.m. UTC | #1
Retested the series on all my mobile devices (Pixel3a, OnePlus6, 
Fairphone 5, Librem5 (1), PinePhone (1)), looking great, thanks!

Tested-by: Robert Mader <robert.mader@collabora.com>

1: with extra patches to enable the swISP

On 06.01.26 18:00, Bryan O'Donoghue wrote:
> v11:
> - Rebases on today's tip of tree
> - Applies Tested-by from Hans
> - Applies RB from Robert and Milan
> - Fixes ~ every issue Barnabas raised in previous cycles with exception of:
>    a. Header checks for GBM and gles are required in at least one
>       of the ci checks respectively
>    b. programId_ removal happens in stop() not in destructor
>
> Full testable branch
> Link: https://gitlab.freedesktop.org/camera/libcamera-softisp/-/tree/0.6.0-gpuisp-v11-a?ref_type=heads
>
> v10:
> - Drop selfEnumerating Ccm object - libcamera-softisp meeting agreement
> - Switch on uncalibrated yaml CCM @ 65k by default - softisp meeting agreement
> - Pass contrastExp from lut into shaders instead of calculating contrastExp
>    for each pixel as @ v9 - softisp meeting agreement
> - Adds in RB as indicated by Milan and Robert
> - Fixes check of unique_ptr - Barnabas @ v8 review
>
> v9:
>
> - Rebase on 0.6.0-tip including precursor now merged
>
>     _______
>    |  YAY! |
>    |_______|
>       |||
>      /|||\
>     / ||| \
>    /  |||  \
>        |
>       / \
>      /   \
>
> - Number of fixes from the formatter now that I'm aware of its existence/use - Bryan/Milan
> - Includes Robert's changes for the projection matrix
> - Fixes the case where the uncalibrated.yaml file is enabled.
>    Iterates through list of loaded algorithms matching Ccm. - Milan/Bryan
>
>
> Bryan O'Donoghue (21):
>    libcamera: software_isp: debayer: Latch contrastExp not contrast to
>      debayer parameters
>    libcamera: software_isp: gbm: Add a GBM helper class for GPU surface
>      access
>    libcamera: software_isp: egl: Add a eGL base helper class
>    qcam: viewfinder_gl: Set no-op Bayer shader values
>    libcamera: shaders: Use highp not mediump for float precision
>    libcamera: shaders: Extend debayer shaders to apply CCM gains
>    libcamera: shaders: Extend bayer shaders to support swapping R and B
>      on output
>    libcamera: shaders: Add support for black level compensation
>    libcamera: shaders: Add support for Gamma
>    libcamera: shaders: Add support for contrast
>    libcamera: software_isp: Add member variables to track selected
>      input/output pixelFormat
>    libcamera: software_isp: Add a Size_ member variable to pass to eGL
>      later
>    libcamera: software_isp: debayer_egl: Add an eGL Debayer class
>    libcamera: software_isp: debayer_cpu: Make getInputConfig and
>      getOutputConfig static
>    libcamera: software_isp: debayer_egl: Make DebayerEGL an environment
>      option
>    ipa: simple: Add a flag to indicate gpuIspEnabled
>    libcamera: software_isp: lut: Skip calculation lookup tables if
>      gpuIspEnabled is true
>    libcamera: software_isp: lut: Change default Gamma to 1.0/2.2
>    libcamera: software_isp: Switch on default CCM at 65k
>    libcamera: software_isp: debayer_egl: Make gpuisp default softisp mode
>    libcamera: software_isp: Add a gpuisp todo list
>
> Hans de Goede (1):
>    libcamera: shaders: Fix input sampling when width != stride
>
> Milan Zamazal (2):
>    libcamera: shaders: Rename bayer_8 to bayer_unpacked
>    libcamera: software_isp: GPU support for unpacked 10/12-bit formats
>
>   include/libcamera/internal/egl.h              | 152 ++++
>   include/libcamera/internal/gbm.h              |  55 ++
>   include/libcamera/internal/meson.build        |   2 +
>   .../internal/software_isp/debayer_params.h    |   2 +-
>   include/libcamera/ipa/soft.mojom              |   3 +-
>   src/apps/qcam/assets/shader/shaders.qrc       |   4 +-
>   src/apps/qcam/viewfinder_gl.cpp               |  42 +-
>   src/apps/qcam/viewfinder_gl.h                 |  12 +
>   src/ipa/simple/algorithms/lut.cpp             |  78 ++-
>   src/ipa/simple/data/uncalibrated.yaml         |  12 +-
>   src/ipa/simple/ipa_context.h                  |   2 +
>   src/ipa/simple/soft_simple.cpp                |   3 +
>   src/libcamera/egl.cpp                         | 608 ++++++++++++++++
>   src/libcamera/gbm.cpp                         | 107 +++
>   src/libcamera/meson.build                     |  33 +
>   src/libcamera/shaders/RGB.frag                |   2 +-
>   src/libcamera/shaders/YUV_2_planes.frag       |   2 +-
>   src/libcamera/shaders/YUV_3_planes.frag       |   2 +-
>   src/libcamera/shaders/YUV_packed.frag         |   2 +-
>   src/libcamera/shaders/bayer_1x_packed.frag    |  77 ++-
>   .../{bayer_8.frag => bayer_unpacked.frag}     |  92 ++-
>   .../{bayer_8.vert => bayer_unpacked.vert}     |   6 +-
>   src/libcamera/shaders/meson.build             |   4 +-
>   src/libcamera/software_isp/debayer.cpp        |  17 +-
>   src/libcamera/software_isp/debayer.h          |   3 +
>   src/libcamera/software_isp/debayer_cpu.h      |   4 +-
>   src/libcamera/software_isp/debayer_egl.cpp    | 651 ++++++++++++++++++
>   src/libcamera/software_isp/debayer_egl.h      | 124 ++++
>   src/libcamera/software_isp/gpuisp-todo.txt    |  40 ++
>   src/libcamera/software_isp/meson.build        |   8 +
>   src/libcamera/software_isp/software_isp.cpp   |  28 +-
>   31 files changed, 2106 insertions(+), 71 deletions(-)
>   create mode 100644 include/libcamera/internal/egl.h
>   create mode 100644 include/libcamera/internal/gbm.h
>   create mode 100644 src/libcamera/egl.cpp
>   create mode 100644 src/libcamera/gbm.cpp
>   rename src/libcamera/shaders/{bayer_8.frag => bayer_unpacked.frag} (53%)
>   rename src/libcamera/shaders/{bayer_8.vert => bayer_unpacked.vert} (90%)
>   create mode 100644 src/libcamera/software_isp/debayer_egl.cpp
>   create mode 100644 src/libcamera/software_isp/debayer_egl.h
>   create mode 100644 src/libcamera/software_isp/gpuisp-todo.txt
>
Hans de Goede Jan. 7, 2026, 2:26 p.m. UTC | #2
Hi,

On 6-Jan-26 18:00, Bryan O'Donoghue wrote:
> v11:
> - Rebases on today's tip of tree
> - Applies Tested-by from Hans

It looks like I messed up giving my Tested-by.

Kieran, can you please do:

s/johannes.goede@qualcomm.com/johannes.goede@oss.qualcomm.com/

in the entire patch-set when applying these ?

Bryan, same request to you if instead of Kieran applying
this a v11 is necessary.

Sorry for messing this up.

Regards,

Hans




> - Applies RB from Robert and Milan
> - Fixes ~ every issue Barnabas raised in previous cycles with exception of:
>   a. Header checks for GBM and gles are required in at least one
>      of the ci checks respectively
>   b. programId_ removal happens in stop() not in destructor
> 
> Full testable branch
> Link: https://gitlab.freedesktop.org/camera/libcamera-softisp/-/tree/0.6.0-gpuisp-v11-a?ref_type=heads
> 
> v10:
> - Drop selfEnumerating Ccm object - libcamera-softisp meeting agreement
> - Switch on uncalibrated yaml CCM @ 65k by default - softisp meeting agreement
> - Pass contrastExp from lut into shaders instead of calculating contrastExp
>   for each pixel as @ v9 - softisp meeting agreement
> - Adds in RB as indicated by Milan and Robert
> - Fixes check of unique_ptr - Barnabas @ v8 review
> 
> v9:
> 
> - Rebase on 0.6.0-tip including precursor now merged
> 
>    _______
>   |  YAY! |
>   |_______|
>      |||
>     /|||\
>    / ||| \
>   /  |||  \
>       |
>      / \
>     /   \
> 
> - Number of fixes from the formatter now that I'm aware of its existence/use - Bryan/Milan
> - Includes Robert's changes for the projection matrix
> - Fixes the case where the uncalibrated.yaml file is enabled.
>   Iterates through list of loaded algorithms matching Ccm. - Milan/Bryan
> 
> 
> Bryan O'Donoghue (21):
>   libcamera: software_isp: debayer: Latch contrastExp not contrast to
>     debayer parameters
>   libcamera: software_isp: gbm: Add a GBM helper class for GPU surface
>     access
>   libcamera: software_isp: egl: Add a eGL base helper class
>   qcam: viewfinder_gl: Set no-op Bayer shader values
>   libcamera: shaders: Use highp not mediump for float precision
>   libcamera: shaders: Extend debayer shaders to apply CCM gains
>   libcamera: shaders: Extend bayer shaders to support swapping R and B
>     on output
>   libcamera: shaders: Add support for black level compensation
>   libcamera: shaders: Add support for Gamma
>   libcamera: shaders: Add support for contrast
>   libcamera: software_isp: Add member variables to track selected
>     input/output pixelFormat
>   libcamera: software_isp: Add a Size_ member variable to pass to eGL
>     later
>   libcamera: software_isp: debayer_egl: Add an eGL Debayer class
>   libcamera: software_isp: debayer_cpu: Make getInputConfig and
>     getOutputConfig static
>   libcamera: software_isp: debayer_egl: Make DebayerEGL an environment
>     option
>   ipa: simple: Add a flag to indicate gpuIspEnabled
>   libcamera: software_isp: lut: Skip calculation lookup tables if
>     gpuIspEnabled is true
>   libcamera: software_isp: lut: Change default Gamma to 1.0/2.2
>   libcamera: software_isp: Switch on default CCM at 65k
>   libcamera: software_isp: debayer_egl: Make gpuisp default softisp mode
>   libcamera: software_isp: Add a gpuisp todo list
> 
> Hans de Goede (1):
>   libcamera: shaders: Fix input sampling when width != stride
> 
> Milan Zamazal (2):
>   libcamera: shaders: Rename bayer_8 to bayer_unpacked
>   libcamera: software_isp: GPU support for unpacked 10/12-bit formats
> 
>  include/libcamera/internal/egl.h              | 152 ++++
>  include/libcamera/internal/gbm.h              |  55 ++
>  include/libcamera/internal/meson.build        |   2 +
>  .../internal/software_isp/debayer_params.h    |   2 +-
>  include/libcamera/ipa/soft.mojom              |   3 +-
>  src/apps/qcam/assets/shader/shaders.qrc       |   4 +-
>  src/apps/qcam/viewfinder_gl.cpp               |  42 +-
>  src/apps/qcam/viewfinder_gl.h                 |  12 +
>  src/ipa/simple/algorithms/lut.cpp             |  78 ++-
>  src/ipa/simple/data/uncalibrated.yaml         |  12 +-
>  src/ipa/simple/ipa_context.h                  |   2 +
>  src/ipa/simple/soft_simple.cpp                |   3 +
>  src/libcamera/egl.cpp                         | 608 ++++++++++++++++
>  src/libcamera/gbm.cpp                         | 107 +++
>  src/libcamera/meson.build                     |  33 +
>  src/libcamera/shaders/RGB.frag                |   2 +-
>  src/libcamera/shaders/YUV_2_planes.frag       |   2 +-
>  src/libcamera/shaders/YUV_3_planes.frag       |   2 +-
>  src/libcamera/shaders/YUV_packed.frag         |   2 +-
>  src/libcamera/shaders/bayer_1x_packed.frag    |  77 ++-
>  .../{bayer_8.frag => bayer_unpacked.frag}     |  92 ++-
>  .../{bayer_8.vert => bayer_unpacked.vert}     |   6 +-
>  src/libcamera/shaders/meson.build             |   4 +-
>  src/libcamera/software_isp/debayer.cpp        |  17 +-
>  src/libcamera/software_isp/debayer.h          |   3 +
>  src/libcamera/software_isp/debayer_cpu.h      |   4 +-
>  src/libcamera/software_isp/debayer_egl.cpp    | 651 ++++++++++++++++++
>  src/libcamera/software_isp/debayer_egl.h      | 124 ++++
>  src/libcamera/software_isp/gpuisp-todo.txt    |  40 ++
>  src/libcamera/software_isp/meson.build        |   8 +
>  src/libcamera/software_isp/software_isp.cpp   |  28 +-
>  31 files changed, 2106 insertions(+), 71 deletions(-)
>  create mode 100644 include/libcamera/internal/egl.h
>  create mode 100644 include/libcamera/internal/gbm.h
>  create mode 100644 src/libcamera/egl.cpp
>  create mode 100644 src/libcamera/gbm.cpp
>  rename src/libcamera/shaders/{bayer_8.frag => bayer_unpacked.frag} (53%)
>  rename src/libcamera/shaders/{bayer_8.vert => bayer_unpacked.vert} (90%)
>  create mode 100644 src/libcamera/software_isp/debayer_egl.cpp
>  create mode 100644 src/libcamera/software_isp/debayer_egl.h
>  create mode 100644 src/libcamera/software_isp/gpuisp-todo.txt
>
Bryan O'Donoghue Jan. 7, 2026, 2:29 p.m. UTC | #3
On 07/01/2026 14:26, johannes.goede@oss.qualcomm.com wrote:
> Hi,
> 
> On 6-Jan-26 18:00, Bryan O'Donoghue wrote:
>> v11:
>> - Rebases on today's tip of tree
>> - Applies Tested-by from Hans
> 
> It looks like I messed up giving my Tested-by.
> 
> Kieran, can you please do:
> 
> s/johannes.goede@qualcomm.com/johannes.goede@oss.qualcomm.com/
> 
> in the entire patch-set when applying these ?
> 
> Bryan, same request to you if instead of Kieran applying
> this a v11 is necessary.
> 
> Sorry for messing this up.
> 
> Regards,
> 
> Hans
I feel better about forgetting to cherry-pick the RB/Tested-by now :)

---
bod