[libcamera-devel] [PATCH 6/7] qcam: viewfinder_gl: Store textures in an array
Kieran Bingham
kieran.bingham at ideasonboard.com
Wed Nov 4 11:39:11 CET 2020
Hi Laurent,
On 03/11/2020 19:23, Andrey Konovalov wrote:
> Hi Laurent,
>
> Thank you for the patch!
>
> On 03.11.2020 18:50, 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_.
Definitely helpful ;-)
>>
>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>> ---
>> src/qcam/viewfinder_gl.cpp | 37 +++++++++++++++++--------------------
>> src/qcam/viewfinder_gl.h | 5 ++---
>> 2 files changed, 19 insertions(+), 23 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..17c824a69e39 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>
>> @@ -82,9 +83,7 @@ private:
>
> These two lines are not visible in the diff:
>
> /* YUV texture planars and parameters */
> GLuint textureUniformU_;
>> GLuint textureUniformV_;
>> GLuint textureUniformY_;
>> GLuint textureUniformStepX_;
>> - QOpenGLTexture textureU_;
>> - QOpenGLTexture textureV_;
>> - QOpenGLTexture textureY_;
>> + std::array<std::unique_ptr<QOpenGLTexture>, 3> textures_;
>
> - now the textures_ should be better moved outside the /* YUV texture
> planars and parameters */ block
>
> Other than that
>
> Reviewed-by: Andrey Konovalov <andrey.konovalov at linaro.org>
Yup, organised however best fits - storing TEXTURE0 in textures_[0]
makes me quite happy ;-)
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> Thanks,
> Andrey
>
>> unsigned int horzSubSample_;
>> unsigned int vertSubSample_;
>>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list