Message ID | 20210622134652.1279260-9-andrey.konovalov@linaro.org |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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 >
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);
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);
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(-)