Show a patch.

GET /api/1.1/patches/10322/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 10322,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/10322/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/10322/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20201103155025.5948-2-laurent.pinchart@ideasonboard.com>",
    "date": "2020-11-03T15:50:19",
    "name": "[libcamera-devel,1/7] qcam: viewfinder_gl: Fix fragment shader rebuild when setting format",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "310aa218dd1517628c34c770686e6c39617ae865",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/1.1/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/10322/mbox/",
    "series": [
        {
            "id": 1441,
            "url": "https://patchwork.libcamera.org/api/1.1/series/1441/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1441",
            "date": "2020-11-03T15:50:18",
            "name": "qcam: Miscellaneous shaders cleanups and RGB support",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/1441/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/10322/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/10322/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5DB1ABDB89\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  3 Nov 2020 15:51:21 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 14B5E62C12;\n\tTue,  3 Nov 2020 16:51:20 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 26C3962B7E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  3 Nov 2020 16:51:19 +0100 (CET)",
            "from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 96C73B9C;\n\tTue,  3 Nov 2020 16:51:18 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"eBsH0Zkh\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1604418678;\n\tbh=JRi3g4hGvMrNnH4k6w8Xe2l65NNdtTWVbvkXxU9QMpE=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=eBsH0Zkhv6T8dRNaby8EjZsmE5MH0f2LiEU41MMTaQ42EjXBGXHP6MLeUVj23vq1p\n\trYFvlOiRtBnPRUlqGLE4oKfRxgna6LidCKskXt/lhCqC+h+y0UWxCEiJOrCN90PxP7\n\tWa0pxFlig5SBPaLEVGisjxa+tPk7tw9QjjUQIzPg=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "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\n\tshader rebuild when setting format",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "When setting a new format, the existing fragment shader is deleted and a\nnew shader should be created. However, the shader pointer isn't set to\nnullptr after deleting it, resulting in the deleter shader being reused.\nFix it by managing shader pointers with std::unique_ptr<> to prevent\nsimilar bugs from happening in the future.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/qcam/viewfinder_gl.cpp | 19 ++++++-------------\n src/qcam/viewfinder_gl.h   |  6 ++++--\n 2 files changed, 10 insertions(+), 15 deletions(-)",
    "diff": "diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp\nindex 0b5c942658cd..03a576ba89d2 100644\n--- a/src/qcam/viewfinder_gl.cpp\n+++ b/src/qcam/viewfinder_gl.cpp\n@@ -33,7 +33,6 @@ static const QList<libcamera::PixelFormat> supportedFormats{\n \n ViewFinderGL::ViewFinderGL(QWidget *parent)\n \t: QOpenGLWidget(parent), buffer_(nullptr), yuvData_(nullptr),\n-\t  vertexShader_(nullptr), fragmentShader_(nullptr),\n \t  vertexBuffer_(QOpenGLBuffer::VertexBuffer),\n \t  textureU_(QOpenGLTexture::Target2D),\n \t  textureV_(QOpenGLTexture::Target2D),\n@@ -58,8 +57,8 @@ int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,\n \tif (fragmentShader_) {\n \t\tif (shaderProgram_.isLinked()) {\n \t\t\tshaderProgram_.release();\n-\t\t\tshaderProgram_.removeShader(fragmentShader_);\n-\t\t\tdelete fragmentShader_;\n+\t\t\tshaderProgram_.removeShader(fragmentShader_.get());\n+\t\t\tfragmentShader_.reset();\n \t\t}\n \t}\n \n@@ -185,7 +184,7 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n bool ViewFinderGL::createVertexShader()\n {\n \t/* Create Vertex Shader */\n-\tvertexShader_ = new QOpenGLShader(QOpenGLShader::Vertex, this);\n+\tvertexShader_ = std::make_unique<QOpenGLShader>(QOpenGLShader::Vertex, this);\n \n \t/* Compile the vertex shader */\n \tif (!vertexShader_->compileSourceFile(\":YUV.vert\")) {\n@@ -193,7 +192,7 @@ bool ViewFinderGL::createVertexShader()\n \t\treturn false;\n \t}\n \n-\tshaderProgram_.addShader(vertexShader_);\n+\tshaderProgram_.addShader(vertexShader_.get());\n \treturn true;\n }\n \n@@ -207,7 +206,7 @@ bool ViewFinderGL::createFragmentShader()\n \t * program. The #define macros stored in fragmentShaderDefines_, if\n \t * any, are prepended to the source code.\n \t */\n-\tfragmentShader_ = new QOpenGLShader(QOpenGLShader::Fragment, this);\n+\tfragmentShader_ = std::make_unique<QOpenGLShader>(QOpenGLShader::Fragment, this);\n \n \tQFile file(fragmentShaderFile_);\n \tif (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {\n@@ -224,7 +223,7 @@ bool ViewFinderGL::createFragmentShader()\n \t\treturn false;\n \t}\n \n-\tshaderProgram_.addShader(fragmentShader_);\n+\tshaderProgram_.addShader(fragmentShader_.get());\n \n \t/* Link shader pipeline */\n \tif (!shaderProgram_.link()) {\n@@ -287,12 +286,6 @@ void ViewFinderGL::removeShader()\n \t\tshaderProgram_.release();\n \t\tshaderProgram_.removeAllShaders();\n \t}\n-\n-\tif (fragmentShader_)\n-\t\tdelete fragmentShader_;\n-\n-\tif (vertexShader_)\n-\t\tdelete vertexShader_;\n }\n \n void ViewFinderGL::initializeGL()\ndiff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h\nindex ad1e195e45c7..40c04dc5f877 100644\n--- a/src/qcam/viewfinder_gl.h\n+++ b/src/qcam/viewfinder_gl.h\n@@ -8,6 +8,8 @@\n #ifndef __VIEWFINDER_GL_H__\n #define __VIEWFINDER_GL_H__\n \n+#include <memory>\n+\n #include <QImage>\n #include <QMutex>\n #include <QOpenGLBuffer>\n@@ -67,8 +69,8 @@ private:\n \n \t/* Shaders */\n \tQOpenGLShaderProgram shaderProgram_;\n-\tQOpenGLShader *vertexShader_;\n-\tQOpenGLShader *fragmentShader_;\n+\tstd::unique_ptr<QOpenGLShader> vertexShader_;\n+\tstd::unique_ptr<QOpenGLShader> fragmentShader_;\n \tQString fragmentShaderFile_;\n \tQStringList fragmentShaderDefines_;\n \n",
    "prefixes": [
        "libcamera-devel",
        "1/7"
    ]
}