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_;