[libcamera-devel] [PATCH v1.1 6/7] qcam: viewfinder_gl: Store textures in an array

Niklas Söderlund niklas.soderlund at ragnatech.se
Fri Nov 6 01:52:29 CET 2020


Hi Laurent,

Thanks for your work.

On 2020-11-04 04:17:25 +0200, Laurent Pinchart wrote:
> In preparation for RGB formats support, store the three Y, U and V
> textures in an array. This makes the code more generic, and will avoid
> referring to an RGB texture as textureY_.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Reviewed-by: Andrey Konovalov <andrey.konovalov at linaro.org>

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

> ---
> Changes since v1:
> 
> - Reorganize texture fields in the ViewFinderGL class
> ---
>  src/qcam/viewfinder_gl.cpp | 37 +++++++++++++++++--------------------
>  src/qcam/viewfinder_gl.h   |  9 +++++----
>  2 files changed, 22 insertions(+), 24 deletions(-)
> 
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index e6625cac9795..cbc1365500f5 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -33,10 +33,7 @@ static const QList<libcamera::PixelFormat> supportedFormats{
>  
>  ViewFinderGL::ViewFinderGL(QWidget *parent)
>  	: QOpenGLWidget(parent), buffer_(nullptr), data_(nullptr),
> -	  vertexBuffer_(QOpenGLBuffer::VertexBuffer),
> -	  textureU_(QOpenGLTexture::Target2D),
> -	  textureV_(QOpenGLTexture::Target2D),
> -	  textureY_(QOpenGLTexture::Target2D)
> +	  vertexBuffer_(QOpenGLBuffer::VertexBuffer)
>  {
>  }
>  
> @@ -263,14 +260,14 @@ bool ViewFinderGL::createFragmentShader()
>  	textureUniformV_ = shaderProgram_.uniformLocation("tex_v");
>  	textureUniformStepX_ = shaderProgram_.uniformLocation("tex_stepx");
>  
> -	if (!textureY_.isCreated())
> -		textureY_.create();
> +	/* Create the textures. */
> +	for (std::unique_ptr<QOpenGLTexture> &texture : textures_) {
> +		if (texture)
> +			continue;
>  
> -	if (!textureU_.isCreated())
> -		textureU_.create();
> -
> -	if (!textureV_.isCreated())
> -		textureV_.create();
> +		texture = std::make_unique<QOpenGLTexture>(QOpenGLTexture::Target2D);
> +		texture->create();
> +	}
>  
>  	return true;
>  }
> @@ -337,7 +334,7 @@ void ViewFinderGL::doRender()
>  	case libcamera::formats::NV42:
>  		/* Activate texture Y */
>  		glActiveTexture(GL_TEXTURE0);
> -		configureTexture(textureY_);
> +		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -351,7 +348,7 @@ void ViewFinderGL::doRender()
>  
>  		/* Activate texture UV/VU */
>  		glActiveTexture(GL_TEXTURE1);
> -		configureTexture(textureU_);
> +		configureTexture(*textures_[1]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RG,
> @@ -367,7 +364,7 @@ void ViewFinderGL::doRender()
>  	case libcamera::formats::YUV420:
>  		/* Activate texture Y */
>  		glActiveTexture(GL_TEXTURE0);
> -		configureTexture(textureY_);
> +		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -381,7 +378,7 @@ void ViewFinderGL::doRender()
>  
>  		/* Activate texture U */
>  		glActiveTexture(GL_TEXTURE1);
> -		configureTexture(textureU_);
> +		configureTexture(*textures_[1]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -395,7 +392,7 @@ void ViewFinderGL::doRender()
>  
>  		/* Activate texture V */
>  		glActiveTexture(GL_TEXTURE2);
> -		configureTexture(textureV_);
> +		configureTexture(*textures_[2]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -411,7 +408,7 @@ void ViewFinderGL::doRender()
>  	case libcamera::formats::YVU420:
>  		/* Activate texture Y */
>  		glActiveTexture(GL_TEXTURE0);
> -		configureTexture(textureY_);
> +		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -425,7 +422,7 @@ void ViewFinderGL::doRender()
>  
>  		/* Activate texture V */
>  		glActiveTexture(GL_TEXTURE2);
> -		configureTexture(textureV_);
> +		configureTexture(*textures_[2]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -439,7 +436,7 @@ void ViewFinderGL::doRender()
>  
>  		/* Activate texture U */
>  		glActiveTexture(GL_TEXTURE1);
> -		configureTexture(textureU_);
> +		configureTexture(*textures_[1]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RED,
> @@ -462,7 +459,7 @@ void ViewFinderGL::doRender()
>  		 * The texture width is thus half of the image with.
>  		 */
>  		glActiveTexture(GL_TEXTURE0);
> -		configureTexture(textureY_);
> +		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
>  			     GL_RGBA,
> diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h
> index b3e36514d3d4..150fa4ae94da 100644
> --- a/src/qcam/viewfinder_gl.h
> +++ b/src/qcam/viewfinder_gl.h
> @@ -8,6 +8,7 @@
>  #ifndef __VIEWFINDER_GL_H__
>  #define __VIEWFINDER_GL_H__
>  
> +#include <array>
>  #include <memory>
>  
>  #include <QImage>
> @@ -77,14 +78,14 @@ private:
>  	/* Vertex buffer */
>  	QOpenGLBuffer vertexBuffer_;
>  
> -	/* YUV texture planars and parameters */
> +	/* Textures */
> +	std::array<std::unique_ptr<QOpenGLTexture>, 3> textures_;
> +
> +	/* YUV texture parameters */
>  	GLuint textureUniformU_;
>  	GLuint textureUniformV_;
>  	GLuint textureUniformY_;
>  	GLuint textureUniformStepX_;
> -	QOpenGLTexture textureU_;
> -	QOpenGLTexture textureV_;
> -	QOpenGLTexture textureY_;
>  	unsigned int horzSubSample_;
>  	unsigned int vertSubSample_;
>  
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list