[libcamera-devel] [PATCH v5 8/9] qcam: viewfinder_gl: Add support for RAW8 Bayer formats
paul.elder at ideasonboard.com
paul.elder at ideasonboard.com
Mon Jun 28 12:28:29 CEST 2021
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 at linaro.org>
Reviewed-by: Paul Elder <paul.elder at 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
>
More information about the libcamera-devel
mailing list