From patchwork Tue Nov 3 15:50:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10322 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 5DB1ABDB89 for ; Tue, 3 Nov 2020 15:51:21 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 14B5E62C12; Tue, 3 Nov 2020 16:51:20 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="eBsH0Zkh"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 26C3962B7E for ; Tue, 3 Nov 2020 16:51:19 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 96C73B9C; Tue, 3 Nov 2020 16:51:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418678; bh=JRi3g4hGvMrNnH4k6w8Xe2l65NNdtTWVbvkXxU9QMpE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eBsH0Zkhv6T8dRNaby8EjZsmE5MH0f2LiEU41MMTaQ42EjXBGXHP6MLeUVj23vq1p rYFvlOiRtBnPRUlqGLE4oKfRxgna6LidCKskXt/lhCqC+h+y0UWxCEiJOrCN90PxP7 Wa0pxFlig5SBPaLEVGisjxa+tPk7tw9QjjUQIzPg= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:19 +0200 Message-Id: <20201103155025.5948-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/7] qcam: viewfinder_gl: Fix fragment shader rebuild when setting format X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" When setting a new format, the existing fragment shader is deleted and a new shader should be created. However, the shader pointer isn't set to nullptr after deleting it, resulting in the deleter shader being reused. Fix it by managing shader pointers with std::unique_ptr<> to prevent similar bugs from happening in the future. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 19 ++++++------------- src/qcam/viewfinder_gl.h | 6 ++++-- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 0b5c942658cd..03a576ba89d2 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -33,7 +33,6 @@ static const QList supportedFormats{ ViewFinderGL::ViewFinderGL(QWidget *parent) : QOpenGLWidget(parent), buffer_(nullptr), yuvData_(nullptr), - vertexShader_(nullptr), fragmentShader_(nullptr), vertexBuffer_(QOpenGLBuffer::VertexBuffer), textureU_(QOpenGLTexture::Target2D), textureV_(QOpenGLTexture::Target2D), @@ -58,8 +57,8 @@ int ViewFinderGL::setFormat(const libcamera::PixelFormat &format, if (fragmentShader_) { if (shaderProgram_.isLinked()) { shaderProgram_.release(); - shaderProgram_.removeShader(fragmentShader_); - delete fragmentShader_; + shaderProgram_.removeShader(fragmentShader_.get()); + fragmentShader_.reset(); } } @@ -185,7 +184,7 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) bool ViewFinderGL::createVertexShader() { /* Create Vertex Shader */ - vertexShader_ = new QOpenGLShader(QOpenGLShader::Vertex, this); + vertexShader_ = std::make_unique(QOpenGLShader::Vertex, this); /* Compile the vertex shader */ if (!vertexShader_->compileSourceFile(":YUV.vert")) { @@ -193,7 +192,7 @@ bool ViewFinderGL::createVertexShader() return false; } - shaderProgram_.addShader(vertexShader_); + shaderProgram_.addShader(vertexShader_.get()); return true; } @@ -207,7 +206,7 @@ bool ViewFinderGL::createFragmentShader() * program. The #define macros stored in fragmentShaderDefines_, if * any, are prepended to the source code. */ - fragmentShader_ = new QOpenGLShader(QOpenGLShader::Fragment, this); + fragmentShader_ = std::make_unique(QOpenGLShader::Fragment, this); QFile file(fragmentShaderFile_); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -224,7 +223,7 @@ bool ViewFinderGL::createFragmentShader() return false; } - shaderProgram_.addShader(fragmentShader_); + shaderProgram_.addShader(fragmentShader_.get()); /* Link shader pipeline */ if (!shaderProgram_.link()) { @@ -287,12 +286,6 @@ void ViewFinderGL::removeShader() shaderProgram_.release(); shaderProgram_.removeAllShaders(); } - - if (fragmentShader_) - delete fragmentShader_; - - if (vertexShader_) - delete vertexShader_; } void ViewFinderGL::initializeGL() diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h index ad1e195e45c7..40c04dc5f877 100644 --- a/src/qcam/viewfinder_gl.h +++ b/src/qcam/viewfinder_gl.h @@ -8,6 +8,8 @@ #ifndef __VIEWFINDER_GL_H__ #define __VIEWFINDER_GL_H__ +#include + #include #include #include @@ -67,8 +69,8 @@ private: /* Shaders */ QOpenGLShaderProgram shaderProgram_; - QOpenGLShader *vertexShader_; - QOpenGLShader *fragmentShader_; + std::unique_ptr vertexShader_; + std::unique_ptr fragmentShader_; QString fragmentShaderFile_; QStringList fragmentShaderDefines_; From patchwork Tue Nov 3 15:50:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10323 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id E3020BDB89 for ; Tue, 3 Nov 2020 15:51:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B66EF62BC9; Tue, 3 Nov 2020 16:51:22 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Yc0xpJBk"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8D32C62B7E for ; Tue, 3 Nov 2020 16:51:19 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0E706FD7; Tue, 3 Nov 2020 16:51:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418679; bh=FardDCZkpEqMXQU1/dKBmNrNAzq9W338e50vTQ1iJRw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Yc0xpJBkQsjR1KpoaI7tqkCQOk86KAFZ95HggFksgc4lcp9YW4IBvdL2B52HJmLPc EuMLGbor5Gr0xBOILyn0ZqRnLAABHznGxEsj+AS3wi/VukNj7B0YbYMNYm35p9yh5X YBaHjGKBZZG7k5226fkA41o0GRBnTvjn/0FlW9hc= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:20 +0200 Message-Id: <20201103155025.5948-3-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/7] qcam: viewfinder_gl: Keep fragment shader when format doesn't change X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" When ViewFinderGL::setFormat() is called, the fragment shader is deleted and recreated for the new format. This results in unnecessary shader recompilation if only the size is changed and the pixel format remains the same. Keep the existing shader in that case. The null test for fragmentShader_ can be removed, as if the shader program is linked, the fragment shader is guaranteed to exist. Signed-off-by: Laurent Pinchart Reviewed-by: Andrey Konovalov Reviewed-by: Kieran Bingham Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 03a576ba89d2..c07292523504 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -53,19 +53,23 @@ const QList &ViewFinderGL::nativeFormats() const int ViewFinderGL::setFormat(const libcamera::PixelFormat &format, const QSize &size) { - /* If the fragment is created remove it and create a new one. */ - if (fragmentShader_) { + if (format != format_) { + /* + * If the fragment already exists, remove it and create a new + * one for the new format. + */ if (shaderProgram_.isLinked()) { shaderProgram_.release(); shaderProgram_.removeShader(fragmentShader_.get()); fragmentShader_.reset(); } + + if (!selectFormat(format)) + return -1; + + format_ = format; } - if (!selectFormat(format)) - return -1; - - format_ = format; size_ = size; updateGeometry(); From patchwork Tue Nov 3 15:50:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10324 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 59BB8BDB89 for ; Tue, 3 Nov 2020 15:51:23 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0D04862C74; Tue, 3 Nov 2020 16:51:23 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rUCLJFGZ"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 35FCB62BDA for ; Tue, 3 Nov 2020 16:51:20 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7B7D6563; Tue, 3 Nov 2020 16:51:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418679; bh=1yFu2Wy/3bm0tA+udZuRQXkFa4WmF/o1Sk99FGCTV8s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rUCLJFGZ/5U06ZsuZcDXt27iy2g3T4pDvV3AaDgzSUQ+FiJsR4rb14TNooD9J2ppz DUxb2ZURzmnoh+OoY7kyYvEPxybix5SrmuDTngJyqauRUr2NMdHpbGRdGeP98JAhup L80u4rudyXZ94x/cYE7A8MXx9ESDy8C5xeo45hlQ= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:21 +0200 Message-Id: <20201103155025.5948-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/7] qcam: viewfinder_gl: Remove unneeded casts X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" There's no need to cast the yuvData_ unsigned char pointer to a char pointer before performing pointer arithmetics. Drop the unneeded casts. Signed-off-by: Laurent Pinchart Reviewed-by: Andrey Konovalov Reviewed-by: Kieran Bingham Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index c07292523504..dc35d4fd8505 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -360,7 +360,7 @@ void ViewFinderGL::doRender() 0, GL_RG, GL_UNSIGNED_BYTE, - (char *)yuvData_ + size_.width() * size_.height()); + yuvData_ + size_.width() * size_.height()); shaderProgram_.setUniformValue(textureUniformU_, 1); break; @@ -390,7 +390,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - (char *)yuvData_ + size_.width() * size_.height()); + yuvData_ + size_.width() * size_.height()); shaderProgram_.setUniformValue(textureUniformU_, 1); /* Activate texture V */ @@ -404,7 +404,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - (char *)yuvData_ + size_.width() * size_.height() * 5 / 4); + yuvData_ + size_.width() * size_.height() * 5 / 4); shaderProgram_.setUniformValue(textureUniformV_, 2); break; @@ -434,7 +434,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - (char *)yuvData_ + size_.width() * size_.height()); + yuvData_ + size_.width() * size_.height()); shaderProgram_.setUniformValue(textureUniformV_, 2); /* Activate texture U */ @@ -448,7 +448,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - (char *)yuvData_ + size_.width() * size_.height() * 5 / 4); + yuvData_ + size_.width() * size_.height() * 5 / 4); shaderProgram_.setUniformValue(textureUniformU_, 1); break; From patchwork Tue Nov 3 15:50:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10325 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id C05B9BDB89 for ; Tue, 3 Nov 2020 15:51:23 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 55CB162C3D; Tue, 3 Nov 2020 16:51:23 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="KuZFXfJo"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 74F7362C42 for ; Tue, 3 Nov 2020 16:51:20 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EB60AB9C; Tue, 3 Nov 2020 16:51:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418680; bh=5Ykvp841gWtzzBknkCyMAXPW4JBMsUVhXuLOGpoSK6g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KuZFXfJobQyuQ2x1Fe8YcGG1c7IbafvzB/iyjgin6NXGSoaJ4ncqAazuKKPq0v60p ZZF72kFUKYG28Nb1nnIS553mjgk5zn/yDih93lg9fa2z9JK+IX+BEACC25Aa8zXeio +Rwd1XII4FMcNu9TXZuc+VgsnLCcbr5YElwIBUCM= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:22 +0200 Message-Id: <20201103155025.5948-5-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 4/7] qcam: viewfinder_gl: Rename YUV.vert to identity.vert X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" In preparation for RGB formats support, rename the identity vertex shader from YUV.vert to identify.vert. Signed-off-by: Laurent Pinchart Reviewed-by: Andrey Konovalov Reviewed-by: Kieran Bingham Reviewed-by: Niklas Söderlund --- src/qcam/assets/shader/{YUV.vert => identity.vert} | 2 +- src/qcam/assets/shader/shaders.qrc | 2 +- src/qcam/viewfinder_gl.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/qcam/assets/shader/{YUV.vert => identity.vert} (77%) diff --git a/src/qcam/assets/shader/YUV.vert b/src/qcam/assets/shader/identity.vert similarity index 77% rename from src/qcam/assets/shader/YUV.vert rename to src/qcam/assets/shader/identity.vert index f38e8045db89..6d6f7551017e 100644 --- a/src/qcam/assets/shader/YUV.vert +++ b/src/qcam/assets/shader/identity.vert @@ -2,7 +2,7 @@ /* * Copyright (C) 2020, Linaro * - * YUV.vert - Vertex shader for YUV to RGB conversion + * identity.vert - Identity vertex shader for pixel format conversion */ attribute vec4 vertexIn; diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc index 857ed9fd5cde..863109146281 100644 --- a/src/qcam/assets/shader/shaders.qrc +++ b/src/qcam/assets/shader/shaders.qrc @@ -1,9 +1,9 @@ - YUV.vert YUV_2_planes.frag YUV_3_planes.frag YUV_packed.frag + identity.vert diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index dc35d4fd8505..110f0fa673df 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -191,7 +191,7 @@ bool ViewFinderGL::createVertexShader() vertexShader_ = std::make_unique(QOpenGLShader::Vertex, this); /* Compile the vertex shader */ - if (!vertexShader_->compileSourceFile(":YUV.vert")) { + if (!vertexShader_->compileSourceFile(":identity.vert")) { qWarning() << "[ViewFinderGL]:" << vertexShader_->log(); return false; } From patchwork Tue Nov 3 15:50:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10326 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 38A61BDB89 for ; Tue, 3 Nov 2020 15:51:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 029CA62C21; Tue, 3 Nov 2020 16:51:24 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="p7pfWFsf"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DC9CF62B7E for ; Tue, 3 Nov 2020 16:51:20 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6387EFD7; Tue, 3 Nov 2020 16:51:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418680; bh=dtUczAT7F7o8yCx6EumqzN+fGsVqXYtRn+lW6caUHfE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=p7pfWFsfLsvQerZt6NtQHuXBZ8yMFBtCsrxXK6Ubd4zTaNYh/8fl2MH7Zfis4pG5e jcOGTvoQyKjoMC4Q8PzR72LjBouDrLLeTxGNSnqTEfpmB7ENM5pORVVRu5EuECPZhM 2Uzz3SMaUdQ+DsiSqe8oIK1l8UfialGdiSJKOQ/8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:23 +0200 Message-Id: <20201103155025.5948-6-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 5/7] qcam: viewfinder_gl: Rename yuvData_ to data_ X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" In preparation for RGB formats support, rename the pointer to image data from yuvData_ to data_. Signed-off-by: Laurent Pinchart Reviewed-by: Andrey Konovalov Reviewed-by: Kieran Bingham Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 24 ++++++++++++------------ src/qcam/viewfinder_gl.h | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 110f0fa673df..e6625cac9795 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -32,7 +32,7 @@ static const QList supportedFormats{ }; ViewFinderGL::ViewFinderGL(QWidget *parent) - : QOpenGLWidget(parent), buffer_(nullptr), yuvData_(nullptr), + : QOpenGLWidget(parent), buffer_(nullptr), data_(nullptr), vertexBuffer_(QOpenGLBuffer::VertexBuffer), textureU_(QOpenGLTexture::Target2D), textureV_(QOpenGLTexture::Target2D), @@ -101,7 +101,7 @@ void ViewFinderGL::render(libcamera::FrameBuffer *buffer, MappedBuffer *map) if (buffer_) renderComplete(buffer_); - yuvData_ = static_cast(map->memory); + data_ = static_cast(map->memory); update(); buffer_ = buffer; } @@ -346,7 +346,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_); + data_); shaderProgram_.setUniformValue(textureUniformY_, 0); /* Activate texture UV/VU */ @@ -360,7 +360,7 @@ void ViewFinderGL::doRender() 0, GL_RG, GL_UNSIGNED_BYTE, - yuvData_ + size_.width() * size_.height()); + data_ + size_.width() * size_.height()); shaderProgram_.setUniformValue(textureUniformU_, 1); break; @@ -376,7 +376,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_); + data_); shaderProgram_.setUniformValue(textureUniformY_, 0); /* Activate texture U */ @@ -390,7 +390,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_ + size_.width() * size_.height()); + data_ + size_.width() * size_.height()); shaderProgram_.setUniformValue(textureUniformU_, 1); /* Activate texture V */ @@ -404,7 +404,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_ + size_.width() * size_.height() * 5 / 4); + data_ + size_.width() * size_.height() * 5 / 4); shaderProgram_.setUniformValue(textureUniformV_, 2); break; @@ -420,7 +420,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_); + data_); shaderProgram_.setUniformValue(textureUniformY_, 0); /* Activate texture V */ @@ -434,7 +434,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_ + size_.width() * size_.height()); + data_ + size_.width() * size_.height()); shaderProgram_.setUniformValue(textureUniformV_, 2); /* Activate texture U */ @@ -448,7 +448,7 @@ void ViewFinderGL::doRender() 0, GL_RED, GL_UNSIGNED_BYTE, - yuvData_ + size_.width() * size_.height() * 5 / 4); + data_ + size_.width() * size_.height() * 5 / 4); shaderProgram_.setUniformValue(textureUniformU_, 1); break; @@ -471,7 +471,7 @@ void ViewFinderGL::doRender() 0, GL_RGBA, GL_UNSIGNED_BYTE, - yuvData_); + data_); shaderProgram_.setUniformValue(textureUniformY_, 0); /* @@ -497,7 +497,7 @@ void ViewFinderGL::paintGL() << "create fragment shader failed."; } - if (yuvData_) { + if (data_) { glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h index 40c04dc5f877..b3e36514d3d4 100644 --- a/src/qcam/viewfinder_gl.h +++ b/src/qcam/viewfinder_gl.h @@ -65,7 +65,7 @@ private: libcamera::FrameBuffer *buffer_; libcamera::PixelFormat format_; QSize size_; - unsigned char *yuvData_; + unsigned char *data_; /* Shaders */ QOpenGLShaderProgram shaderProgram_; From patchwork Tue Nov 3 15:50:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10327 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 88297BDB8B for ; Tue, 3 Nov 2020 15:51:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 52EB862C62; Tue, 3 Nov 2020 16:51:24 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="josRikuZ"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5F4CE62C09 for ; Tue, 3 Nov 2020 16:51:21 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D648315AB; Tue, 3 Nov 2020 16:51:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418681; bh=dVIkY52eAO9+0WrMD9ZsJ8F2GKLg/gM/lDb601VRJdQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=josRikuZ0Nd5ZGLHfUHX96bJ/ttHstq+wvdU6W4I8AU6horIDIBQLlV+AmhpJ81WH vhh6de/6kq01UvCxIu3iMErptzlg7UDdebciBuZymIuKJGoC49ux1PG3XeS6EZ4lfF grw013Y7hFCp891w2I4zu1kGH/PcbSpgEFXX3mYM= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:24 +0200 Message-Id: <20201103155025.5948-7-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 6/7] qcam: viewfinder_gl: Store textures in an array X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 Reviewed-by: Andrey Konovalov Reviewed-by: Kieran Bingham --- 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 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 &texture : textures_) { + if (texture) + continue; - if (!textureU_.isCreated()) - textureU_.create(); - - if (!textureV_.isCreated()) - textureV_.create(); + texture = std::make_unique(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 #include #include @@ -82,9 +83,7 @@ private: GLuint textureUniformV_; GLuint textureUniformY_; GLuint textureUniformStepX_; - QOpenGLTexture textureU_; - QOpenGLTexture textureV_; - QOpenGLTexture textureY_; + std::array, 3> textures_; unsigned int horzSubSample_; unsigned int vertSubSample_; From patchwork Tue Nov 3 15:50:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10328 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id DEAB7BDB89 for ; Tue, 3 Nov 2020 15:51:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A76C462C68; Tue, 3 Nov 2020 16:51:24 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="mPsU0xSr"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D343D62C58 for ; Tue, 3 Nov 2020 16:51:21 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4F1C2B9C; Tue, 3 Nov 2020 16:51:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604418681; bh=JbnoKqKyW6cNdAvP5q3oSVvE+Cx0gakltQfn0ca8qLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mPsU0xSrHHfOKUg2ZtbE9v72BHbN2Ku8P/4AW9Zu6HqMUAzDhCfnjkD+l3/qJrPNi fkFrIktxe3dAkN4qANEdCRoJecwtOA6cdDkfHQWb11YBPaQIahhMVa28qaGSWpjDiu MzmuAFqvB/OQiviW53wn5G5NaYl7iiBvFuEDbSuk= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 17:50:25 +0200 Message-Id: <20201103155025.5948-8-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> References: <20201103155025.5948-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 7/7] qcam: viewfinder_gl: Add support for RGB formats X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for 24-bit and 32-bit RGB formats. The fragment samples the texture and reorders the components, using a pattern set through the RGB_PATTERN macro. An alternative to manual reordering in the shader would be to set the texture swizzling mask. This is however not available in OpenGL ES before version 3.0, which we don't mandate at the moment. Only the BGR888 and RGB888 formats have been tested, with the vimc pipeline handler. Signed-off-by: Laurent Pinchart Reviewed-by: Andrey Konovalov Reviewed-by: Kieran Bingham Reviewed-by: Niklas Söderlund --- src/qcam/assets/shader/RGB.frag | 22 +++++++++ src/qcam/assets/shader/shaders.qrc | 1 + src/qcam/viewfinder_gl.cpp | 71 ++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/qcam/assets/shader/RGB.frag diff --git a/src/qcam/assets/shader/RGB.frag b/src/qcam/assets/shader/RGB.frag new file mode 100644 index 000000000000..4c374ac98095 --- /dev/null +++ b/src/qcam/assets/shader/RGB.frag @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2020, Laurent Pinchart + * + * RGB.frag - Fragment shader code for RGB formats + */ + +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 textureOut; +uniform sampler2D tex_y; + +void main(void) +{ + vec3 rgb; + + rgb = texture2D(tex_y, textureOut).RGB_PATTERN; + + gl_FragColor = vec4(rgb, 1.0); +} diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc index 863109146281..8a8f9de1a5fa 100644 --- a/src/qcam/assets/shader/shaders.qrc +++ b/src/qcam/assets/shader/shaders.qrc @@ -1,6 +1,7 @@ + RGB.frag YUV_2_planes.frag YUV_3_planes.frag YUV_packed.frag diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index cbc1365500f5..5d9b442e7985 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -14,21 +14,28 @@ #include static const QList supportedFormats{ - /* Packed (single plane) */ + /* YUV - packed (single plane) */ libcamera::formats::UYVY, libcamera::formats::VYUY, libcamera::formats::YUYV, libcamera::formats::YVYU, - /* Semi planar (two planes) */ + /* YUV - semi planar (two planes) */ libcamera::formats::NV12, libcamera::formats::NV21, libcamera::formats::NV16, libcamera::formats::NV61, libcamera::formats::NV24, libcamera::formats::NV42, - /* Fully planar (three planes) */ + /* YUV - fully planar (three planes) */ libcamera::formats::YUV420, libcamera::formats::YVU420, + /* RGB */ + libcamera::formats::ABGR8888, + libcamera::formats::ARGB8888, + libcamera::formats::BGRA8888, + libcamera::formats::RGBA8888, + libcamera::formats::BGR888, + libcamera::formats::RGB888, }; ViewFinderGL::ViewFinderGL(QWidget *parent) @@ -172,6 +179,30 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) fragmentShaderDefines_.append("#define YUV_PATTERN_YVYU"); fragmentShaderFile_ = ":YUV_packed.frag"; break; + case libcamera::formats::ABGR8888: + fragmentShaderDefines_.append("#define RGB_PATTERN rgb"); + fragmentShaderFile_ = ":RGB.frag"; + break; + case libcamera::formats::ARGB8888: + fragmentShaderDefines_.append("#define RGB_PATTERN bgr"); + fragmentShaderFile_ = ":RGB.frag"; + break; + case libcamera::formats::BGRA8888: + fragmentShaderDefines_.append("#define RGB_PATTERN gba"); + fragmentShaderFile_ = ":RGB.frag"; + break; + case libcamera::formats::RGBA8888: + fragmentShaderDefines_.append("#define RGB_PATTERN abg"); + fragmentShaderFile_ = ":RGB.frag"; + break; + case libcamera::formats::BGR888: + fragmentShaderDefines_.append("#define RGB_PATTERN rgb"); + fragmentShaderFile_ = ":RGB.frag"; + break; + case libcamera::formats::RGB888: + fragmentShaderDefines_.append("#define RGB_PATTERN bgr"); + fragmentShaderFile_ = ":RGB.frag"; + break; default: ret = false; qWarning() << "[ViewFinderGL]:" @@ -481,6 +512,40 @@ void ViewFinderGL::doRender() 1.0f / (size_.width() / 2 - 1)); break; + case libcamera::formats::ABGR8888: + case libcamera::formats::ARGB8888: + case libcamera::formats::BGRA8888: + case libcamera::formats::RGBA8888: + glActiveTexture(GL_TEXTURE0); + configureTexture(*textures_[0]); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + size_.width(), + size_.height(), + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + data_); + shaderProgram_.setUniformValue(textureUniformY_, 0); + break; + + case libcamera::formats::BGR888: + case libcamera::formats::RGB888: + glActiveTexture(GL_TEXTURE0); + configureTexture(*textures_[0]); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGB, + size_.width(), + size_.height(), + 0, + GL_RGB, + GL_UNSIGNED_BYTE, + data_); + shaderProgram_.setUniformValue(textureUniformY_, 0); + break; + default: break; };