[01/22] libcamera: shaders: Move GL shader programs to src/libcamera/assets/shader
diff mbox series

Message ID 20251120232019.3590-2-bryan.odonoghue@linaro.org
State Superseded
Headers show
Series
  • GPUISP precursor series
Related show

Commit Message

Bryan O'Donoghue Nov. 20, 2025, 11:19 p.m. UTC
Moving the vertex and fragment shaders to src/libcamera/assets/shader to
allow for reuse of these inside of the SoftISP.

A comment has been added to src/apps/qcom/meson.build to force a
rebuild.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
 .../libcamera/internal/shaders}/RGB.frag      |  0
 .../internal/shaders}/YUV_2_planes.frag       |  0
 .../internal/shaders}/YUV_3_planes.frag       |  0
 .../internal/shaders}/YUV_packed.frag         |  0
 .../internal/shaders}/bayer_1x_packed.frag    |  0
 .../libcamera/internal/shaders}/bayer_8.frag  |  0
 .../libcamera/internal/shaders}/bayer_8.vert  |  0
 .../libcamera/internal/shaders}/identity.vert |  0
 src/apps/qcam/assets/shader/shaders.qrc       | 16 ++---
 src/apps/qcam/meson.build                     |  3 +
 src/apps/qcam/viewfinder_gl.cpp               | 70 +++++++++----------
 11 files changed, 46 insertions(+), 43 deletions(-)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/RGB.frag (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_2_planes.frag (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_3_planes.frag (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_packed.frag (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_1x_packed.frag (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.frag (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.vert (100%)
 rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/identity.vert (100%)

Comments

Laurent Pinchart Nov. 21, 2025, 3:10 a.m. UTC | #1
On Thu, Nov 20, 2025 at 11:19:58PM +0000, Bryan O'Donoghue wrote:
> Moving the vertex and fragment shaders to src/libcamera/assets/shader to
> allow for reuse of these inside of the SoftISP.

The commit message doesn't match the patch.

Why did you pick include/ ? Shaders are not headers.

> A comment has been added to src/apps/qcom/meson.build to force a
> rebuild.
> 
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
>  .../libcamera/internal/shaders}/RGB.frag      |  0
>  .../internal/shaders}/YUV_2_planes.frag       |  0
>  .../internal/shaders}/YUV_3_planes.frag       |  0
>  .../internal/shaders}/YUV_packed.frag         |  0
>  .../internal/shaders}/bayer_1x_packed.frag    |  0
>  .../libcamera/internal/shaders}/bayer_8.frag  |  0
>  .../libcamera/internal/shaders}/bayer_8.vert  |  0
>  .../libcamera/internal/shaders}/identity.vert |  0
>  src/apps/qcam/assets/shader/shaders.qrc       | 16 ++---
>  src/apps/qcam/meson.build                     |  3 +
>  src/apps/qcam/viewfinder_gl.cpp               | 70 +++++++++----------
>  11 files changed, 46 insertions(+), 43 deletions(-)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/RGB.frag (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_2_planes.frag (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_3_planes.frag (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/YUV_packed.frag (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_1x_packed.frag (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.frag (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/bayer_8.vert (100%)
>  rename {src/apps/qcam/assets/shader => include/libcamera/internal/shaders}/identity.vert (100%)
> 
> diff --git a/src/apps/qcam/assets/shader/RGB.frag b/include/libcamera/internal/shaders/RGB.frag
> similarity index 100%
> rename from src/apps/qcam/assets/shader/RGB.frag
> rename to include/libcamera/internal/shaders/RGB.frag
> diff --git a/src/apps/qcam/assets/shader/YUV_2_planes.frag b/include/libcamera/internal/shaders/YUV_2_planes.frag
> similarity index 100%
> rename from src/apps/qcam/assets/shader/YUV_2_planes.frag
> rename to include/libcamera/internal/shaders/YUV_2_planes.frag
> diff --git a/src/apps/qcam/assets/shader/YUV_3_planes.frag b/include/libcamera/internal/shaders/YUV_3_planes.frag
> similarity index 100%
> rename from src/apps/qcam/assets/shader/YUV_3_planes.frag
> rename to include/libcamera/internal/shaders/YUV_3_planes.frag
> diff --git a/src/apps/qcam/assets/shader/YUV_packed.frag b/include/libcamera/internal/shaders/YUV_packed.frag
> similarity index 100%
> rename from src/apps/qcam/assets/shader/YUV_packed.frag
> rename to include/libcamera/internal/shaders/YUV_packed.frag
> diff --git a/src/apps/qcam/assets/shader/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag
> similarity index 100%
> rename from src/apps/qcam/assets/shader/bayer_1x_packed.frag
> rename to include/libcamera/internal/shaders/bayer_1x_packed.frag
> diff --git a/src/apps/qcam/assets/shader/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag
> similarity index 100%
> rename from src/apps/qcam/assets/shader/bayer_8.frag
> rename to include/libcamera/internal/shaders/bayer_8.frag
> diff --git a/src/apps/qcam/assets/shader/bayer_8.vert b/include/libcamera/internal/shaders/bayer_8.vert
> similarity index 100%
> rename from src/apps/qcam/assets/shader/bayer_8.vert
> rename to include/libcamera/internal/shaders/bayer_8.vert
> diff --git a/src/apps/qcam/assets/shader/identity.vert b/include/libcamera/internal/shaders/identity.vert
> similarity index 100%
> rename from src/apps/qcam/assets/shader/identity.vert
> rename to include/libcamera/internal/shaders/identity.vert
> diff --git a/src/apps/qcam/assets/shader/shaders.qrc b/src/apps/qcam/assets/shader/shaders.qrc
> index 96c709f92..04f9d7061 100644
> --- a/src/apps/qcam/assets/shader/shaders.qrc
> +++ b/src/apps/qcam/assets/shader/shaders.qrc
> @@ -1,13 +1,13 @@
>  <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
>  <!DOCTYPE RCC><RCC version="1.0">
>  <qresource>
> -	<file>RGB.frag</file>
> -	<file>YUV_2_planes.frag</file>
> -	<file>YUV_3_planes.frag</file>
> -	<file>YUV_packed.frag</file>
> -	<file>bayer_1x_packed.frag</file>
> -	<file>bayer_8.frag</file>
> -	<file>bayer_8.vert</file>
> -	<file>identity.vert</file>
> +	<file>../../../../../include/libcamera/internal/shaders/RGB.frag</file>
> +	<file>../../../../../include/libcamera/internal/shaders/YUV_2_planes.frag</file>
> +	<file>../../../../../include/libcamera/internal/shaders/YUV_3_planes.frag</file>
> +	<file>../../../../../include/libcamera/internal/shaders/YUV_packed.frag</file>
> +	<file>../../../../../include/libcamera/internal/shaders/bayer_1x_packed.frag</file>
> +	<file>../../../../../include/libcamera/internal/shaders/bayer_8.frag</file>
> +	<file>../../../../../include/libcamera/internal/shaders/bayer_8.vert</file>
> +	<file>../../../../../include/libcamera/internal/shaders/identity.vert</file>
>  </qresource>
>  </RCC>
> diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build
> index 9ca047b0f..33600095f 100644
> --- a/src/apps/qcam/meson.build
> +++ b/src/apps/qcam/meson.build
> @@ -64,3 +64,6 @@ qcam  = executable('qcam', qcam_sources, resources,
>                         qt6_dep,
>                     ],
>                     cpp_args : qt6_cpp_args)
> +
> +# Note: qt6.preprocess does not automatically rebuild when the
> +# qcam_resources dependency chain is updated.
> diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp
> index f31956ff0..70f600650 100644
> --- a/src/apps/qcam/viewfinder_gl.cpp
> +++ b/src/apps/qcam/viewfinder_gl.cpp
> @@ -141,7 +141,7 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
>  	textureMinMagFilters_ = GL_LINEAR;
>  
>  	/* Use identity.vert as the default vertex shader. */
> -	vertexShaderFile_ = ":identity.vert";
> +	vertexShaderFile_ = ":include/libcamera/internal/shaders/identity.vert";
>  
>  	fragmentShaderDefines_.clear();
>  
> @@ -150,170 +150,170 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
>  		horzSubSample_ = 2;
>  		vertSubSample_ = 2;
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
> -		fragmentShaderFile_ = ":YUV_2_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
>  		break;
>  	case libcamera::formats::NV21:
>  		horzSubSample_ = 2;
>  		vertSubSample_ = 2;
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
> -		fragmentShaderFile_ = ":YUV_2_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
>  		break;
>  	case libcamera::formats::NV16:
>  		horzSubSample_ = 2;
>  		vertSubSample_ = 1;
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
> -		fragmentShaderFile_ = ":YUV_2_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
>  		break;
>  	case libcamera::formats::NV61:
>  		horzSubSample_ = 2;
>  		vertSubSample_ = 1;
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
> -		fragmentShaderFile_ = ":YUV_2_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
>  		break;
>  	case libcamera::formats::NV24:
>  		horzSubSample_ = 1;
>  		vertSubSample_ = 1;
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
> -		fragmentShaderFile_ = ":YUV_2_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
>  		break;
>  	case libcamera::formats::NV42:
>  		horzSubSample_ = 1;
>  		vertSubSample_ = 1;
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
> -		fragmentShaderFile_ = ":YUV_2_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
>  		break;
>  	case libcamera::formats::YUV420:
>  		horzSubSample_ = 2;
>  		vertSubSample_ = 2;
> -		fragmentShaderFile_ = ":YUV_3_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_3_planes.frag";
>  		break;
>  	case libcamera::formats::YVU420:
>  		horzSubSample_ = 2;
>  		vertSubSample_ = 2;
> -		fragmentShaderFile_ = ":YUV_3_planes.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_3_planes.frag";
>  		break;
>  	case libcamera::formats::UYVY:
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_UYVY");
> -		fragmentShaderFile_ = ":YUV_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
>  		break;
>  	case libcamera::formats::VYUY:
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_VYUY");
> -		fragmentShaderFile_ = ":YUV_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
>  		break;
>  	case libcamera::formats::YUYV:
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_YUYV");
> -		fragmentShaderFile_ = ":YUV_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
>  		break;
>  	case libcamera::formats::YVYU:
>  		fragmentShaderDefines_.append("#define YUV_PATTERN_YVYU");
> -		fragmentShaderFile_ = ":YUV_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
>  		break;
>  	case libcamera::formats::ABGR8888:
>  		fragmentShaderDefines_.append("#define RGB_PATTERN rgb");
> -		fragmentShaderFile_ = ":RGB.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
>  		break;
>  	case libcamera::formats::ARGB8888:
>  		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
> -		fragmentShaderFile_ = ":RGB.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
>  		break;
>  	case libcamera::formats::BGRA8888:
>  		fragmentShaderDefines_.append("#define RGB_PATTERN gba");
> -		fragmentShaderFile_ = ":RGB.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
>  		break;
>  	case libcamera::formats::RGBA8888:
>  		fragmentShaderDefines_.append("#define RGB_PATTERN abg");
> -		fragmentShaderFile_ = ":RGB.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
>  		break;
>  	case libcamera::formats::BGR888:
>  		fragmentShaderDefines_.append("#define RGB_PATTERN rgb");
> -		fragmentShaderFile_ = ":RGB.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
>  		break;
>  	case libcamera::formats::RGB888:
>  		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
> -		fragmentShaderFile_ = ":RGB.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
>  		break;
>  	case libcamera::formats::SBGGR8:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(1.0);
> -		vertexShaderFile_ = ":bayer_8.vert";
> -		fragmentShaderFile_ = ":bayer_8.frag";
> +		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SGBRG8:
>  		firstRed_.setX(0.0);
>  		firstRed_.setY(1.0);
> -		vertexShaderFile_ = ":bayer_8.vert";
> -		fragmentShaderFile_ = ":bayer_8.frag";
> +		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SGRBG8:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(0.0);
> -		vertexShaderFile_ = ":bayer_8.vert";
> -		fragmentShaderFile_ = ":bayer_8.frag";
> +		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SRGGB8:
>  		firstRed_.setX(0.0);
>  		firstRed_.setY(0.0);
> -		vertexShaderFile_ = ":bayer_8.vert";
> -		fragmentShaderFile_ = ":bayer_8.frag";
> +		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SBGGR10_CSI2P:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(1.0);
>  		fragmentShaderDefines_.append("#define RAW10P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SGBRG10_CSI2P:
>  		firstRed_.setX(0.0);
>  		firstRed_.setY(1.0);
>  		fragmentShaderDefines_.append("#define RAW10P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SGRBG10_CSI2P:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(0.0);
>  		fragmentShaderDefines_.append("#define RAW10P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SRGGB10_CSI2P:
>  		firstRed_.setX(0.0);
>  		firstRed_.setY(0.0);
>  		fragmentShaderDefines_.append("#define RAW10P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SBGGR12_CSI2P:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(1.0);
>  		fragmentShaderDefines_.append("#define RAW12P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SGBRG12_CSI2P:
>  		firstRed_.setX(0.0);
>  		firstRed_.setY(1.0);
>  		fragmentShaderDefines_.append("#define RAW12P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SGRBG12_CSI2P:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(0.0);
>  		fragmentShaderDefines_.append("#define RAW12P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	case libcamera::formats::SRGGB12_CSI2P:
>  		firstRed_.setX(0.0);
>  		firstRed_.setY(0.0);
>  		fragmentShaderDefines_.append("#define RAW12P");
> -		fragmentShaderFile_ = ":bayer_1x_packed.frag";
> +		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
>  		textureMinMagFilters_ = GL_NEAREST;
>  		break;
>  	default:
Bryan O'Donoghue Nov. 21, 2025, 11:29 a.m. UTC | #2
On 21/11/2025 03:10, Laurent Pinchart wrote:
> On Thu, Nov 20, 2025 at 11:19:58PM +0000, Bryan O'Donoghue wrote:
>> Moving the vertex and fragment shaders to src/libcamera/assets/shader to
>> allow for reuse of these inside of the SoftISP.
> The commit message doesn't match the patch.
> 
> Why did you pick include/ ? Shaders are not headers.

Its been like this for a while I'm not sure there was/is a good reason 
to have these in an include dir.

Do you have some other preference ?

---
bod
Barnabás Pőcze Nov. 21, 2025, 11:33 a.m. UTC | #3
2025. 11. 21. 12:29 keltezéssel, Bryan O'Donoghue írta:
> On 21/11/2025 03:10, Laurent Pinchart wrote:
>> On Thu, Nov 20, 2025 at 11:19:58PM +0000, Bryan O'Donoghue wrote:
>>> Moving the vertex and fragment shaders to src/libcamera/assets/shader to
>>> allow for reuse of these inside of the SoftISP.
>> The commit message doesn't match the patch.
>>
>> Why did you pick include/ ? Shaders are not headers.
> 
> Its been like this for a while I'm not sure there was/is a good reason to have these in an include dir.
> 
> Do you have some other preference ?

The title of the commit says "src/libcamera/assets/shader".
To me that looks like a better location at first glance.


> 
> ---
> bod
Bryan O'Donoghue Nov. 26, 2025, 12:38 p.m. UTC | #4
On 21/11/2025 03:10, Laurent Pinchart wrote:
> On Thu, Nov 20, 2025 at 11:19:58PM +0000, Bryan O'Donoghue wrote:
>> Moving the vertex and fragment shaders to src/libcamera/assets/shader to
>> allow for reuse of these inside of the SoftISP.
> 
> The commit message doesn't match the patch.
> 
> Why did you pick include/ ? Shaders are not headers.
> 
For the record.

I moved these go src/libcamera/shaders and it appears to work.

---
bod
Laurent Pinchart Nov. 27, 2025, 3:37 a.m. UTC | #5
On Fri, Nov 21, 2025 at 12:33:07PM +0100, Barnabás Pőcze wrote:
> 2025. 11. 21. 12:29 keltezéssel, Bryan O'Donoghue írta:
> > On 21/11/2025 03:10, Laurent Pinchart wrote:
> >> On Thu, Nov 20, 2025 at 11:19:58PM +0000, Bryan O'Donoghue wrote:
> >>> Moving the vertex and fragment shaders to src/libcamera/assets/shader to
> >>> allow for reuse of these inside of the SoftISP.
> >> The commit message doesn't match the patch.
> >>
> >> Why did you pick include/ ? Shaders are not headers.
> > 
> > Its been like this for a while I'm not sure there was/is a good reason to have these in an include dir.
> > 
> > Do you have some other preference ?
> 
> The title of the commit says "src/libcamera/assets/shader".
> To me that looks like a better location at first glance.

Or src/libcamera/softisp/shaders/ as it's part of the soft ISP ?
Laurent Pinchart Nov. 27, 2025, 3:38 a.m. UTC | #6
On Wed, Nov 26, 2025 at 12:38:25PM +0000, Bryan O'Donoghue wrote:
> On 21/11/2025 03:10, Laurent Pinchart wrote:
> > On Thu, Nov 20, 2025 at 11:19:58PM +0000, Bryan O'Donoghue wrote:
> >> Moving the vertex and fragment shaders to src/libcamera/assets/shader to
> >> allow for reuse of these inside of the SoftISP.
> > 
> > The commit message doesn't match the patch.
> > 
> > Why did you pick include/ ? Shaders are not headers.
> > 
> For the record.
> 
> I moved these go src/libcamera/shaders and it appears to work.

Sounds good. It will be easy to change the location within
src/libcamera/ if needed.

Patch
diff mbox series

diff --git a/src/apps/qcam/assets/shader/RGB.frag b/include/libcamera/internal/shaders/RGB.frag
similarity index 100%
rename from src/apps/qcam/assets/shader/RGB.frag
rename to include/libcamera/internal/shaders/RGB.frag
diff --git a/src/apps/qcam/assets/shader/YUV_2_planes.frag b/include/libcamera/internal/shaders/YUV_2_planes.frag
similarity index 100%
rename from src/apps/qcam/assets/shader/YUV_2_planes.frag
rename to include/libcamera/internal/shaders/YUV_2_planes.frag
diff --git a/src/apps/qcam/assets/shader/YUV_3_planes.frag b/include/libcamera/internal/shaders/YUV_3_planes.frag
similarity index 100%
rename from src/apps/qcam/assets/shader/YUV_3_planes.frag
rename to include/libcamera/internal/shaders/YUV_3_planes.frag
diff --git a/src/apps/qcam/assets/shader/YUV_packed.frag b/include/libcamera/internal/shaders/YUV_packed.frag
similarity index 100%
rename from src/apps/qcam/assets/shader/YUV_packed.frag
rename to include/libcamera/internal/shaders/YUV_packed.frag
diff --git a/src/apps/qcam/assets/shader/bayer_1x_packed.frag b/include/libcamera/internal/shaders/bayer_1x_packed.frag
similarity index 100%
rename from src/apps/qcam/assets/shader/bayer_1x_packed.frag
rename to include/libcamera/internal/shaders/bayer_1x_packed.frag
diff --git a/src/apps/qcam/assets/shader/bayer_8.frag b/include/libcamera/internal/shaders/bayer_8.frag
similarity index 100%
rename from src/apps/qcam/assets/shader/bayer_8.frag
rename to include/libcamera/internal/shaders/bayer_8.frag
diff --git a/src/apps/qcam/assets/shader/bayer_8.vert b/include/libcamera/internal/shaders/bayer_8.vert
similarity index 100%
rename from src/apps/qcam/assets/shader/bayer_8.vert
rename to include/libcamera/internal/shaders/bayer_8.vert
diff --git a/src/apps/qcam/assets/shader/identity.vert b/include/libcamera/internal/shaders/identity.vert
similarity index 100%
rename from src/apps/qcam/assets/shader/identity.vert
rename to include/libcamera/internal/shaders/identity.vert
diff --git a/src/apps/qcam/assets/shader/shaders.qrc b/src/apps/qcam/assets/shader/shaders.qrc
index 96c709f92..04f9d7061 100644
--- a/src/apps/qcam/assets/shader/shaders.qrc
+++ b/src/apps/qcam/assets/shader/shaders.qrc
@@ -1,13 +1,13 @@ 
 <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
-	<file>RGB.frag</file>
-	<file>YUV_2_planes.frag</file>
-	<file>YUV_3_planes.frag</file>
-	<file>YUV_packed.frag</file>
-	<file>bayer_1x_packed.frag</file>
-	<file>bayer_8.frag</file>
-	<file>bayer_8.vert</file>
-	<file>identity.vert</file>
+	<file>../../../../../include/libcamera/internal/shaders/RGB.frag</file>
+	<file>../../../../../include/libcamera/internal/shaders/YUV_2_planes.frag</file>
+	<file>../../../../../include/libcamera/internal/shaders/YUV_3_planes.frag</file>
+	<file>../../../../../include/libcamera/internal/shaders/YUV_packed.frag</file>
+	<file>../../../../../include/libcamera/internal/shaders/bayer_1x_packed.frag</file>
+	<file>../../../../../include/libcamera/internal/shaders/bayer_8.frag</file>
+	<file>../../../../../include/libcamera/internal/shaders/bayer_8.vert</file>
+	<file>../../../../../include/libcamera/internal/shaders/identity.vert</file>
 </qresource>
 </RCC>
diff --git a/src/apps/qcam/meson.build b/src/apps/qcam/meson.build
index 9ca047b0f..33600095f 100644
--- a/src/apps/qcam/meson.build
+++ b/src/apps/qcam/meson.build
@@ -64,3 +64,6 @@  qcam  = executable('qcam', qcam_sources, resources,
                        qt6_dep,
                    ],
                    cpp_args : qt6_cpp_args)
+
+# Note: qt6.preprocess does not automatically rebuild when the
+# qcam_resources dependency chain is updated.
diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp
index f31956ff0..70f600650 100644
--- a/src/apps/qcam/viewfinder_gl.cpp
+++ b/src/apps/qcam/viewfinder_gl.cpp
@@ -141,7 +141,7 @@  bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
 	textureMinMagFilters_ = GL_LINEAR;
 
 	/* Use identity.vert as the default vertex shader. */
-	vertexShaderFile_ = ":identity.vert";
+	vertexShaderFile_ = ":include/libcamera/internal/shaders/identity.vert";
 
 	fragmentShaderDefines_.clear();
 
@@ -150,170 +150,170 @@  bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
 		horzSubSample_ = 2;
 		vertSubSample_ = 2;
 		fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
-		fragmentShaderFile_ = ":YUV_2_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
 		break;
 	case libcamera::formats::NV21:
 		horzSubSample_ = 2;
 		vertSubSample_ = 2;
 		fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
-		fragmentShaderFile_ = ":YUV_2_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
 		break;
 	case libcamera::formats::NV16:
 		horzSubSample_ = 2;
 		vertSubSample_ = 1;
 		fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
-		fragmentShaderFile_ = ":YUV_2_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
 		break;
 	case libcamera::formats::NV61:
 		horzSubSample_ = 2;
 		vertSubSample_ = 1;
 		fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
-		fragmentShaderFile_ = ":YUV_2_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
 		break;
 	case libcamera::formats::NV24:
 		horzSubSample_ = 1;
 		vertSubSample_ = 1;
 		fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
-		fragmentShaderFile_ = ":YUV_2_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
 		break;
 	case libcamera::formats::NV42:
 		horzSubSample_ = 1;
 		vertSubSample_ = 1;
 		fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
-		fragmentShaderFile_ = ":YUV_2_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_2_planes.frag";
 		break;
 	case libcamera::formats::YUV420:
 		horzSubSample_ = 2;
 		vertSubSample_ = 2;
-		fragmentShaderFile_ = ":YUV_3_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_3_planes.frag";
 		break;
 	case libcamera::formats::YVU420:
 		horzSubSample_ = 2;
 		vertSubSample_ = 2;
-		fragmentShaderFile_ = ":YUV_3_planes.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_3_planes.frag";
 		break;
 	case libcamera::formats::UYVY:
 		fragmentShaderDefines_.append("#define YUV_PATTERN_UYVY");
-		fragmentShaderFile_ = ":YUV_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
 		break;
 	case libcamera::formats::VYUY:
 		fragmentShaderDefines_.append("#define YUV_PATTERN_VYUY");
-		fragmentShaderFile_ = ":YUV_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
 		break;
 	case libcamera::formats::YUYV:
 		fragmentShaderDefines_.append("#define YUV_PATTERN_YUYV");
-		fragmentShaderFile_ = ":YUV_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
 		break;
 	case libcamera::formats::YVYU:
 		fragmentShaderDefines_.append("#define YUV_PATTERN_YVYU");
-		fragmentShaderFile_ = ":YUV_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/YUV_packed.frag";
 		break;
 	case libcamera::formats::ABGR8888:
 		fragmentShaderDefines_.append("#define RGB_PATTERN rgb");
-		fragmentShaderFile_ = ":RGB.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
 		break;
 	case libcamera::formats::ARGB8888:
 		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
-		fragmentShaderFile_ = ":RGB.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
 		break;
 	case libcamera::formats::BGRA8888:
 		fragmentShaderDefines_.append("#define RGB_PATTERN gba");
-		fragmentShaderFile_ = ":RGB.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
 		break;
 	case libcamera::formats::RGBA8888:
 		fragmentShaderDefines_.append("#define RGB_PATTERN abg");
-		fragmentShaderFile_ = ":RGB.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
 		break;
 	case libcamera::formats::BGR888:
 		fragmentShaderDefines_.append("#define RGB_PATTERN rgb");
-		fragmentShaderFile_ = ":RGB.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
 		break;
 	case libcamera::formats::RGB888:
 		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
-		fragmentShaderFile_ = ":RGB.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/RGB.frag";
 		break;
 	case libcamera::formats::SBGGR8:
 		firstRed_.setX(1.0);
 		firstRed_.setY(1.0);
-		vertexShaderFile_ = ":bayer_8.vert";
-		fragmentShaderFile_ = ":bayer_8.frag";
+		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SGBRG8:
 		firstRed_.setX(0.0);
 		firstRed_.setY(1.0);
-		vertexShaderFile_ = ":bayer_8.vert";
-		fragmentShaderFile_ = ":bayer_8.frag";
+		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SGRBG8:
 		firstRed_.setX(1.0);
 		firstRed_.setY(0.0);
-		vertexShaderFile_ = ":bayer_8.vert";
-		fragmentShaderFile_ = ":bayer_8.frag";
+		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SRGGB8:
 		firstRed_.setX(0.0);
 		firstRed_.setY(0.0);
-		vertexShaderFile_ = ":bayer_8.vert";
-		fragmentShaderFile_ = ":bayer_8.frag";
+		vertexShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.vert";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_8.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SBGGR10_CSI2P:
 		firstRed_.setX(1.0);
 		firstRed_.setY(1.0);
 		fragmentShaderDefines_.append("#define RAW10P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SGBRG10_CSI2P:
 		firstRed_.setX(0.0);
 		firstRed_.setY(1.0);
 		fragmentShaderDefines_.append("#define RAW10P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SGRBG10_CSI2P:
 		firstRed_.setX(1.0);
 		firstRed_.setY(0.0);
 		fragmentShaderDefines_.append("#define RAW10P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SRGGB10_CSI2P:
 		firstRed_.setX(0.0);
 		firstRed_.setY(0.0);
 		fragmentShaderDefines_.append("#define RAW10P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SBGGR12_CSI2P:
 		firstRed_.setX(1.0);
 		firstRed_.setY(1.0);
 		fragmentShaderDefines_.append("#define RAW12P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SGBRG12_CSI2P:
 		firstRed_.setX(0.0);
 		firstRed_.setY(1.0);
 		fragmentShaderDefines_.append("#define RAW12P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SGRBG12_CSI2P:
 		firstRed_.setX(1.0);
 		firstRed_.setY(0.0);
 		fragmentShaderDefines_.append("#define RAW12P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	case libcamera::formats::SRGGB12_CSI2P:
 		firstRed_.setX(0.0);
 		firstRed_.setY(0.0);
 		fragmentShaderDefines_.append("#define RAW12P");
-		fragmentShaderFile_ = ":bayer_1x_packed.frag";
+		fragmentShaderFile_ = ":include/libcamera/internal/shaders/bayer_1x_packed.frag";
 		textureMinMagFilters_ = GL_NEAREST;
 		break;
 	default: