Show a patch.

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

{
    "id": 10328,
    "url": "https://patchwork.libcamera.org/api/patches/10328/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/10328/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/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-8-laurent.pinchart@ideasonboard.com>",
    "date": "2020-11-03T15:50:25",
    "name": "[libcamera-devel,7/7] qcam: viewfinder_gl: Add support for RGB formats",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "57ca957897ce1ca139a01ff2a1b3a7871e6e9952",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/10328/mbox/",
    "series": [
        {
            "id": 1441,
            "url": "https://patchwork.libcamera.org/api/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/10328/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/10328/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 DEAB7BDB89\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  3 Nov 2020 15:51:24 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A76C462C68;\n\tTue,  3 Nov 2020 16:51:24 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D343D62C58\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  3 Nov 2020 16:51:21 +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 4F1C2B9C;\n\tTue,  3 Nov 2020 16:51:21 +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=\"mPsU0xSr\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1604418681;\n\tbh=JbnoKqKyW6cNdAvP5q3oSVvE+Cx0gakltQfn0ca8qLo=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=mPsU0xSrHHfOKUg2ZtbE9v72BHbN2Ku8P/4AW9Zu6HqMUAzDhCfnjkD+l3/qJrPNi\n\tfkFrIktxe3dAkN4qANEdCRoJecwtOA6cdDkfHQWb11YBPaQIahhMVa28qaGSWpjDiu\n\tMzmuAFqvB/OQiviW53wn5G5NaYl7iiBvFuEDbSuk=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "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\n\tRGB formats",
        "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": "Add support for 24-bit and 32-bit RGB formats. The fragment samples the\ntexture and reorders the components, using a pattern set through the\nRGB_PATTERN macro.\n\nAn alternative to manual reordering in the shader would be to set the\ntexture swizzling mask. This is however not available in OpenGL ES\nbefore version 3.0, which we don't mandate at the moment.\n\nOnly the BGR888 and RGB888 formats have been tested, with the vimc\npipeline handler.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/qcam/assets/shader/RGB.frag    | 22 +++++++++\n src/qcam/assets/shader/shaders.qrc |  1 +\n src/qcam/viewfinder_gl.cpp         | 71 ++++++++++++++++++++++++++++--\n 3 files changed, 91 insertions(+), 3 deletions(-)\n create mode 100644 src/qcam/assets/shader/RGB.frag",
    "diff": "diff --git a/src/qcam/assets/shader/RGB.frag b/src/qcam/assets/shader/RGB.frag\nnew file mode 100644\nindex 000000000000..4c374ac98095\n--- /dev/null\n+++ b/src/qcam/assets/shader/RGB.frag\n@@ -0,0 +1,22 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2020, Laurent Pinchart\n+ *\n+ * RGB.frag - Fragment shader code for RGB formats\n+ */\n+\n+#ifdef GL_ES\n+precision mediump float;\n+#endif\n+\n+varying vec2 textureOut;\n+uniform sampler2D tex_y;\n+\n+void main(void)\n+{\n+\tvec3 rgb;\n+\n+\trgb = texture2D(tex_y, textureOut).RGB_PATTERN;\n+\n+\tgl_FragColor = vec4(rgb, 1.0);\n+}\ndiff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc\nindex 863109146281..8a8f9de1a5fa 100644\n--- a/src/qcam/assets/shader/shaders.qrc\n+++ b/src/qcam/assets/shader/shaders.qrc\n@@ -1,6 +1,7 @@\n <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->\n <!DOCTYPE RCC><RCC version=\"1.0\">\n <qresource>\n+\t<file>RGB.frag</file>\n \t<file>YUV_2_planes.frag</file>\n \t<file>YUV_3_planes.frag</file>\n \t<file>YUV_packed.frag</file>\ndiff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp\nindex cbc1365500f5..5d9b442e7985 100644\n--- a/src/qcam/viewfinder_gl.cpp\n+++ b/src/qcam/viewfinder_gl.cpp\n@@ -14,21 +14,28 @@\n #include <libcamera/formats.h>\n \n static const QList<libcamera::PixelFormat> supportedFormats{\n-\t/* Packed (single plane) */\n+\t/* YUV - packed (single plane) */\n \tlibcamera::formats::UYVY,\n \tlibcamera::formats::VYUY,\n \tlibcamera::formats::YUYV,\n \tlibcamera::formats::YVYU,\n-\t/* Semi planar (two planes) */\n+\t/* YUV - semi planar (two planes) */\n \tlibcamera::formats::NV12,\n \tlibcamera::formats::NV21,\n \tlibcamera::formats::NV16,\n \tlibcamera::formats::NV61,\n \tlibcamera::formats::NV24,\n \tlibcamera::formats::NV42,\n-\t/* Fully planar (three planes) */\n+\t/* YUV - fully planar (three planes) */\n \tlibcamera::formats::YUV420,\n \tlibcamera::formats::YVU420,\n+\t/* RGB */\n+\tlibcamera::formats::ABGR8888,\n+\tlibcamera::formats::ARGB8888,\n+\tlibcamera::formats::BGRA8888,\n+\tlibcamera::formats::RGBA8888,\n+\tlibcamera::formats::BGR888,\n+\tlibcamera::formats::RGB888,\n };\n \n ViewFinderGL::ViewFinderGL(QWidget *parent)\n@@ -172,6 +179,30 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n \t\tfragmentShaderDefines_.append(\"#define YUV_PATTERN_YVYU\");\n \t\tfragmentShaderFile_ = \":YUV_packed.frag\";\n \t\tbreak;\n+\tcase libcamera::formats::ABGR8888:\n+\t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN rgb\");\n+\t\tfragmentShaderFile_ = \":RGB.frag\";\n+\t\tbreak;\n+\tcase libcamera::formats::ARGB8888:\n+\t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN bgr\");\n+\t\tfragmentShaderFile_ = \":RGB.frag\";\n+\t\tbreak;\n+\tcase libcamera::formats::BGRA8888:\n+\t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN gba\");\n+\t\tfragmentShaderFile_ = \":RGB.frag\";\n+\t\tbreak;\n+\tcase libcamera::formats::RGBA8888:\n+\t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN abg\");\n+\t\tfragmentShaderFile_ = \":RGB.frag\";\n+\t\tbreak;\n+\tcase libcamera::formats::BGR888:\n+\t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN rgb\");\n+\t\tfragmentShaderFile_ = \":RGB.frag\";\n+\t\tbreak;\n+\tcase libcamera::formats::RGB888:\n+\t\tfragmentShaderDefines_.append(\"#define RGB_PATTERN bgr\");\n+\t\tfragmentShaderFile_ = \":RGB.frag\";\n+\t\tbreak;\n \tdefault:\n \t\tret = false;\n \t\tqWarning() << \"[ViewFinderGL]:\"\n@@ -481,6 +512,40 @@ void ViewFinderGL::doRender()\n \t\t\t\t\t       1.0f / (size_.width() / 2 - 1));\n \t\tbreak;\n \n+\tcase libcamera::formats::ABGR8888:\n+\tcase libcamera::formats::ARGB8888:\n+\tcase libcamera::formats::BGRA8888:\n+\tcase libcamera::formats::RGBA8888:\n+\t\tglActiveTexture(GL_TEXTURE0);\n+\t\tconfigureTexture(*textures_[0]);\n+\t\tglTexImage2D(GL_TEXTURE_2D,\n+\t\t\t     0,\n+\t\t\t     GL_RGBA,\n+\t\t\t     size_.width(),\n+\t\t\t     size_.height(),\n+\t\t\t     0,\n+\t\t\t     GL_RGBA,\n+\t\t\t     GL_UNSIGNED_BYTE,\n+\t\t\t     data_);\n+\t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n+\t\tbreak;\n+\n+\tcase libcamera::formats::BGR888:\n+\tcase libcamera::formats::RGB888:\n+\t\tglActiveTexture(GL_TEXTURE0);\n+\t\tconfigureTexture(*textures_[0]);\n+\t\tglTexImage2D(GL_TEXTURE_2D,\n+\t\t\t     0,\n+\t\t\t     GL_RGB,\n+\t\t\t     size_.width(),\n+\t\t\t     size_.height(),\n+\t\t\t     0,\n+\t\t\t     GL_RGB,\n+\t\t\t     GL_UNSIGNED_BYTE,\n+\t\t\t     data_);\n+\t\tshaderProgram_.setUniformValue(textureUniformY_, 0);\n+\t\tbreak;\n+\n \tdefault:\n \t\tbreak;\n \t};\n",
    "prefixes": [
        "libcamera-devel",
        "7/7"
    ]
}