Show a cover letter.

GET /api/1.1/covers/26933/?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 26933,
    "url": "https://patchwork.libcamera.org/api/1.1/covers/26933/?format=api",
    "web_url": "https://patchwork.libcamera.org/cover/26933/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260618122245.946138-1-bryan.odonoghue@linaro.org>",
    "date": "2026-06-18T12:22:13",
    "name": "[00/30] RFC/RFT: gpuisp: Multipass with speed optimisations on top",
    "submitter": {
        "id": 175,
        "url": "https://patchwork.libcamera.org/api/1.1/people/175/?format=api",
        "name": "Bryan O'Donoghue",
        "email": "bryan.odonoghue@linaro.org"
    },
    "mbox": "https://patchwork.libcamera.org/cover/26933/mbox/",
    "series": [
        {
            "id": 6005,
            "url": "https://patchwork.libcamera.org/api/1.1/series/6005/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=6005",
            "date": "2026-06-18T12:22:13",
            "name": "RFC/RFT: gpuisp: Multipass with speed optimisations on top",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/6005/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/covers/26933/comments/",
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D4C28BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 18 Jun 2026 12:23:00 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7237662980;\n\tThu, 18 Jun 2026 14:22:59 +0200 (CEST)",
            "from mail-wm1-x332.google.com (mail-wm1-x332.google.com\n\t[IPv6:2a00:1450:4864:20::332])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8FCC962980\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Jun 2026 14:22:57 +0200 (CEST)",
            "by mail-wm1-x332.google.com with SMTP id\n\t5b1f17b1804b1-4903d730b1fso10003925e9.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Jun 2026 05:22:57 -0700 (PDT)",
            "from inspiron14p-linux ([109.76.144.236])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-4922fa3a4easm275198015e9.3.2026.06.18.05.22.56\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 18 Jun 2026 05:22:56 -0700 (PDT)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"hMu49oqD\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1781785377; x=1782390177;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:message-id:date:subject:cc\n\t:to:from:from:to:cc:subject:date:message-id:reply-to;\n\tbh=BP5r2JBI8xwUOXwB+DWavykOb8wMEcrmY8nBUnIGir8=;\n\tb=hMu49oqDuaXSB9Pjj/eHSlER/qV4dDvUHpMOqolH6YDU/3//aXpgVciifz1smhQsVj\n\td86hs02X16/fePz0+egAGchiw9LZH2Ipqm9E5kgZ7OARERoIzss2H2OvkcQ3HoceA2EP\n\tCKZfvug5cgEXhQLjsttRVplLWTfPNNd8UjJyZ0SDeyH567VLvmR35Ph0sBupUT3FpuF5\n\ta6j93igdo5fKAb8eWMVm8cwfWtOciRXXDQ4ir2poFNVnaVKhjXPXq0ZYGRF5VatGHtz0\n\tt17LasRehQywcpx72lC3nCoBp3KN7gCUygK3E6h4JzOfgYP8JnEslu8yIXa2XkVYwF21\n\t49wg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1781785377; x=1782390177;\n\th=content-transfer-encoding:mime-version:message-id:date:subject:cc\n\t:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=BP5r2JBI8xwUOXwB+DWavykOb8wMEcrmY8nBUnIGir8=;\n\tb=QjIHvSYs8Ip38lbjg/2uwAjOeEjVALENtbFG2hwLe+1e1K/PIs9+GGlOR0FySYGm6N\n\t+01kQus/Ma28dcHQznp1eaA0/ImtrT7LTk2zm/dzAaZVuE349/RdlwwICPWFGMo2wO6q\n\t/wP5FRmXJ8eINkSXXgrRZF2yTvcfviYVxRvT7I2BH5Lgvxv0+kblHlfKBTDJ5Y8DSjlt\n\t2lv10dXlwR6/XIf+1nSts1iYLu7kXH1xEGm2n9zN/R1cxayv4+glzX4bml15Mgj9Hv5S\n\tcbsVf+ClpgLZ86GYRqxfSr024YStkt53fCcaKICwPhOZ3DclYb7a6Hamcz9D0JFv/Hcy\n\tp98w==",
        "X-Gm-Message-State": "AOJu0Yy0eWtQmqBjGAT8/pKSkvFOgnptMCTQowC+NIqDxf30beU6uCNm\n\tW2JqWwmmEL1eMML1UG9E6EWp0A/kSd8beE6sY0+J8yc04BkxqEgZ6Rp1N+A+SVj/0s4I40of17Z\n\tIdAI8NGU=",
        "X-Gm-Gg": "AfdE7cmjJiC1VWQ5QtcxPBG8TztP69hoZHJkFPCXeKqQK0+9fgo3GgOU9CDt4FQ8nB2\n\tO90Hg8x287WzUjuN7ifBPgkM85SV2fOvy+jFMCoiGPTXHFlteAcwUdG1GW6En7JrEAEDKnt56S4\n\tJWev76tNCtzbkVp95LJ0RM6McdDklngXVf3jPE/dqr1FBiA2aO6LO37uNdpY3pKZX6GrY6aqizW\n\tT33ovbW2SHRg7uqLTO8M3pE1MLX5FySIBQENUZnmAAX2/BIdykkDUXDstb+gLdXRd2lSiovRqP2\n\tjMx6Xng9Jn7qU1NBElY1HqRjpltd/UL2MZfzh5mdb0/mb+jqECes1FEUBYwBv3pLug5PmD9wiuq\n\tKsaJZF13GPbRGs7h6EgO1WQV7pmYShcFBoZglJjUFBJRDwZmkhB/9rX+gPTuMCB6TJHVG4TF9aM\n\tT5yrP6195cA1KSOLRMsHt+urwF8cWgUlx78FLodoU=",
        "X-Received": "by 2002:a05:600c:1d0d:b0:492:1e50:978d with SMTP id\n\t5b1f17b1804b1-492381f13e0mr56568505e9.16.1781785376978; \n\tThu, 18 Jun 2026 05:22:56 -0700 (PDT)",
        "From": "Bryan O'Donoghue <bryan.odonoghue@linaro.org>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "bryan.odonoghue@linaro.org,\n\tpavel@ucw.cz",
        "Subject": "[PATCH 00/30] RFC/RFT: gpuisp: Multipass with speed optimisations on\n\ttop",
        "Date": "Thu, 18 Jun 2026 13:22:13 +0100",
        "Message-ID": "<20260618122245.946138-1-bryan.odonoghue@linaro.org>",
        "X-Mailer": "git-send-email 2.54.0",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Greetings.\n\nThis series implements multli-pass gpuisp as a two phase thing.\n\n- Some initial housekeeping to make the naming more logical\n  ShaderPass et al.\n\n- Dragging the existing implementation through a progressive change\n  set.\n\n- Adding in shaders to \"normalise\" i.e. to take either a packed or unpacked\n  CSI2 pixel stream - apply BLC to it and output a standard GL16F frame.\n\n- This allows us to dispense with having two demosiac shaders and to use\n  the logic from the exisitng unpacked demosiac for all streams.\n\n  This is actually a nice change for the packed case as the unpacked\n  algorithm is slightly better.\n\n- Some benchmarking added to the GpuIspShaderPass shows that the\n  two shaders on a reference from costing 20ms consume about 5.5ms.\n\n- In that light some caching is done at the end of the series to improve\n  the current throughput.\n\n  On the slower system I tested the series on the before case averages out\n  at about 22ms per frame.\n\n  Post this series we get between 18ms and 20ms. I'd call that a 10-15%\n  win.\n\n  On the slow system rb5-sm8250 the shaders are about 5.5ms of runtime. On\n  the fast hamoa-x1e system the whole process is about 6ms\n\n- Not tested\n  Unpacked CSI2 input - I don't have easy access to this input right now\n  DMABUF input caching - none of my hardware supports\n\n- The next steps for this series are:\n\n  - Converting the BLC normalise phase to a compute shader\n  - Having the BLC normalise phase produce an additional SSBO which\n    is the histogram of th bayer input.\n  - Using that fact to no-longer run CPU side bayer stats including\n    not having to map the buffer in the CPU.\n  - Emitting the input buffer after the BLC shader completes.\n    Possible only when generating stats in GPU.\n  - The CPU stats on the slow system I'm targetting consume about 4.5ms\n    of the original 20ms.\n    Done right the additional time in the shader should be low though\n    what syncing around the SSBO to subsequently use the buffer may be\n    a gotcha.\n  - Since \"we are where we are\" on fencing and glFinish() costs about\n    8 ms in this reference slow case - reaping 4.5 additional ms seems\n    like the next most logical thing to try to attack.\n\n    Caveated on the fact this series is too large and messy right now :)\n\n  - Fencing/Deferred fencing.\n    Right now libcamera as Nicolas pointed out on IRC, doesn't require\n    framebuffer recipients to dma-fence.\n\n    This means we need to fence in libcamera.\n\n    - Would the dma-buf ioctl for the output framebuffer produce\n      better synchronous wait times than glFinish() and if so\n      could we really trust the result. Probably no and yes I'd guess.\n\n    - Could we use egl fencing to achieve better wait-times.\n      No almost certainly not glFinish() is doing a real thing here\n      ensuring the GPU is finished.\n\n    - Could we do an asychronous wait - doing a fenceKHR at the top\n      of processGPU() for the previous frame ?\n      This would let the CPU do productive work while the GPU completes.\n\n    - Finally can we \"just\" require users to dma-fence the framebuffer.\n\n    - Other permutations on this theme are possible.\n\n  - Adding additional passes\n    We would like to have shaders and objects that are \"composable\" so that\n    for example you could run a GPU based noise filter on any frame.\n\n    This means having more granular GPUISP support is desirable.\n\n    Since the time spent moving from one shader to the other appears quite\n    low and not where we are burning time - a more granular number of passes\n    at the moment seems achievable.\n\nBryan O'Donoghue (30):\n  libcamera: software_isp: Rename Bayer classes to SoftwareIspPipeline\n  libcamera: software_isp: gpu: Change the name of eglImageBayerOut_ to\n    eglImageRGBAOut_\n  libcamera: software_isp: gpu: rename debayerGPU to processGPU\n  libcamera: software_isp: egl: Add new helper attachTextureToFBO\n  libcamera: software_isp: gpu_pipeline_shader_pass: Add base class\n    GpuPipelineShaderPass\n  libcamera: software_isp: gpu_pipeline_shader_pass: Add\n    GpuPipelineShaderPassDemosiac\n  libcamera: software_isp: gpu: Switch to using GpuIspShaderPassDemosiac\n  libcamera: software_isp: gpu: Drop unused method definitions\n  libcamera: software_isp: gpu: Make Rectangle window_ a local variable\n    in configure()\n  libcamera: software_isp: gpu_pipeline_shader_pass: Move common\n    attribute and uniform variables to base shader class\n  libcamera: software_isp: gpu_pipeline_shader_pass: Move common shader\n    selection logic into base class in new method initShaders()\n  libcamera: shaders: Split packed and unpacked demosiac up\n  libcamera: shaders: bayer_glr16_to_rgba.frag: Use bilinear filtering\n  libcamera: software_isp: gpu: Add GpuIspShaderPassBlcNormalise\n  libcamera: software_isp: egl: Extend eGL::createTexture2D to\n    understand floats\n  libcamera: software_isp: egl: Move to GLES 3.0\n  libcamera: software_isp: egl: Rename createTexture2D to\n    createInputTexture2D\n  libcamera: software_isp: egl: Use Texture Unit 3 for final output\n    texture\n  libcamera: software_isp: egl: Add Ping/Pong buffers with start/stop\n    bindings only\n  libcamera: software_isp: gpu: Include GpuIspShaderPassBlcNormalise in\n    init sequence\n  libcamera: software_isp: egl: Add createOutputTexture2D\n  libcamera: software_isp: gpu: Swtich to two pass logic\n  libcamera: software_isp: egl: Add method lookups for GPU benchmark\n    rountines\n  libcamera: software_isp: egl: Add eglBenchMark\n  libcamera: software_isp: gpu_pipeline_shader_pass: Add shader DEBUG\n    time logging\n  libcamera: software_isp: gpu: Do a synchronous BenchMark print after\n    syncOutput\n  libcamera: software_isp: egl: Add updateInputTexture2D\n  libcamera: software_isp: gpu: Switch to using glTexSubImage2D on slow\n    path upload\n  libcamera: software_isp: gpu: Cache output framebuffers, only recreate\n    when necessary\n  libcamera: software_isp: gpu: Cache input framebuffers, only do\n    texture creation when required\n\n include/libcamera/internal/egl.h              |  65 +-\n .../internal/software_isp/software_isp.h      |   4 +-\n src/libcamera/egl.cpp                         | 131 +++-\n .../bayer_1x_packed_to_blc_glr16f.frag        |  97 +++\n .../shaders/bayer_glr16_to_rgba.frag          | 155 ++++\n .../shaders/bayer_unpacked_to_blc_glr16f.frag |  46 ++\n src/libcamera/shaders/meson.build             |   3 +\n src/libcamera/software_isp/debayer_egl.cpp    | 671 ------------------\n .../software_isp/gpu_pipeline_shader_pass.cpp | 196 +++++\n .../software_isp/gpu_pipeline_shader_pass.h   | 109 +++\n ...gpu_pipeline_shader_pass_blc_normalise.cpp | 270 +++++++\n .../gpu_pipeline_shader_pass_blc_normalise.h  |  55 ++\n .../gpu_pipeline_shader_pass_demosiac.cpp     | 239 +++++++\n .../gpu_pipeline_shader_pass_demosiac.h       |  60 ++\n src/libcamera/software_isp/meson.build        |   9 +-\n src/libcamera/software_isp/software_isp.cpp   |  60 +-\n ...{debayer.cpp => software_isp_pipeline.cpp} |  77 +-\n .../{debayer.h => software_isp_pipeline.h}    |   8 +-\n ..._cpu.cpp => software_isp_pipeline_cpu.cpp} | 160 ++---\n ...ayer_cpu.h => software_isp_pipeline_cpu.h} |  10 +-\n .../software_isp_pipeline_gpu.cpp             | 433 +++++++++++\n ...ayer_egl.h => software_isp_pipeline_gpu.h} |  61 +-\n 22 files changed, 2023 insertions(+), 896 deletions(-)\n create mode 100644 src/libcamera/shaders/bayer_1x_packed_to_blc_glr16f.frag\n create mode 100644 src/libcamera/shaders/bayer_glr16_to_rgba.frag\n create mode 100644 src/libcamera/shaders/bayer_unpacked_to_blc_glr16f.frag\n delete mode 100644 src/libcamera/software_isp/debayer_egl.cpp\n create mode 100644 src/libcamera/software_isp/gpu_pipeline_shader_pass.cpp\n create mode 100644 src/libcamera/software_isp/gpu_pipeline_shader_pass.h\n create mode 100644 src/libcamera/software_isp/gpu_pipeline_shader_pass_blc_normalise.cpp\n create mode 100644 src/libcamera/software_isp/gpu_pipeline_shader_pass_blc_normalise.h\n create mode 100644 src/libcamera/software_isp/gpu_pipeline_shader_pass_demosiac.cpp\n create mode 100644 src/libcamera/software_isp/gpu_pipeline_shader_pass_demosiac.h\n rename src/libcamera/software_isp/{debayer.cpp => software_isp_pipeline.cpp} (73%)\n rename src/libcamera/software_isp/{debayer.h => software_isp_pipeline.h} (93%)\n rename src/libcamera/software_isp/{debayer_cpu.cpp => software_isp_pipeline_cpu.cpp} (84%)\n rename src/libcamera/software_isp/{debayer_cpu.h => software_isp_pipeline_cpu.h} (95%)\n create mode 100644 src/libcamera/software_isp/software_isp_pipeline_gpu.cpp\n rename src/libcamera/software_isp/{debayer_egl.h => software_isp_pipeline_gpu.h} (63%)"
}