[{"id":36254,"web_url":"https://patchwork.libcamera.org/comment/36254/","msgid":"<176051979461.1246375.415220886665614838@ping.linuxembedded.co.uk>","date":"2025-10-15T09:16:34","subject":"Re: [PATCH v3 01/39] libcamera: shaders: Move GL shader programs to\n\tsrc/libcamera/assets/shader","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Bryan O'Donoghue (2025-10-15 02:22:13)\n> Moving the vertex and fragment shaders to src/libcamera/assets/shader to\n> allow for reuse of these inside of the SoftISP.\n> \n> A comment has been added to src/apps/qcom/meson.build to force a\n> rebuild.\n> \n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n> ---\n>  .../libcamera/internal/shaders}/RGB.frag      |  0\n>  .../internal/shaders}/YUV_2_planes.frag       |  0\n>  .../internal/shaders}/YUV_3_planes.frag       |  0\n>  .../internal/shaders}/YUV_packed.frag         |  0\n>  .../internal/shaders}/bayer_1x_packed.frag    |  0\n>  .../libcamera/internal/shaders}/bayer_8.frag  |  0\n>  .../libcamera/internal/shaders}/bayer_8.vert  |  0\n>  .../libcamera/internal/shaders}/identity.vert |  0\n>  src/apps/qcam/assets/shader/shaders.qrc       | 16 ++---\n>  src/apps/qcam/meson.build                     |  3 +\n>  src/apps/qcam/viewfinder_gl.cpp               | 70 +++++++++----------\n>  11 files changed, 46 insertions(+), 43 deletions(-)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/RGB.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_2_planes.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_3_planes.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_packed.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_1x_packed.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.vert (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/identity.vert (100%)\n> \n> diff --git a/src/apps/qcam/assets/shader/RGB.frag b/include/libcamera/internal/shaders/RGB.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/RGB.frag\n> rename to include/libcamera/internal/shaders/RGB.frag\n> diff --git a/src/apps/qcam/assets/shader/YUV_2_planes.frag b/include/libcamera/internal/shaders/YUV_2_planes.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/YUV_2_planes.frag\n> rename to include/libcamera/internal/shaders/YUV_2_planes.frag\n> diff --git a/src/apps/qcam/assets/shader/YUV_3_planes.frag b/include/libcamera/internal/shaders/YUV_3_planes.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/YUV_3_planes.frag\n> rename to include/libcamera/internal/shaders/YUV_3_planes.frag\n> diff --git a/src/apps/qcam/assets/shader/YUV_packed.frag b/include/libcamera/internal/shaders/YUV_packed.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/YUV_packed.frag\n> rename to include/libcamera/internal/shaders/YUV_packed.frag\n> diff --git a/src/apps/qcam/assets/shader/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/bayer_1x_packed.frag\n> rename to include/libcamera/internal/shaders/bayer_1x_packed.frag\n> diff --git a/src/apps/qcam/assets/shader/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/bayer_8.frag\n> rename to include/libcamera/internal/shaders/bayer_8.frag\n> diff --git a/src/apps/qcam/assets/shader/bayer_8.vert b/include/libcamera/internal/shaders/bayer_8.vert\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/bayer_8.vert\n> rename to include/libcamera/internal/shaders/bayer_8.vert\n> diff --git a/src/apps/qcam/assets/shader/identity.vert b/include/libcamera/internal/shaders/identity.vert\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/identity.vert\n> rename to include/libcamera/internal/shaders/identity.vert\n> diff --git a/src/apps/qcam/assets/shader/shaders.qrc b/src/apps/qcam/assets/shader/shaders.qrc\n> index 96c709f9..04f9d706 100644\n> --- a/src/apps/qcam/assets/shader/shaders.qrc\n> +++ b/src/apps/qcam/assets/shader/shaders.qrc\n> @@ -1,13 +1,13 @@\n>  <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->\n>  <!DOCTYPE RCC><RCC version=\"1.0\">\n>  <qresource>\n> -       <file>RGB.frag</file>\n> -       <file>YUV_2_planes.frag</file>\n> -       <file>YUV_3_planes.frag</file>\n> -       <file>YUV_packed.frag</file>\n> -       <file>bayer_1x_packed.frag</file>\n> -       <file>bayer_8.frag</file>\n> -       <file>bayer_8.vert</file>\n> -       <file>identity.vert</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/RGB.frag</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/YUV_2_planes.frag</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/YUV_3_planes.frag</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/YUV_packed.frag</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/bayer_1x_packed.frag</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/bayer_8.frag</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/bayer_8.vert</file>\n> +       <file>../../../../../include/libcamera/internal/shaders/identity.vert</file>\n>  </qresource>\n>  </RCC>\n> diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build\n> index 9ca047b0..33600095 100644\n> --- a/src/apps/qcam/meson.build\n> +++ b/src/apps/qcam/meson.build\n> @@ -64,3 +64,6 @@ qcam  = executable('qcam', qcam_sources, resources,\n>                         qt6_dep,\n>                     ],\n>                     cpp_args : qt6_cpp_args)\n> +\n> +# Note: qt6.preprocess does not automatically rebuild when the\n> +# qcam_resources dependency chain is updated.\n\nI would have put this above the qt6.preprocess line but all the same.\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp\n> index f31956ff..70f60065 100644\n> --- a/src/apps/qcam/viewfinder_gl.cpp\n> +++ b/src/apps/qcam/viewfinder_gl.cpp\n> @@ -141,7 +141,7 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n>         textureMinMagFilters_ = GL_LINEAR;\n>  \n>         /* Use identity.vert as the default vertex shader. */\n> -       vertexShaderFile_ = \":identity.vert\";\n> +       vertexShaderFile_ = \":include/libcamera/internal/shaders/identity.vert\";\n>  \n>         fragmentShaderDefines_.clear();\n>  \n> @@ -150,170 +150,170 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n>                 horzSubSample_ = 2;\n>                 vertSubSample_ = 2;\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_UV\");\n> -               fragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>                 break;\n>         case libcamera::formats::NV21:\n>                 horzSubSample_ = 2;\n>                 vertSubSample_ = 2;\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_VU\");\n> -               fragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>                 break;\n>         case libcamera::formats::NV16:\n>                 horzSubSample_ = 2;\n>                 vertSubSample_ = 1;\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_UV\");\n> -               fragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>                 break;\n>         case libcamera::formats::NV61:\n>                 horzSubSample_ = 2;\n>                 vertSubSample_ = 1;\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_VU\");\n> -               fragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>                 break;\n>         case libcamera::formats::NV24:\n>                 horzSubSample_ = 1;\n>                 vertSubSample_ = 1;\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_UV\");\n> -               fragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>                 break;\n>         case libcamera::formats::NV42:\n>                 horzSubSample_ = 1;\n>                 vertSubSample_ = 1;\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_VU\");\n> -               fragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>                 break;\n>         case libcamera::formats::YUV420:\n>                 horzSubSample_ = 2;\n>                 vertSubSample_ = 2;\n> -               fragmentShaderFile_ = \":YUV_3_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_3_planes.frag\";\n>                 break;\n>         case libcamera::formats::YVU420:\n>                 horzSubSample_ = 2;\n>                 vertSubSample_ = 2;\n> -               fragmentShaderFile_ = \":YUV_3_planes.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_3_planes.frag\";\n>                 break;\n>         case libcamera::formats::UYVY:\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_UYVY\");\n> -               fragmentShaderFile_ = \":YUV_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>                 break;\n>         case libcamera::formats::VYUY:\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_VYUY\");\n> -               fragmentShaderFile_ = \":YUV_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>                 break;\n>         case libcamera::formats::YUYV:\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_YUYV\");\n> -               fragmentShaderFile_ = \":YUV_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>                 break;\n>         case libcamera::formats::YVYU:\n>                 fragmentShaderDefines_.append(\"#define YUV_PATTERN_YVYU\");\n> -               fragmentShaderFile_ = \":YUV_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>                 break;\n>         case libcamera::formats::ABGR8888:\n>                 fragmentShaderDefines_.append(\"#define RGB_PATTERN rgb\");\n> -               fragmentShaderFile_ = \":RGB.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>                 break;\n>         case libcamera::formats::ARGB8888:\n>                 fragmentShaderDefines_.append(\"#define RGB_PATTERN bgr\");\n> -               fragmentShaderFile_ = \":RGB.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>                 break;\n>         case libcamera::formats::BGRA8888:\n>                 fragmentShaderDefines_.append(\"#define RGB_PATTERN gba\");\n> -               fragmentShaderFile_ = \":RGB.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>                 break;\n>         case libcamera::formats::RGBA8888:\n>                 fragmentShaderDefines_.append(\"#define RGB_PATTERN abg\");\n> -               fragmentShaderFile_ = \":RGB.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>                 break;\n>         case libcamera::formats::BGR888:\n>                 fragmentShaderDefines_.append(\"#define RGB_PATTERN rgb\");\n> -               fragmentShaderFile_ = \":RGB.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>                 break;\n>         case libcamera::formats::RGB888:\n>                 fragmentShaderDefines_.append(\"#define RGB_PATTERN bgr\");\n> -               fragmentShaderFile_ = \":RGB.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>                 break;\n>         case libcamera::formats::SBGGR8:\n>                 firstRed_.setX(1.0);\n>                 firstRed_.setY(1.0);\n> -               vertexShaderFile_ = \":bayer_8.vert\";\n> -               fragmentShaderFile_ = \":bayer_8.frag\";\n> +               vertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SGBRG8:\n>                 firstRed_.setX(0.0);\n>                 firstRed_.setY(1.0);\n> -               vertexShaderFile_ = \":bayer_8.vert\";\n> -               fragmentShaderFile_ = \":bayer_8.frag\";\n> +               vertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SGRBG8:\n>                 firstRed_.setX(1.0);\n>                 firstRed_.setY(0.0);\n> -               vertexShaderFile_ = \":bayer_8.vert\";\n> -               fragmentShaderFile_ = \":bayer_8.frag\";\n> +               vertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SRGGB8:\n>                 firstRed_.setX(0.0);\n>                 firstRed_.setY(0.0);\n> -               vertexShaderFile_ = \":bayer_8.vert\";\n> -               fragmentShaderFile_ = \":bayer_8.frag\";\n> +               vertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SBGGR10_CSI2P:\n>                 firstRed_.setX(1.0);\n>                 firstRed_.setY(1.0);\n>                 fragmentShaderDefines_.append(\"#define RAW10P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SGBRG10_CSI2P:\n>                 firstRed_.setX(0.0);\n>                 firstRed_.setY(1.0);\n>                 fragmentShaderDefines_.append(\"#define RAW10P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SGRBG10_CSI2P:\n>                 firstRed_.setX(1.0);\n>                 firstRed_.setY(0.0);\n>                 fragmentShaderDefines_.append(\"#define RAW10P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SRGGB10_CSI2P:\n>                 firstRed_.setX(0.0);\n>                 firstRed_.setY(0.0);\n>                 fragmentShaderDefines_.append(\"#define RAW10P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SBGGR12_CSI2P:\n>                 firstRed_.setX(1.0);\n>                 firstRed_.setY(1.0);\n>                 fragmentShaderDefines_.append(\"#define RAW12P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SGBRG12_CSI2P:\n>                 firstRed_.setX(0.0);\n>                 firstRed_.setY(1.0);\n>                 fragmentShaderDefines_.append(\"#define RAW12P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SGRBG12_CSI2P:\n>                 firstRed_.setX(1.0);\n>                 firstRed_.setY(0.0);\n>                 fragmentShaderDefines_.append(\"#define RAW12P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         case libcamera::formats::SRGGB12_CSI2P:\n>                 firstRed_.setX(0.0);\n>                 firstRed_.setY(0.0);\n>                 fragmentShaderDefines_.append(\"#define RAW12P\");\n> -               fragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +               fragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>                 textureMinMagFilters_ = GL_NEAREST;\n>                 break;\n>         default:\n> -- \n> 2.51.0\n>","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 2CE47BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 15 Oct 2025 09:16:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 45A4760615;\n\tWed, 15 Oct 2025 11:16:39 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0427660314\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 15 Oct 2025 11:16:37 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B8D4BE92;\n\tWed, 15 Oct 2025 11:14:58 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"K90x+/vC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1760519698;\n\tbh=PEO0zkyKaTsn9vX3Vh682w/FkeUI7tt66U4WWmvNOZs=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=K90x+/vC98/rppbhWeJxmaUWEV06B6O7Q8KEsZAn2cC2mFZUmBMZolNzcttyJ2iR9\n\txuO3oFbe8KJDIikiKgOrRX9q0cvz7PUV/ERtqQywZ3nUqJY1FUnH96/OxiFlZUJ0dn\n\tVh++aH2OlQalU7YVdFoKPjpF312LjiL2YoqLQP3M=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251015012251.17508-2-bryan.odonoghue@linaro.org>","References":"<20251015012251.17508-1-bryan.odonoghue@linaro.org>\n\t<20251015012251.17508-2-bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH v3 01/39] libcamera: shaders: Move GL shader programs to\n\tsrc/libcamera/assets/shader","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"hdegoede@redhat.com, mzamazal@redhat.com, bryan.odonoghue@linaro.org,\n\tbod.linux@nxsw.ie","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Wed, 15 Oct 2025 10:16:34 +0100","Message-ID":"<176051979461.1246375.415220886665614838@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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>"}},{"id":36290,"web_url":"https://patchwork.libcamera.org/comment/36290/","msgid":"<851pn3iao8.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-10-16T07:10:47","subject":"Re: [PATCH v3 01/39] libcamera: shaders: Move GL shader programs to\n\tsrc/libcamera/assets/shader","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Bryan O'Donoghue <bryan.odonoghue@linaro.org> writes:\n\n> Moving the vertex and fragment shaders to src/libcamera/assets/shader to\n> allow for reuse of these inside of the SoftISP.\n>\n> A comment has been added to src/apps/qcom/meson.build to force a\n> rebuild.\n>\n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\n\n> ---\n>  .../libcamera/internal/shaders}/RGB.frag      |  0\n>  .../internal/shaders}/YUV_2_planes.frag       |  0\n>  .../internal/shaders}/YUV_3_planes.frag       |  0\n>  .../internal/shaders}/YUV_packed.frag         |  0\n>  .../internal/shaders}/bayer_1x_packed.frag    |  0\n>  .../libcamera/internal/shaders}/bayer_8.frag  |  0\n>  .../libcamera/internal/shaders}/bayer_8.vert  |  0\n>  .../libcamera/internal/shaders}/identity.vert |  0\n>  src/apps/qcam/assets/shader/shaders.qrc       | 16 ++---\n>  src/apps/qcam/meson.build                     |  3 +\n>  src/apps/qcam/viewfinder_gl.cpp               | 70 +++++++++----------\n>  11 files changed, 46 insertions(+), 43 deletions(-)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/RGB.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_2_planes.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_3_planes.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_packed.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_1x_packed.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.frag (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.vert (100%)\n>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/identity.vert (100%)\n>\n> diff --git a/src/apps/qcam/assets/shader/RGB.frag b/include/libcamera/internal/shaders/RGB.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/RGB.frag\n> rename to include/libcamera/internal/shaders/RGB.frag\n> diff --git a/src/apps/qcam/assets/shader/YUV_2_planes.frag b/include/libcamera/internal/shaders/YUV_2_planes.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/YUV_2_planes.frag\n> rename to include/libcamera/internal/shaders/YUV_2_planes.frag\n> diff --git a/src/apps/qcam/assets/shader/YUV_3_planes.frag b/include/libcamera/internal/shaders/YUV_3_planes.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/YUV_3_planes.frag\n> rename to include/libcamera/internal/shaders/YUV_3_planes.frag\n> diff --git a/src/apps/qcam/assets/shader/YUV_packed.frag b/include/libcamera/internal/shaders/YUV_packed.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/YUV_packed.frag\n> rename to include/libcamera/internal/shaders/YUV_packed.frag\n> diff --git a/src/apps/qcam/assets/shader/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/bayer_1x_packed.frag\n> rename to include/libcamera/internal/shaders/bayer_1x_packed.frag\n> diff --git a/src/apps/qcam/assets/shader/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/bayer_8.frag\n> rename to include/libcamera/internal/shaders/bayer_8.frag\n> diff --git a/src/apps/qcam/assets/shader/bayer_8.vert b/include/libcamera/internal/shaders/bayer_8.vert\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/bayer_8.vert\n> rename to include/libcamera/internal/shaders/bayer_8.vert\n> diff --git a/src/apps/qcam/assets/shader/identity.vert b/include/libcamera/internal/shaders/identity.vert\n> similarity index 100%\n> rename from src/apps/qcam/assets/shader/identity.vert\n> rename to include/libcamera/internal/shaders/identity.vert\n> diff --git a/src/apps/qcam/assets/shader/shaders.qrc b/src/apps/qcam/assets/shader/shaders.qrc\n> index 96c709f9..04f9d706 100644\n> --- a/src/apps/qcam/assets/shader/shaders.qrc\n> +++ b/src/apps/qcam/assets/shader/shaders.qrc\n> @@ -1,13 +1,13 @@\n>  <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->\n>  <!DOCTYPE RCC><RCC version=\"1.0\">\n>  <qresource>\n> -\t<file>RGB.frag</file>\n> -\t<file>YUV_2_planes.frag</file>\n> -\t<file>YUV_3_planes.frag</file>\n> -\t<file>YUV_packed.frag</file>\n> -\t<file>bayer_1x_packed.frag</file>\n> -\t<file>bayer_8.frag</file>\n> -\t<file>bayer_8.vert</file>\n> -\t<file>identity.vert</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/RGB.frag</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/YUV_2_planes.frag</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/YUV_3_planes.frag</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/YUV_packed.frag</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/bayer_1x_packed.frag</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/bayer_8.frag</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/bayer_8.vert</file>\n> +\t<file>../../../../../include/libcamera/internal/shaders/identity.vert</file>\n>  </qresource>\n>  </RCC>\n> diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build\n> index 9ca047b0..33600095 100644\n> --- a/src/apps/qcam/meson.build\n> +++ b/src/apps/qcam/meson.build\n> @@ -64,3 +64,6 @@ qcam  = executable('qcam', qcam_sources, resources,\n>                         qt6_dep,\n>                     ],\n>                     cpp_args : qt6_cpp_args)\n> +\n> +# Note: qt6.preprocess does not automatically rebuild when the\n> +# qcam_resources dependency chain is updated.\n> diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp\n> index f31956ff..70f60065 100644\n> --- a/src/apps/qcam/viewfinder_gl.cpp\n> +++ b/src/apps/qcam/viewfinder_gl.cpp\n> @@ -141,7 +141,7 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n>  \ttextureMinMagFilters_ = GL_LINEAR;\n>  \n>  \t/* Use identity.vert as the default vertex shader. */\n> -\tvertexShaderFile_ = \":identity.vert\";\n> +\tvertexShaderFile_ = \":include/libcamera/internal/shaders/identity.vert\";\n>  \n>  \tfragmentShaderDefines_.clear();\n>  \n> @@ -150,170 +150,170 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n>  \t\thorzSubSample_ = 2;\n>  \t\tvertSubSample_ = 2;\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_UV\");\n> -\t\tfragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::NV21:\n>  \t\thorzSubSample_ = 2;\n>  \t\tvertSubSample_ = 2;\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_VU\");\n> -\t\tfragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::NV16:\n>  \t\thorzSubSample_ = 2;\n>  \t\tvertSubSample_ = 1;\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_UV\");\n> -\t\tfragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::NV61:\n>  \t\thorzSubSample_ = 2;\n>  \t\tvertSubSample_ = 1;\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_VU\");\n> -\t\tfragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::NV24:\n>  \t\thorzSubSample_ = 1;\n>  \t\tvertSubSample_ = 1;\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_UV\");\n> -\t\tfragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::NV42:\n>  \t\thorzSubSample_ = 1;\n>  \t\tvertSubSample_ = 1;\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_VU\");\n> -\t\tfragmentShaderFile_ = \":YUV_2_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_2_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::YUV420:\n>  \t\thorzSubSample_ = 2;\n>  \t\tvertSubSample_ = 2;\n> -\t\tfragmentShaderFile_ = \":YUV_3_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_3_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::YVU420:\n>  \t\thorzSubSample_ = 2;\n>  \t\tvertSubSample_ = 2;\n> -\t\tfragmentShaderFile_ = \":YUV_3_planes.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_3_planes.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::UYVY:\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_UYVY\");\n> -\t\tfragmentShaderFile_ = \":YUV_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::VYUY:\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_VYUY\");\n> -\t\tfragmentShaderFile_ = \":YUV_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::YUYV:\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_YUYV\");\n> -\t\tfragmentShaderFile_ = \":YUV_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::YVYU:\n>  \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_YVYU\");\n> -\t\tfragmentShaderFile_ = \":YUV_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/YUV_packed.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::ABGR8888:\n>  \t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN rgb\");\n> -\t\tfragmentShaderFile_ = \":RGB.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::ARGB8888:\n>  \t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN bgr\");\n> -\t\tfragmentShaderFile_ = \":RGB.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::BGRA8888:\n>  \t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN gba\");\n> -\t\tfragmentShaderFile_ = \":RGB.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::RGBA8888:\n>  \t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN abg\");\n> -\t\tfragmentShaderFile_ = \":RGB.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::BGR888:\n>  \t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN rgb\");\n> -\t\tfragmentShaderFile_ = \":RGB.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::RGB888:\n>  \t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN bgr\");\n> -\t\tfragmentShaderFile_ = \":RGB.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/RGB.frag\";\n>  \t\tbreak;\n>  \tcase libcamera::formats::SBGGR8:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(1.0);\n> -\t\tvertexShaderFile_ = \":bayer_8.vert\";\n> -\t\tfragmentShaderFile_ = \":bayer_8.frag\";\n> +\t\tvertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGBRG8:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(1.0);\n> -\t\tvertexShaderFile_ = \":bayer_8.vert\";\n> -\t\tfragmentShaderFile_ = \":bayer_8.frag\";\n> +\t\tvertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGRBG8:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(0.0);\n> -\t\tvertexShaderFile_ = \":bayer_8.vert\";\n> -\t\tfragmentShaderFile_ = \":bayer_8.frag\";\n> +\t\tvertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SRGGB8:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(0.0);\n> -\t\tvertexShaderFile_ = \":bayer_8.vert\";\n> -\t\tfragmentShaderFile_ = \":bayer_8.frag\";\n> +\t\tvertexShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.vert\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_8.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SBGGR10_CSI2P:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(1.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGBRG10_CSI2P:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(1.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGRBG10_CSI2P:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(0.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SRGGB10_CSI2P:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(0.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SBGGR12_CSI2P:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(1.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGBRG12_CSI2P:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(1.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGRBG12_CSI2P:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(0.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SRGGB12_CSI2P:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(0.0);\n>  \t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> -\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\tfragmentShaderFile_ = \":include/libcamera/internal/shaders/bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tdefault:","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 850ABC3259\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 16 Oct 2025 07:10:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7D70E60652;\n\tThu, 16 Oct 2025 09:10:55 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BF660600CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 16 Oct 2025 09:10:53 +0200 (CEST)","from mail-ej1-f69.google.com (mail-ej1-f69.google.com\n\t[209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-644-jceWZzNwNzCg6NOb8nMMeQ-1; Thu, 16 Oct 2025 03:10:51 -0400","by mail-ej1-f69.google.com with SMTP id\n\ta640c23a62f3a-b4068ff9c19so38209466b.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 16 Oct 2025 00:10:50 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\ta640c23a62f3a-b5ccd2a6435sm422488666b.65.2025.10.16.00.10.48\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 16 Oct 2025 00:10:48 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"LdMGW58K\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1760598652;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=r/1NPaduVy4PZoYVdj2L2tR0U65kg9AAQud4rTvg4e4=;\n\tb=LdMGW58KlFFpYCjV4Wj3Yh4OlNJlhTztHzpl0vuxew9mG34xAq33obKdiNXn3VnWQ+d4NH\n\tiokfGNopaRu54Bb55Bvdad2tIm9fnTE4oZdoGCc+41ltbgdUvHoBQLMd77JO6dK92Xy17w\n\tR+SkAEFjSXWLQt1qwP+QGvmO3IgDvLI=","X-MC-Unique":"jceWZzNwNzCg6NOb8nMMeQ-1","X-Mimecast-MFC-AGG-ID":"jceWZzNwNzCg6NOb8nMMeQ_1760598650","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1760598650; x=1761203450;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=r/1NPaduVy4PZoYVdj2L2tR0U65kg9AAQud4rTvg4e4=;\n\tb=jH+Qv90aDTBmdUIRIFVOzY7wtFDNnaZksTb78+nHhCygzzxizfwFwZ1UxWXHADzJyF\n\t/Aw0q77FVrQBce/OMRp5glCKrhPqVZB6yCkovFbUaTqpEsNJX9JmMwweMNQRBQ4X6q2J\n\tgjLp3hC5Q67cXohLSD+CuQkLxSMmFcyFjiynpT42xIJ6EiL4VltuDUH8TNXpxfFQR7Cn\n\t9KO0/O4zRDXiDmEONNmMCC2ASw9a6yjBzIPdZC1gKsh4p1DU1/3XGRHzfu9/1sZduoo6\n\ta6pveJ4yRG8M8/zdJzI78Q5fO4VVsUJ0Ur8yRhvz1lwJvKb25NzAkBtIy2vICHPPoiy1\n\t2fAA==","X-Gm-Message-State":"AOJu0YxGZDIHXE14th8YhNJaENDkFrgedBlqruVDegBuOSBac2O/Ijm4\n\tNe0FWUaiW7aF5LDtcQUcfdTtVnjK/Iryeu76MZXHAwS4P4EExWqP07WRXqIpv9HXZtphDfGSapx\n\tKOaKLm8mFXiJJ+Td+ple6Lr9auDSwOg5IWdeTHawlVbzEB+JSe1wRwvkD1JSpo4WuQxWa2AoSXS\n\ts=","X-Gm-Gg":"ASbGncvZ1q9y4mnxwwc/c/eog0pazVtDMvAfLlRlCGXllZrKWlxTFG8zWfPU+APdLpl\n\th0s37qz3bgccKIxi7LHCQxBCd2Hqb5dpnBF/BwWSgtwaazuaKolYHIuciLsd2yxQG9zZp2deA5X\n\tFfwQCT9MZhuFkjCyX3oeSJLKGIugCuwECJJ2HAwiscSy1WbGZ6oIlW4+aBEm48ePbh6PYNrqbhf\n\tYko5Bm4q08wMx2Vax64IsePNb94hc6do0PDqbo4n1jSfw4+1OwOXNlES0rKLu96MVbDuj0segEt\n\tQkELpEw+PuAlUSXZyyvJHaIrFQ2pjNuDgKk4/Zq/EEbLbDtjb+zk1dtXqyEtiCRoOwtXAMTGcEu\n\tcKBHfBMsWM53KI5CyLkQuhwzOLwCUMkI75gfrCMbkywNQWNvs9m8z","X-Received":["by 2002:a17:907:7f13:b0:b45:e09c:7e66 with SMTP id\n\ta640c23a62f3a-b50aa8a5bfdmr3219239066b.28.1760598649718; \n\tThu, 16 Oct 2025 00:10:49 -0700 (PDT)","by 2002:a17:907:7f13:b0:b45:e09c:7e66 with SMTP id\n\ta640c23a62f3a-b50aa8a5bfdmr3219236566b.28.1760598649214; \n\tThu, 16 Oct 2025 00:10:49 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IGuX86NwbJY8kkvqF15oJZ5EQF7/0SKl9x97uF6j7cxphmHFlGp8c9GV5H/5HEGVauvGZkwiw==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"libcamera-devel@lists.libcamera.org,  hdegoede@redhat.com,\n\tbod.linux@nxsw.ie","Subject":"Re: [PATCH v3 01/39] libcamera: shaders: Move GL shader programs to\n\tsrc/libcamera/assets/shader","In-Reply-To":"<20251015012251.17508-2-bryan.odonoghue@linaro.org> (Bryan\n\tO'Donoghue's message of \"Wed, 15 Oct 2025 02:22:13 +0100\")","References":"<20251015012251.17508-1-bryan.odonoghue@linaro.org>\n\t<20251015012251.17508-2-bryan.odonoghue@linaro.org>","Date":"Thu, 16 Oct 2025 09:10:47 +0200","Message-ID":"<851pn3iao8.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"r2XbOsjQUFQeuh9Uh2WFW93eHLVvDOBPUvjmbDMdzQo_1760598650","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]