[libcamera-devel,v5,8/9] qcam: viewfinder_gl: Add support for RAW8 Bayer formats
diff mbox series

Message ID 20210622134652.1279260-9-andrey.konovalov@linaro.org
State Accepted
Headers show
Series
  • qcam: viewfinder_gl: add RAW8, RAW10P and RAW12P formats
Related show

Commit Message

Andrey Konovalov June 22, 2021, 1:46 p.m. UTC
This integrates the vertex and the fragment shaders by Morgan McGuire
into qcam.

Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org>
---
 src/qcam/assets/shader/bayer_8.frag |  9 ++++---
 src/qcam/assets/shader/bayer_8.vert | 26 ++++++++++--------
 src/qcam/assets/shader/shaders.qrc  |  2 ++
 src/qcam/viewfinder_gl.cpp          | 41 +++++++++++++++++++++++++++--
 4 files changed, 62 insertions(+), 16 deletions(-)

Comments

Paul Elder June 28, 2021, 10:28 a.m. UTC | #1
Hi Andrey,

On Tue, Jun 22, 2021 at 04:46:51PM +0300, Andrey Konovalov wrote:
> This integrates the vertex and the fragment shaders by Morgan McGuire
> into qcam.
> 
> Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org>

Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

> ---
>  src/qcam/assets/shader/bayer_8.frag |  9 ++++---
>  src/qcam/assets/shader/bayer_8.vert | 26 ++++++++++--------
>  src/qcam/assets/shader/shaders.qrc  |  2 ++
>  src/qcam/viewfinder_gl.cpp          | 41 +++++++++++++++++++++++++++--
>  4 files changed, 62 insertions(+), 16 deletions(-)
> 
> diff --git a/src/qcam/assets/shader/bayer_8.frag b/src/qcam/assets/shader/bayer_8.frag
> index a7d65e1d..4ece44ab 100644
> --- a/src/qcam/assets/shader/bayer_8.frag
> +++ b/src/qcam/assets/shader/bayer_8.frag
> @@ -9,20 +9,23 @@ Morgan McGuire
>  This paper appears in issue Volume 13, Number 4.
>  ---------------------------------------------------------
>  Copyright (c) 2008, Morgan McGuire. All rights reserved.
> +
> +Modified by Linaro Ltd to integrate it into libcamera.
> +Copyright (C) 2021, Linaro
>  */
>  
>  //Pixel Shader
>  
>  /** Monochrome RGBA or GL_LUMINANCE Bayer encoded texture.*/
> -uniform sampler2D       source;
> +uniform sampler2D       tex_y;
>  varying vec4            center;
>  varying vec4            yCoord;
>  varying vec4            xCoord;
>  
>  void main(void) {
> -    #define fetch(x, y) texture2D(source, vec2(x, y)).r
> +    #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r
>  
> -    float C = texture2D(source, center.xy).r; // ( 0, 0)
> +    float C = texture2D(tex_y, center.xy).r; // ( 0, 0)
>      const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;
>  
>      // Determine which of four types of pixels we are on.
> diff --git a/src/qcam/assets/shader/bayer_8.vert b/src/qcam/assets/shader/bayer_8.vert
> index 347c15f7..3695a5e9 100644
> --- a/src/qcam/assets/shader/bayer_8.vert
> +++ b/src/qcam/assets/shader/bayer_8.vert
> @@ -9,17 +9,22 @@ Morgan McGuire
>  This paper appears in issue Volume 13, Number 4.
>  ---------------------------------------------------------
>  Copyright (c) 2008, Morgan McGuire. All rights reserved.
> +
> +Modified by Linaro Ltd to integrate it into libcamera.
> +Copyright (C) 2021, Linaro
>  */
>  
>  //Vertex Shader
>  
> +attribute vec4 vertexIn;
> +attribute vec2 textureIn;
>  
> -/** (w,h,1/w,1/h) */
> -uniform vec4            sourceSize;
> +uniform vec2 tex_size;	/* The texture size in pixels */
> +uniform vec2 tex_step;
>  
>  /** Pixel position of the first red pixel in the */
>  /**  Bayer pattern.  [{0,1}, {0, 1}]*/
> -uniform vec2            firstRed;
> +uniform vec2            tex_bayer_first_red;
>  
>  /** .xy = Pixel being sampled in the fragment shader on the range [0, 1]
>      .zw = ...on the range [0, sourceSize], offset by firstRed */
> @@ -34,14 +39,13 @@ varying vec4            xCoord;
>  varying vec4            yCoord;
>  
>  void main(void) {
> -    center.xy = gl_MultiTexCoord0.xy;
> -    center.zw = gl_MultiTexCoord0.xy * sourceSize.xy + firstRed;
> +    center.xy = textureIn;
> +    center.zw = textureIn * tex_size + tex_bayer_first_red;
>  
> -    vec2 invSize = sourceSize.zw;
> -    xCoord = center.x + vec4(-2.0 * invSize.x,
> -                             -invSize.x, invSize.x, 2.0 * invSize.x);
> -    yCoord = center.y + vec4(-2.0 * invSize.y,
> -                              -invSize.y, invSize.y, 2.0 * invSize.y);
> +    xCoord = center.x + vec4(-2.0 * tex_step.x,
> +                             -tex_step.x, tex_step.x, 2.0 * tex_step.x);
> +    yCoord = center.y + vec4(-2.0 * tex_step.y,
> +                              -tex_step.y, tex_step.y, 2.0 * tex_step.y);
>  
> -    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
> +    gl_Position = vertexIn;
>  }
> diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc
> index d76d65c5..96c709f9 100644
> --- a/src/qcam/assets/shader/shaders.qrc
> +++ b/src/qcam/assets/shader/shaders.qrc
> @@ -6,6 +6,8 @@
>  	<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>
>  </qresource>
>  </RCC>
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index 6d1d80bd..e7c8620c 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -36,6 +36,11 @@ static const QList<libcamera::PixelFormat> supportedFormats{
>  	libcamera::formats::RGBA8888,
>  	libcamera::formats::BGR888,
>  	libcamera::formats::RGB888,
> +	/* Raw Bayer 8-bit */
> +	libcamera::formats::SBGGR8,
> +	libcamera::formats::SGBRG8,
> +	libcamera::formats::SGRBG8,
> +	libcamera::formats::SRGGB8,
>  	/* Raw Bayer 10-bit packed */
>  	libcamera::formats::SBGGR10_CSI2P,
>  	libcamera::formats::SGBRG10_CSI2P,
> @@ -223,6 +228,34 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
>  		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
>  		fragmentShaderFile_ = ":RGB.frag";
>  		break;
> +	case libcamera::formats::SBGGR8:
> +		firstRed_.setX(1.0);
> +		firstRed_.setY(1.0);
> +		vertexShaderFile_ = ":bayer_8.vert";
> +		fragmentShaderFile_ = ":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";
> +		textureMinMagFilters_ = GL_NEAREST;
> +		break;
> +	case libcamera::formats::SGRBG8:
> +		firstRed_.setX(1.0);
> +		firstRed_.setY(0.0);
> +		vertexShaderFile_ = ":bayer_8.vert";
> +		fragmentShaderFile_ = ":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";
> +		textureMinMagFilters_ = GL_NEAREST;
> +		break;
>  	case libcamera::formats::SBGGR10_CSI2P:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(1.0);
> @@ -627,6 +660,10 @@ void ViewFinderGL::doRender()
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  		break;
>  
> +	case libcamera::formats::SBGGR8:
> +	case libcamera::formats::SGBRG8:
> +	case libcamera::formats::SGRBG8:
> +	case libcamera::formats::SRGGB8:
>  	case libcamera::formats::SBGGR10_CSI2P:
>  	case libcamera::formats::SGBRG10_CSI2P:
>  	case libcamera::formats::SGRBG10_CSI2P:
> @@ -636,8 +673,8 @@ void ViewFinderGL::doRender()
>  	case libcamera::formats::SGRBG12_CSI2P:
>  	case libcamera::formats::SRGGB12_CSI2P:
>  		/*
> -		 * Packed raw Bayer 10-bit and 12-bit formats are stored in
> -		 * GL_RED texture.
> +		 * Raw Bayer 8-bit, and packed raw Bayer 10-bit/12-bit formats
> +		 * are stored in GL_RED texture.
>  		 * The texture width is equal to the stride.
>  		 */
>  		glActiveTexture(GL_TEXTURE0);
> -- 
> 2.25.1
>
Laurent Pinchart June 30, 2021, 1:12 a.m. UTC | #2
Hi Andrey,

Thank you for the patch.

On Tue, Jun 22, 2021 at 04:46:51PM +0300, Andrey Konovalov wrote:
> This integrates the vertex and the fragment shaders by Morgan McGuire
> into qcam.
> 
> Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/qcam/assets/shader/bayer_8.frag |  9 ++++---
>  src/qcam/assets/shader/bayer_8.vert | 26 ++++++++++--------
>  src/qcam/assets/shader/shaders.qrc  |  2 ++
>  src/qcam/viewfinder_gl.cpp          | 41 +++++++++++++++++++++++++++--
>  4 files changed, 62 insertions(+), 16 deletions(-)
> 
> diff --git a/src/qcam/assets/shader/bayer_8.frag b/src/qcam/assets/shader/bayer_8.frag
> index a7d65e1d..4ece44ab 100644
> --- a/src/qcam/assets/shader/bayer_8.frag
> +++ b/src/qcam/assets/shader/bayer_8.frag
> @@ -9,20 +9,23 @@ Morgan McGuire
>  This paper appears in issue Volume 13, Number 4.
>  ---------------------------------------------------------
>  Copyright (c) 2008, Morgan McGuire. All rights reserved.
> +
> +Modified by Linaro Ltd to integrate it into libcamera.
> +Copyright (C) 2021, Linaro
>  */
>  
>  //Pixel Shader
>  
>  /** Monochrome RGBA or GL_LUMINANCE Bayer encoded texture.*/
> -uniform sampler2D       source;
> +uniform sampler2D       tex_y;
>  varying vec4            center;
>  varying vec4            yCoord;
>  varying vec4            xCoord;
>  
>  void main(void) {
> -    #define fetch(x, y) texture2D(source, vec2(x, y)).r
> +    #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r
>  
> -    float C = texture2D(source, center.xy).r; // ( 0, 0)
> +    float C = texture2D(tex_y, center.xy).r; // ( 0, 0)
>      const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;
>  
>      // Determine which of four types of pixels we are on.
> diff --git a/src/qcam/assets/shader/bayer_8.vert b/src/qcam/assets/shader/bayer_8.vert
> index 347c15f7..3695a5e9 100644
> --- a/src/qcam/assets/shader/bayer_8.vert
> +++ b/src/qcam/assets/shader/bayer_8.vert
> @@ -9,17 +9,22 @@ Morgan McGuire
>  This paper appears in issue Volume 13, Number 4.
>  ---------------------------------------------------------
>  Copyright (c) 2008, Morgan McGuire. All rights reserved.
> +
> +Modified by Linaro Ltd to integrate it into libcamera.
> +Copyright (C) 2021, Linaro
>  */
>  
>  //Vertex Shader
>  
> +attribute vec4 vertexIn;
> +attribute vec2 textureIn;
>  
> -/** (w,h,1/w,1/h) */
> -uniform vec4            sourceSize;
> +uniform vec2 tex_size;	/* The texture size in pixels */
> +uniform vec2 tex_step;
>  
>  /** Pixel position of the first red pixel in the */
>  /**  Bayer pattern.  [{0,1}, {0, 1}]*/
> -uniform vec2            firstRed;
> +uniform vec2            tex_bayer_first_red;
>  
>  /** .xy = Pixel being sampled in the fragment shader on the range [0, 1]
>      .zw = ...on the range [0, sourceSize], offset by firstRed */
> @@ -34,14 +39,13 @@ varying vec4            xCoord;
>  varying vec4            yCoord;
>  
>  void main(void) {
> -    center.xy = gl_MultiTexCoord0.xy;
> -    center.zw = gl_MultiTexCoord0.xy * sourceSize.xy + firstRed;
> +    center.xy = textureIn;
> +    center.zw = textureIn * tex_size + tex_bayer_first_red;
>  
> -    vec2 invSize = sourceSize.zw;
> -    xCoord = center.x + vec4(-2.0 * invSize.x,
> -                             -invSize.x, invSize.x, 2.0 * invSize.x);
> -    yCoord = center.y + vec4(-2.0 * invSize.y,
> -                              -invSize.y, invSize.y, 2.0 * invSize.y);
> +    xCoord = center.x + vec4(-2.0 * tex_step.x,
> +                             -tex_step.x, tex_step.x, 2.0 * tex_step.x);
> +    yCoord = center.y + vec4(-2.0 * tex_step.y,
> +                              -tex_step.y, tex_step.y, 2.0 * tex_step.y);
>  
> -    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
> +    gl_Position = vertexIn;
>  }
> diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc
> index d76d65c5..96c709f9 100644
> --- a/src/qcam/assets/shader/shaders.qrc
> +++ b/src/qcam/assets/shader/shaders.qrc
> @@ -6,6 +6,8 @@
>  	<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>
>  </qresource>
>  </RCC>
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index 6d1d80bd..e7c8620c 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -36,6 +36,11 @@ static const QList<libcamera::PixelFormat> supportedFormats{
>  	libcamera::formats::RGBA8888,
>  	libcamera::formats::BGR888,
>  	libcamera::formats::RGB888,
> +	/* Raw Bayer 8-bit */
> +	libcamera::formats::SBGGR8,
> +	libcamera::formats::SGBRG8,
> +	libcamera::formats::SGRBG8,
> +	libcamera::formats::SRGGB8,
>  	/* Raw Bayer 10-bit packed */
>  	libcamera::formats::SBGGR10_CSI2P,
>  	libcamera::formats::SGBRG10_CSI2P,
> @@ -223,6 +228,34 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
>  		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
>  		fragmentShaderFile_ = ":RGB.frag";
>  		break;
> +	case libcamera::formats::SBGGR8:
> +		firstRed_.setX(1.0);
> +		firstRed_.setY(1.0);
> +		vertexShaderFile_ = ":bayer_8.vert";
> +		fragmentShaderFile_ = ":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";
> +		textureMinMagFilters_ = GL_NEAREST;
> +		break;
> +	case libcamera::formats::SGRBG8:
> +		firstRed_.setX(1.0);
> +		firstRed_.setY(0.0);
> +		vertexShaderFile_ = ":bayer_8.vert";
> +		fragmentShaderFile_ = ":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";
> +		textureMinMagFilters_ = GL_NEAREST;
> +		break;
>  	case libcamera::formats::SBGGR10_CSI2P:
>  		firstRed_.setX(1.0);
>  		firstRed_.setY(1.0);
> @@ -627,6 +660,10 @@ void ViewFinderGL::doRender()
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
>  		break;
>  
> +	case libcamera::formats::SBGGR8:
> +	case libcamera::formats::SGBRG8:
> +	case libcamera::formats::SGRBG8:
> +	case libcamera::formats::SRGGB8:
>  	case libcamera::formats::SBGGR10_CSI2P:
>  	case libcamera::formats::SGBRG10_CSI2P:
>  	case libcamera::formats::SGRBG10_CSI2P:
> @@ -636,8 +673,8 @@ void ViewFinderGL::doRender()
>  	case libcamera::formats::SGRBG12_CSI2P:
>  	case libcamera::formats::SRGGB12_CSI2P:
>  		/*
> -		 * Packed raw Bayer 10-bit and 12-bit formats are stored in
> -		 * GL_RED texture.
> +		 * Raw Bayer 8-bit, and packed raw Bayer 10-bit/12-bit formats
> +		 * are stored in GL_RED texture.
>  		 * The texture width is equal to the stride.
>  		 */
>  		glActiveTexture(GL_TEXTURE0);

Patch
diff mbox series

diff --git a/src/qcam/assets/shader/bayer_8.frag b/src/qcam/assets/shader/bayer_8.frag
index a7d65e1d..4ece44ab 100644
--- a/src/qcam/assets/shader/bayer_8.frag
+++ b/src/qcam/assets/shader/bayer_8.frag
@@ -9,20 +9,23 @@  Morgan McGuire
 This paper appears in issue Volume 13, Number 4.
 ---------------------------------------------------------
 Copyright (c) 2008, Morgan McGuire. All rights reserved.
+
+Modified by Linaro Ltd to integrate it into libcamera.
+Copyright (C) 2021, Linaro
 */
 
 //Pixel Shader
 
 /** Monochrome RGBA or GL_LUMINANCE Bayer encoded texture.*/
-uniform sampler2D       source;
+uniform sampler2D       tex_y;
 varying vec4            center;
 varying vec4            yCoord;
 varying vec4            xCoord;
 
 void main(void) {
-    #define fetch(x, y) texture2D(source, vec2(x, y)).r
+    #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r
 
-    float C = texture2D(source, center.xy).r; // ( 0, 0)
+    float C = texture2D(tex_y, center.xy).r; // ( 0, 0)
     const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;
 
     // Determine which of four types of pixels we are on.
diff --git a/src/qcam/assets/shader/bayer_8.vert b/src/qcam/assets/shader/bayer_8.vert
index 347c15f7..3695a5e9 100644
--- a/src/qcam/assets/shader/bayer_8.vert
+++ b/src/qcam/assets/shader/bayer_8.vert
@@ -9,17 +9,22 @@  Morgan McGuire
 This paper appears in issue Volume 13, Number 4.
 ---------------------------------------------------------
 Copyright (c) 2008, Morgan McGuire. All rights reserved.
+
+Modified by Linaro Ltd to integrate it into libcamera.
+Copyright (C) 2021, Linaro
 */
 
 //Vertex Shader
 
+attribute vec4 vertexIn;
+attribute vec2 textureIn;
 
-/** (w,h,1/w,1/h) */
-uniform vec4            sourceSize;
+uniform vec2 tex_size;	/* The texture size in pixels */
+uniform vec2 tex_step;
 
 /** Pixel position of the first red pixel in the */
 /**  Bayer pattern.  [{0,1}, {0, 1}]*/
-uniform vec2            firstRed;
+uniform vec2            tex_bayer_first_red;
 
 /** .xy = Pixel being sampled in the fragment shader on the range [0, 1]
     .zw = ...on the range [0, sourceSize], offset by firstRed */
@@ -34,14 +39,13 @@  varying vec4            xCoord;
 varying vec4            yCoord;
 
 void main(void) {
-    center.xy = gl_MultiTexCoord0.xy;
-    center.zw = gl_MultiTexCoord0.xy * sourceSize.xy + firstRed;
+    center.xy = textureIn;
+    center.zw = textureIn * tex_size + tex_bayer_first_red;
 
-    vec2 invSize = sourceSize.zw;
-    xCoord = center.x + vec4(-2.0 * invSize.x,
-                             -invSize.x, invSize.x, 2.0 * invSize.x);
-    yCoord = center.y + vec4(-2.0 * invSize.y,
-                              -invSize.y, invSize.y, 2.0 * invSize.y);
+    xCoord = center.x + vec4(-2.0 * tex_step.x,
+                             -tex_step.x, tex_step.x, 2.0 * tex_step.x);
+    yCoord = center.y + vec4(-2.0 * tex_step.y,
+                              -tex_step.y, tex_step.y, 2.0 * tex_step.y);
 
-    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+    gl_Position = vertexIn;
 }
diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc
index d76d65c5..96c709f9 100644
--- a/src/qcam/assets/shader/shaders.qrc
+++ b/src/qcam/assets/shader/shaders.qrc
@@ -6,6 +6,8 @@ 
 	<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>
 </qresource>
 </RCC>
diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
index 6d1d80bd..e7c8620c 100644
--- a/src/qcam/viewfinder_gl.cpp
+++ b/src/qcam/viewfinder_gl.cpp
@@ -36,6 +36,11 @@  static const QList<libcamera::PixelFormat> supportedFormats{
 	libcamera::formats::RGBA8888,
 	libcamera::formats::BGR888,
 	libcamera::formats::RGB888,
+	/* Raw Bayer 8-bit */
+	libcamera::formats::SBGGR8,
+	libcamera::formats::SGBRG8,
+	libcamera::formats::SGRBG8,
+	libcamera::formats::SRGGB8,
 	/* Raw Bayer 10-bit packed */
 	libcamera::formats::SBGGR10_CSI2P,
 	libcamera::formats::SGBRG10_CSI2P,
@@ -223,6 +228,34 @@  bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
 		fragmentShaderDefines_.append("#define RGB_PATTERN bgr");
 		fragmentShaderFile_ = ":RGB.frag";
 		break;
+	case libcamera::formats::SBGGR8:
+		firstRed_.setX(1.0);
+		firstRed_.setY(1.0);
+		vertexShaderFile_ = ":bayer_8.vert";
+		fragmentShaderFile_ = ":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";
+		textureMinMagFilters_ = GL_NEAREST;
+		break;
+	case libcamera::formats::SGRBG8:
+		firstRed_.setX(1.0);
+		firstRed_.setY(0.0);
+		vertexShaderFile_ = ":bayer_8.vert";
+		fragmentShaderFile_ = ":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";
+		textureMinMagFilters_ = GL_NEAREST;
+		break;
 	case libcamera::formats::SBGGR10_CSI2P:
 		firstRed_.setX(1.0);
 		firstRed_.setY(1.0);
@@ -627,6 +660,10 @@  void ViewFinderGL::doRender()
 		shaderProgram_.setUniformValue(textureUniformY_, 0);
 		break;
 
+	case libcamera::formats::SBGGR8:
+	case libcamera::formats::SGBRG8:
+	case libcamera::formats::SGRBG8:
+	case libcamera::formats::SRGGB8:
 	case libcamera::formats::SBGGR10_CSI2P:
 	case libcamera::formats::SGBRG10_CSI2P:
 	case libcamera::formats::SGRBG10_CSI2P:
@@ -636,8 +673,8 @@  void ViewFinderGL::doRender()
 	case libcamera::formats::SGRBG12_CSI2P:
 	case libcamera::formats::SRGGB12_CSI2P:
 		/*
-		 * Packed raw Bayer 10-bit and 12-bit formats are stored in
-		 * GL_RED texture.
+		 * Raw Bayer 8-bit, and packed raw Bayer 10-bit/12-bit formats
+		 * are stored in GL_RED texture.
 		 * The texture width is equal to the stride.
 		 */
 		glActiveTexture(GL_TEXTURE0);