From patchwork Wed Sep 16 14:52:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9637 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 5B380C3B5B for ; Wed, 16 Sep 2020 14:53:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C00DC60533; Wed, 16 Sep 2020 16:53:44 +0200 (CEST) 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="J8fu8qeG"; 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 A710662E75 for ; Wed, 16 Sep 2020 16:53:42 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 483B3276; Wed, 16 Sep 2020 16:53:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268016; bh=IXqExMQEGxG5MIf//OKDkUGTToeSvatkD/4A4cxrB1s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J8fu8qeG+hVb26nj2MfwaJyrk3CXRkLow1XtbzNsTL70JiiAxUDfnyn8q8PZzaS9P C5/MHnbmO0I68YxSMwYIEkQVJU0Yac7Wvp/FOrPLK0pgkJMzRjL7pudAf382qYvlwP 6gTlUNJQgNdVsAcZTLy12PIuPpSm0ZDbUnpI8yks= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:48 +0300 Message-Id: <20200916145254.1644-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/7] qcam: Remove unneeded './' file prefix in *.qrc 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 prefix files in the local directory with './'. Drop it. While at it, add indentation to make the *.qrc files more readable. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/qcam/assets/feathericons/feathericons.qrc | 12 ++++++------ src/qcam/assets/shader/shaders.qrc | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qcam/assets/feathericons/feathericons.qrc b/src/qcam/assets/feathericons/feathericons.qrc index 656f2b463511..c5302040ea44 100644 --- a/src/qcam/assets/feathericons/feathericons.qrc +++ b/src/qcam/assets/feathericons/feathericons.qrc @@ -1,11 +1,11 @@ -./aperture.svg -./camera-off.svg -./play-circle.svg -./save.svg -./stop-circle.svg -./x-circle.svg + aperture.svg + camera-off.svg + play-circle.svg + save.svg + stop-circle.svg + x-circle.svg diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc index 33eab2780d5e..9ae35c9f70d6 100644 --- a/src/qcam/assets/shader/shaders.qrc +++ b/src/qcam/assets/shader/shaders.qrc @@ -1,9 +1,9 @@ -./NV_vertex_shader.glsl -./NV_2_planes_UV_f.glsl -./NV_2_planes_VU_f.glsl -./NV_3_planes_f.glsl + NV_vertex_shader.glsl + NV_2_planes_UV_f.glsl + NV_2_planes_VU_f.glsl + NV_3_planes_f.glsl From patchwork Wed Sep 16 14:52:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9638 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 52F58C3B5B for ; Wed, 16 Sep 2020 14:53:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2081262E75; Wed, 16 Sep 2020 16:53:57 +0200 (CEST) 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="SFhthe73"; 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 D63B760533 for ; Wed, 16 Sep 2020 16:53:55 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CE58F57F; Wed, 16 Sep 2020 16:53:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268023; bh=0AK0kfDsGCE8d8n04+QvYEIYL1/BcMeFDFNlR429Cu0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SFhthe73P25sAk7mFj5tVGBZCJLOduonzgH5AcAuX6plAd6kG4oxXIUbho+JBPqzn i9oGNz1f3KFNDMTQSA25lLLYqGaPuzMG9/Numb00WX+bfYID8GwDWiPocarCCgdMhL iRIVcmpW0qoodK3obz5jo9Vp0pfUE3KJVMp8fpA8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:49 +0300 Message-Id: <20200916145254.1644-3-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/7] qcam: viewfinder_gl: Don't store texture IDs in class members 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" The texture IDs can easily and cheaply be retrieved from the textures, there's no need to store them in class members. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 23 ++++++++++------------- src/qcam/viewfinder_gl.h | 5 +---- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index fbe21dcf1ad2..18ebe46fe2f9 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -229,15 +229,12 @@ bool ViewFinderGL::createFragmentShader() if (!textureV_.isCreated()) textureV_.create(); - id_y_ = textureY_.textureId(); - id_u_ = textureU_.textureId(); - id_v_ = textureV_.textureId(); return true; } -void ViewFinderGL::configureTexture(unsigned int id) +void ViewFinderGL::configureTexture(QOpenGLTexture &texture) { - glBindTexture(GL_TEXTURE_2D, id); + glBindTexture(GL_TEXTURE_2D, texture.textureId()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -303,7 +300,7 @@ void ViewFinderGL::doRender() case libcamera::formats::NV42: /* Activate texture Y */ glActiveTexture(GL_TEXTURE0); - configureTexture(id_y_); + configureTexture(textureY_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, @@ -317,7 +314,7 @@ void ViewFinderGL::doRender() /* Activate texture UV/VU */ glActiveTexture(GL_TEXTURE1); - configureTexture(id_u_); + configureTexture(textureU_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG, @@ -333,7 +330,7 @@ void ViewFinderGL::doRender() case libcamera::formats::YUV420: /* Activate texture Y */ glActiveTexture(GL_TEXTURE0); - configureTexture(id_y_); + configureTexture(textureY_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, @@ -347,7 +344,7 @@ void ViewFinderGL::doRender() /* Activate texture U */ glActiveTexture(GL_TEXTURE1); - configureTexture(id_u_); + configureTexture(textureU_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, @@ -361,7 +358,7 @@ void ViewFinderGL::doRender() /* Activate texture V */ glActiveTexture(GL_TEXTURE2); - configureTexture(id_v_); + configureTexture(textureV_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, @@ -377,7 +374,7 @@ void ViewFinderGL::doRender() case libcamera::formats::YVU420: /* Activate texture Y */ glActiveTexture(GL_TEXTURE0); - configureTexture(id_y_); + configureTexture(textureY_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, @@ -391,7 +388,7 @@ void ViewFinderGL::doRender() /* Activate texture V */ glActiveTexture(GL_TEXTURE2); - configureTexture(id_v_); + configureTexture(textureV_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, @@ -405,7 +402,7 @@ void ViewFinderGL::doRender() /* Activate texture U */ glActiveTexture(GL_TEXTURE1); - configureTexture(id_u_); + configureTexture(textureU_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h index 69502b7a543e..825af1c13cb7 100644 --- a/src/qcam/viewfinder_gl.h +++ b/src/qcam/viewfinder_gl.h @@ -53,7 +53,7 @@ protected: private: bool selectFormat(const libcamera::PixelFormat &format); - void configureTexture(unsigned int id); + void configureTexture(QOpenGLTexture &texture); bool createFragmentShader(); bool createVertexShader(); void removeShader(); @@ -78,9 +78,6 @@ private: QString vertexShaderSrc_; /* YUV texture planars and parameters */ - GLuint id_u_; - GLuint id_v_; - GLuint id_y_; GLuint textureUniformU_; GLuint textureUniformV_; GLuint textureUniformY_; From patchwork Wed Sep 16 14:52:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9639 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 AFFACC3B5B for ; Wed, 16 Sep 2020 14:54:26 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7CF5962F04; Wed, 16 Sep 2020 16:54:26 +0200 (CEST) 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="DGO/KWUC"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 772C760533 for ; Wed, 16 Sep 2020 16:54:25 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CABE7A62; Wed, 16 Sep 2020 16:53:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268058; bh=o8xR15gal8vxq7fjmWXi2TT2+G/hbSor7GlD8juUI88=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DGO/KWUCCKJUTrOuuKUJVCJpzaK063+79AAiywJsiVYRQSi6VD3oNbqbeNmlrUTqr rH9RhUfCdXLEphf0NeJqOy6q1z6btpJdDPR5QWNAqtiVrHDnu7MMFg4qfe1JOD0Cdr luNYkj56S7XKr8mqd96ZT5zRvB9eDFHI/OvsGUmE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:50 +0300 Message-Id: <20200916145254.1644-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/7] qcam: viewfinder_gl: Hardcode the vertex shader file name 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" The GL renderer uses the same vertex shader for all formats. Hardcode the file name instead of storing it in a member variable. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 10 +--------- src/qcam/viewfinder_gl.h | 3 +-- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 18ebe46fe2f9..76e4a900a25a 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -101,49 +101,41 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) case libcamera::formats::NV12: horzSubSample_ = 2; vertSubSample_ = 2; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_2_planes_UV_f.glsl"; break; case libcamera::formats::NV21: horzSubSample_ = 2; vertSubSample_ = 2; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_2_planes_VU_f.glsl"; break; case libcamera::formats::NV16: horzSubSample_ = 2; vertSubSample_ = 1; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_2_planes_UV_f.glsl"; break; case libcamera::formats::NV61: horzSubSample_ = 2; vertSubSample_ = 1; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_2_planes_VU_f.glsl"; break; case libcamera::formats::NV24: horzSubSample_ = 1; vertSubSample_ = 1; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_2_planes_UV_f.glsl"; break; case libcamera::formats::NV42: horzSubSample_ = 1; vertSubSample_ = 1; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_2_planes_VU_f.glsl"; break; case libcamera::formats::YUV420: horzSubSample_ = 2; vertSubSample_ = 2; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_3_planes_f.glsl"; break; case libcamera::formats::YVU420: horzSubSample_ = 2; vertSubSample_ = 2; - vertexShaderSrc_ = ":NV_vertex_shader.glsl"; fragmentShaderSrc_ = ":NV_3_planes_f.glsl"; break; default: @@ -162,7 +154,7 @@ bool ViewFinderGL::createVertexShader() vertexShader_ = new QOpenGLShader(QOpenGLShader::Vertex, this); /* Compile the vertex shader */ - if (!vertexShader_->compileSourceFile(vertexShaderSrc_)) { + if (!vertexShader_->compileSourceFile(":NV_vertex_shader.glsl")) { qWarning() << "[ViewFinderGL]:" << vertexShader_->log(); return false; } diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h index 825af1c13cb7..7675d0a06351 100644 --- a/src/qcam/viewfinder_gl.h +++ b/src/qcam/viewfinder_gl.h @@ -73,9 +73,8 @@ private: /* Vertex buffer */ QOpenGLBuffer vertexBuffer_; - /* Fragment and Vertex shader file name */ + /* Fragment shader file name */ QString fragmentShaderSrc_; - QString vertexShaderSrc_; /* YUV texture planars and parameters */ GLuint textureUniformU_; From patchwork Wed Sep 16 14:52:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9640 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 14D7BC3B5D for ; Wed, 16 Sep 2020 14:54:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D88E362F12; Wed, 16 Sep 2020 16:54:26 +0200 (CEST) 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="EibeGDeo"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AD91462E75 for ; Wed, 16 Sep 2020 16:54:25 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8624557F; Wed, 16 Sep 2020 16:54:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268058; bh=WNtQPblvS1DG6XawIadlAwEOk0KVrGsYstuQN6ZEQgo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EibeGDeoNl4N484nsLy3eTBuaDD1P2PcDuIe907inMaivQXCEHG0+3Mq3aU1DOFKU gYVxlun7bYB/1x+dy5vqEChsSD/i7fxPslDzNvDmZ0H8JJXYp4HIYg613M+3ELRQwy CSsTkIjOepPLMv8zHgOsEVGYQtm6J+GYtrL0gKwU= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:51 +0300 Message-Id: <20200916145254.1644-5-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 4/7] qcam: viewfinder_gl: Rename shader files 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" Rename shader files to prepare for packed YUYV support: - The NV prefix isn't a good match for packed (or for 3-planar) formats, replace it with a YUV prefix - Use .frag and .vert extensions to differentiate between fragment and vertex shaders While at it, remove the uneeded './' file name prefix in shaders.qrc. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- .../shader/{NV_vertex_shader.glsl => YUV.vert} | 2 +- ...2_planes_UV_f.glsl => YUV_2_planes_UV.frag} | 2 +- ...2_planes_VU_f.glsl => YUV_2_planes_VU.frag} | 2 +- .../{NV_3_planes_f.glsl => YUV_3_planes.frag} | 2 +- src/qcam/assets/shader/shaders.qrc | 8 ++++---- src/qcam/viewfinder_gl.cpp | 18 +++++++++--------- 6 files changed, 17 insertions(+), 17 deletions(-) rename src/qcam/assets/shader/{NV_vertex_shader.glsl => YUV.vert} (79%) rename src/qcam/assets/shader/{NV_2_planes_UV_f.glsl => YUV_2_planes_UV.frag} (88%) rename src/qcam/assets/shader/{NV_2_planes_VU_f.glsl => YUV_2_planes_VU.frag} (88%) rename src/qcam/assets/shader/{NV_3_planes_f.glsl => YUV_3_planes.frag} (90%) diff --git a/src/qcam/assets/shader/NV_vertex_shader.glsl b/src/qcam/assets/shader/YUV.vert similarity index 79% rename from src/qcam/assets/shader/NV_vertex_shader.glsl rename to src/qcam/assets/shader/YUV.vert index 12e791e31e32..f38e8045db89 100644 --- a/src/qcam/assets/shader/NV_vertex_shader.glsl +++ b/src/qcam/assets/shader/YUV.vert @@ -2,7 +2,7 @@ /* * Copyright (C) 2020, Linaro * - * NV_vertex_shader.glsl - Vertex shader code for NV family + * YUV.vert - Vertex shader for YUV to RGB conversion */ attribute vec4 vertexIn; diff --git a/src/qcam/assets/shader/NV_2_planes_UV_f.glsl b/src/qcam/assets/shader/YUV_2_planes_UV.frag similarity index 88% rename from src/qcam/assets/shader/NV_2_planes_UV_f.glsl rename to src/qcam/assets/shader/YUV_2_planes_UV.frag index 67633a11ee0f..081caea9214b 100644 --- a/src/qcam/assets/shader/NV_2_planes_UV_f.glsl +++ b/src/qcam/assets/shader/YUV_2_planes_UV.frag @@ -2,7 +2,7 @@ /* * Copyright (C) 2020, Linaro * - * NV_2_planes_UV_f.glsl - Fragment shader code for NV12, NV16 and NV24 formats + * YUV_2_planes_UV.frag - Fragment shader code for NV12, NV16 and NV24 formats */ #ifdef GL_ES diff --git a/src/qcam/assets/shader/NV_2_planes_VU_f.glsl b/src/qcam/assets/shader/YUV_2_planes_VU.frag similarity index 88% rename from src/qcam/assets/shader/NV_2_planes_VU_f.glsl rename to src/qcam/assets/shader/YUV_2_planes_VU.frag index 086c5b6d11bd..f4a5a5ac46c0 100644 --- a/src/qcam/assets/shader/NV_2_planes_VU_f.glsl +++ b/src/qcam/assets/shader/YUV_2_planes_VU.frag @@ -2,7 +2,7 @@ /* * Copyright (C) 2020, Linaro * - * NV_2_planes_VU_f.glsl - Fragment shader code for NV21, NV61 and NV42 formats + * YUV_2_planes_VU.frag - Fragment shader code for NV21, NV61 and NV42 formats */ #ifdef GL_ES diff --git a/src/qcam/assets/shader/NV_3_planes_f.glsl b/src/qcam/assets/shader/YUV_3_planes.frag similarity index 90% rename from src/qcam/assets/shader/NV_3_planes_f.glsl rename to src/qcam/assets/shader/YUV_3_planes.frag index 4bc941842710..2be74b5d2a9d 100644 --- a/src/qcam/assets/shader/NV_3_planes_f.glsl +++ b/src/qcam/assets/shader/YUV_3_planes.frag @@ -2,7 +2,7 @@ /* * Copyright (C) 2020, Linaro * - * NV_3_planes_UV_f.glsl - Fragment shader code for YUV420 format + * YUV_3_planes_UV.frag - Fragment shader code for YUV420 format */ #ifdef GL_ES diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc index 9ae35c9f70d6..533396d1fb28 100644 --- a/src/qcam/assets/shader/shaders.qrc +++ b/src/qcam/assets/shader/shaders.qrc @@ -1,9 +1,9 @@ - NV_vertex_shader.glsl - NV_2_planes_UV_f.glsl - NV_2_planes_VU_f.glsl - NV_3_planes_f.glsl + YUV.vert + YUV_2_planes_UV.frag + YUV_2_planes_VU.frag + YUV_3_planes.frag diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 76e4a900a25a..0fa06a290959 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -101,42 +101,42 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) case libcamera::formats::NV12: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":NV_2_planes_UV_f.glsl"; + fragmentShaderSrc_ = ":YUV_2_planes_UV.frag"; break; case libcamera::formats::NV21: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":NV_2_planes_VU_f.glsl"; + fragmentShaderSrc_ = ":YUV_2_planes_VU.frag"; break; case libcamera::formats::NV16: horzSubSample_ = 2; vertSubSample_ = 1; - fragmentShaderSrc_ = ":NV_2_planes_UV_f.glsl"; + fragmentShaderSrc_ = ":YUV_2_planes_UV.frag"; break; case libcamera::formats::NV61: horzSubSample_ = 2; vertSubSample_ = 1; - fragmentShaderSrc_ = ":NV_2_planes_VU_f.glsl"; + fragmentShaderSrc_ = ":YUV_2_planes_VU.frag"; break; case libcamera::formats::NV24: horzSubSample_ = 1; vertSubSample_ = 1; - fragmentShaderSrc_ = ":NV_2_planes_UV_f.glsl"; + fragmentShaderSrc_ = ":YUV_2_planes_UV.frag"; break; case libcamera::formats::NV42: horzSubSample_ = 1; vertSubSample_ = 1; - fragmentShaderSrc_ = ":NV_2_planes_VU_f.glsl"; + fragmentShaderSrc_ = ":YUV_2_planes_VU.frag"; break; case libcamera::formats::YUV420: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":NV_3_planes_f.glsl"; + fragmentShaderSrc_ = ":YUV_3_planes.frag"; break; case libcamera::formats::YVU420: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":NV_3_planes_f.glsl"; + fragmentShaderSrc_ = ":YUV_3_planes.frag"; break; default: ret = false; @@ -154,7 +154,7 @@ bool ViewFinderGL::createVertexShader() vertexShader_ = new QOpenGLShader(QOpenGLShader::Vertex, this); /* Compile the vertex shader */ - if (!vertexShader_->compileSourceFile(":NV_vertex_shader.glsl")) { + if (!vertexShader_->compileSourceFile(":YUV.vert")) { qWarning() << "[ViewFinderGL]:" << vertexShader_->log(); return false; } From patchwork Wed Sep 16 14:52:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9641 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 B0F26C3B5B for ; Wed, 16 Sep 2020 14:54:33 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7C8AB62EC5; Wed, 16 Sep 2020 16:54:33 +0200 (CEST) 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="D+relIbS"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9FCFE62E75 for ; Wed, 16 Sep 2020 16:54:32 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D04BC26B; Wed, 16 Sep 2020 16:54:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268066; bh=RTU1WqqU+emMau92i/LATnXRW7N34GngxDR71H03HxM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D+relIbSecZwguWB5k22NWAtK1ax+ACLQFhKMdPB3zpabD88kVdtFehvQF1XruDbi ky2oByudM1gY01mvGlgv5NFDLT5Okn7L+q4AQNWqAk3slYiqsPo4gQzi5PM+7+VqTS +W4iGbgYK/agcAjOeMwbRLOx2w+2kwvKAb4mTJLs= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:52 +0300 Message-Id: <20200916145254.1644-6-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 5/7] qcam: viewfinder_gl: Support #define in shaders 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" Prepare the infrastructure to support defining preprocessor macros in shaders: - Rename the fragmentShaderSrc_ member to fragmentShaderFile_ to reflect better that it contains a file name, not shader source code - Add a new fragmentShaderDefines_ member to store preprocessor macros - Prepend the macros to the shader source before compiling it Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- src/qcam/viewfinder_gl.cpp | 42 +++++++++++++++++++++++++++----------- src/qcam/viewfinder_gl.h | 11 +++++----- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 0fa06a290959..7cb5fb63656f 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -7,6 +7,8 @@ #include "viewfinder_gl.h" +#include +#include #include #include @@ -24,7 +26,7 @@ static const QList supportedFormats{ ViewFinderGL::ViewFinderGL(QWidget *parent) : QOpenGLWidget(parent), buffer_(nullptr), yuvData_(nullptr), - fragmentShader_(nullptr), vertexShader_(nullptr), + vertexShader_(nullptr), fragmentShader_(nullptr), vertexBuffer_(QOpenGLBuffer::VertexBuffer), textureU_(QOpenGLTexture::Target2D), textureV_(QOpenGLTexture::Target2D), @@ -97,46 +99,49 @@ void ViewFinderGL::render(libcamera::FrameBuffer *buffer, MappedBuffer *map) bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) { bool ret = true; + + fragmentShaderDefines_.clear(); + switch (format) { case libcamera::formats::NV12: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":YUV_2_planes_UV.frag"; + fragmentShaderFile_ = ":YUV_2_planes_UV.frag"; break; case libcamera::formats::NV21: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":YUV_2_planes_VU.frag"; + fragmentShaderFile_ = ":YUV_2_planes_VU.frag"; break; case libcamera::formats::NV16: horzSubSample_ = 2; vertSubSample_ = 1; - fragmentShaderSrc_ = ":YUV_2_planes_UV.frag"; + fragmentShaderFile_ = ":YUV_2_planes_UV.frag"; break; case libcamera::formats::NV61: horzSubSample_ = 2; vertSubSample_ = 1; - fragmentShaderSrc_ = ":YUV_2_planes_VU.frag"; + fragmentShaderFile_ = ":YUV_2_planes_VU.frag"; break; case libcamera::formats::NV24: horzSubSample_ = 1; vertSubSample_ = 1; - fragmentShaderSrc_ = ":YUV_2_planes_UV.frag"; + fragmentShaderFile_ = ":YUV_2_planes_UV.frag"; break; case libcamera::formats::NV42: horzSubSample_ = 1; vertSubSample_ = 1; - fragmentShaderSrc_ = ":YUV_2_planes_VU.frag"; + fragmentShaderFile_ = ":YUV_2_planes_VU.frag"; break; case libcamera::formats::YUV420: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":YUV_3_planes.frag"; + fragmentShaderFile_ = ":YUV_3_planes.frag"; break; case libcamera::formats::YVU420: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderSrc_ = ":YUV_3_planes.frag"; + fragmentShaderFile_ = ":YUV_3_planes.frag"; break; default: ret = false; @@ -168,11 +173,24 @@ bool ViewFinderGL::createFragmentShader() int attributeVertex; int attributeTexture; - /* Create Fragment Shader */ + /* + * Create the fragment shader, compile it, and add it to the shader + * program. The #define macros stored in fragmentShaderDefines_, if + * any, are prepended to the source code. + */ fragmentShader_ = new QOpenGLShader(QOpenGLShader::Fragment, this); - /* Compile the fragment shader */ - if (!fragmentShader_->compileSourceFile(fragmentShaderSrc_)) { + QFile file(fragmentShaderFile_); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "Shader" << fragmentShaderFile_ << "not found"; + return false; + } + + QString defines = fragmentShaderDefines_.join('\n') + "\n"; + QByteArray src = file.readAll(); + src.prepend(defines.toUtf8()); + + if (!fragmentShader_->compileSourceCode(src)) { qWarning() << "[ViewFinderGL]:" << fragmentShader_->log(); return false; } diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h index 7675d0a06351..53424dc10bc5 100644 --- a/src/qcam/viewfinder_gl.h +++ b/src/qcam/viewfinder_gl.h @@ -65,17 +65,16 @@ private: QSize size_; unsigned char *yuvData_; - /* OpenGL components for rendering */ - QOpenGLShader *fragmentShader_; - QOpenGLShader *vertexShader_; + /* Shaders */ QOpenGLShaderProgram shaderProgram_; + QOpenGLShader *vertexShader_; + QOpenGLShader *fragmentShader_; + QString fragmentShaderFile_; + QStringList fragmentShaderDefines_; /* Vertex buffer */ QOpenGLBuffer vertexBuffer_; - /* Fragment shader file name */ - QString fragmentShaderSrc_; - /* YUV texture planars and parameters */ GLuint textureUniformU_; GLuint textureUniformV_; From patchwork Wed Sep 16 14:52:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9642 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 2C0E5BF01C for ; Wed, 16 Sep 2020 14:54:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id EEA9D62EB1; Wed, 16 Sep 2020 16:54:54 +0200 (CEST) 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="Ge8m6cmq"; 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 B1ECF60533 for ; Wed, 16 Sep 2020 16:54:53 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C8E04A62; Wed, 16 Sep 2020 16:54:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268073; bh=485I6IT6smpMLwSR+mxTL2V9vLytl8jg4JbKkusw+Ak=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ge8m6cmqqoLDOtyZ28yzj9y/oLxnHe6BMiK/tZUBtg1J3tDbj6uFD+NDXLpvbAW1I CY5wXlcB9oZ8HzlNznKKvs5l112ZiaGcXMl9TdggIuzsJgrqJiBdAc9IagMoaQeNDC HUp5vHQ50/Lk1u6hdPtWJI+IX8cf0V+uVrYo2JE0= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:53 +0300 Message-Id: <20200916145254.1644-7-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 6/7] qcam: viewfinder_gl: Merge the semi-planar UV and VU shaders 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" Use macros to select the U and V pattern, to avoid code duplication between the two semi-planar shaders. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- ...YUV_2_planes_UV.frag => YUV_2_planes.frag} | 9 +++++- src/qcam/assets/shader/YUV_2_planes_VU.frag | 32 ------------------- src/qcam/assets/shader/shaders.qrc | 3 +- src/qcam/viewfinder_gl.cpp | 18 +++++++---- 4 files changed, 21 insertions(+), 41 deletions(-) rename src/qcam/assets/shader/{YUV_2_planes_UV.frag => YUV_2_planes.frag} (68%) delete mode 100644 src/qcam/assets/shader/YUV_2_planes_VU.frag diff --git a/src/qcam/assets/shader/YUV_2_planes_UV.frag b/src/qcam/assets/shader/YUV_2_planes.frag similarity index 68% rename from src/qcam/assets/shader/YUV_2_planes_UV.frag rename to src/qcam/assets/shader/YUV_2_planes.frag index 081caea9214b..125f1c850a33 100644 --- a/src/qcam/assets/shader/YUV_2_planes_UV.frag +++ b/src/qcam/assets/shader/YUV_2_planes.frag @@ -2,7 +2,7 @@ /* * Copyright (C) 2020, Linaro * - * YUV_2_planes_UV.frag - Fragment shader code for NV12, NV16 and NV24 formats + * YUV_2_planes.frag - Fragment shader code for NV12, NV16 and NV24 formats */ #ifdef GL_ES @@ -24,8 +24,15 @@ void main(void) ); yuv.x = texture2D(tex_y, textureOut).r - 0.063; +#if defined(YUV_PATTERN_UV) yuv.y = texture2D(tex_u, textureOut).r - 0.500; yuv.z = texture2D(tex_u, textureOut).g - 0.500; +#elif defined(YUV_PATTERN_VU) + yuv.y = texture2D(tex_u, textureOut).g - 0.500; + yuv.z = texture2D(tex_u, textureOut).r - 0.500; +#else +#error Invalid pattern +#endif rgb = yuv2rgb_bt601_mat * yuv; gl_FragColor = vec4(rgb, 1.0); diff --git a/src/qcam/assets/shader/YUV_2_planes_VU.frag b/src/qcam/assets/shader/YUV_2_planes_VU.frag deleted file mode 100644 index f4a5a5ac46c0..000000000000 --- a/src/qcam/assets/shader/YUV_2_planes_VU.frag +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -/* - * Copyright (C) 2020, Linaro - * - * YUV_2_planes_VU.frag - Fragment shader code for NV21, NV61 and NV42 formats - */ - -#ifdef GL_ES -precision mediump float; -#endif - -varying vec2 textureOut; -uniform sampler2D tex_y; -uniform sampler2D tex_u; - -void main(void) -{ - vec3 yuv; - vec3 rgb; - mat3 yuv2rgb_bt601_mat = mat3( - vec3(1.164, 1.164, 1.164), - vec3(0.000, -0.392, 2.017), - vec3(1.596, -0.813, 0.000) - ); - - yuv.x = texture2D(tex_y, textureOut).r - 0.063; - yuv.y = texture2D(tex_u, textureOut).g - 0.500; - yuv.z = texture2D(tex_u, textureOut).r - 0.500; - - rgb = yuv2rgb_bt601_mat * yuv; - gl_FragColor = vec4(rgb, 1.0); -} diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc index 533396d1fb28..7010d8433c9b 100644 --- a/src/qcam/assets/shader/shaders.qrc +++ b/src/qcam/assets/shader/shaders.qrc @@ -2,8 +2,7 @@ YUV.vert - YUV_2_planes_UV.frag - YUV_2_planes_VU.frag + YUV_2_planes.frag YUV_3_planes.frag diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp index 7cb5fb63656f..b8a4827267c3 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -106,32 +106,38 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) case libcamera::formats::NV12: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderFile_ = ":YUV_2_planes_UV.frag"; + fragmentShaderDefines_.append("#define YUV_PATTERN_UV"); + fragmentShaderFile_ = ":YUV_2_planes.frag"; break; case libcamera::formats::NV21: horzSubSample_ = 2; vertSubSample_ = 2; - fragmentShaderFile_ = ":YUV_2_planes_VU.frag"; + fragmentShaderDefines_.append("#define YUV_PATTERN_VU"); + fragmentShaderFile_ = ":YUV_2_planes.frag"; break; case libcamera::formats::NV16: horzSubSample_ = 2; vertSubSample_ = 1; - fragmentShaderFile_ = ":YUV_2_planes_UV.frag"; + fragmentShaderDefines_.append("#define YUV_PATTERN_UV"); + fragmentShaderFile_ = ":YUV_2_planes.frag"; break; case libcamera::formats::NV61: horzSubSample_ = 2; vertSubSample_ = 1; - fragmentShaderFile_ = ":YUV_2_planes_VU.frag"; + fragmentShaderDefines_.append("#define YUV_PATTERN_VU"); + fragmentShaderFile_ = ":YUV_2_planes.frag"; break; case libcamera::formats::NV24: horzSubSample_ = 1; vertSubSample_ = 1; - fragmentShaderFile_ = ":YUV_2_planes_UV.frag"; + fragmentShaderDefines_.append("#define YUV_PATTERN_UV"); + fragmentShaderFile_ = ":YUV_2_planes.frag"; break; case libcamera::formats::NV42: horzSubSample_ = 1; vertSubSample_ = 1; - fragmentShaderFile_ = ":YUV_2_planes_VU.frag"; + fragmentShaderDefines_.append("#define YUV_PATTERN_VU"); + fragmentShaderFile_ = ":YUV_2_planes.frag"; break; case libcamera::formats::YUV420: horzSubSample_ = 2; From patchwork Wed Sep 16 14:52:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9643 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 9B819BF01C for ; Wed, 16 Sep 2020 14:55:05 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 64ED262EDD; Wed, 16 Sep 2020 16:55:05 +0200 (CEST) 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="M/morLns"; 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 552FB60533 for ; Wed, 16 Sep 2020 16:55:03 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8AA7326B; Wed, 16 Sep 2020 16:54:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1600268094; bh=Swn/Ir4eReUebL8j0ylBOlhA+RLunAwFJu3LZ7HFe8M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M/morLnsgD30ia36aN12fX89YqwDZxZwP9/8QOhoQkjAKBx7LzsW6x+NXfo2UyGaD 8YzC4KoTXK2BtMN2GcJXNsadmJJ7g+2WChL+hvcjRYOde+nibuhnN4f2I6oRVY5ck7 sLQ1A/ATlkADdC0BI3zAKMHy2Ij+1L562co7g5CE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 16 Sep 2020 17:52:54 +0300 Message-Id: <20200916145254.1644-8-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> References: <20200916145254.1644-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 7/7] qcam: viewfinder_gl: Add shader to render packed YUV 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" The shader supports all 4 packed 8-bit YUV variants. Signed-off-by: Laurent Pinchart Acked-by: Niklas Söderlund --- src/qcam/assets/shader/YUV_packed.frag | 82 ++++++++++++++++++++++++++ src/qcam/assets/shader/shaders.qrc | 1 + src/qcam/viewfinder_gl.cpp | 56 ++++++++++++++++++ src/qcam/viewfinder_gl.h | 1 + 4 files changed, 140 insertions(+) create mode 100644 src/qcam/assets/shader/YUV_packed.frag diff --git a/src/qcam/assets/shader/YUV_packed.frag b/src/qcam/assets/shader/YUV_packed.frag new file mode 100644 index 000000000000..224dfafe383e --- /dev/null +++ b/src/qcam/assets/shader/YUV_packed.frag @@ -0,0 +1,82 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2020, Laurent Pinchart + * + * YUV_packed.frag - Fragment shader code for YUYV packed formats + */ + +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 textureOut; + +uniform sampler2D tex_y; +uniform float tex_stepx; + +void main(void) +{ + mat3 yuv2rgb_bt601_mat = mat3( + vec3(1.164, 1.164, 1.164), + vec3(0.000, -0.392, 2.017), + vec3(1.596, -0.813, 0.000) + ); + vec3 yuv2rgb_bt601_offset = vec3(0.063, 0.500, 0.500); + + /* + * The sampler won't interpolate the texture correctly along the X axis, + * as each RGBA pixel effectively stores two pixels. We thus need to + * interpolate manually. + * + * In integer texture coordinates, the Y values are layed out in the + * texture memory as follows: + * + * ...| Y U Y V | Y U Y V | Y U Y V |... + * ...| R G B A | R G B A | R G B A |... + * ^ ^ ^ ^ ^ ^ + * | | | | | | + * n-1 n-0.5 n n+0.5 n+1 n+1.5 + * + * For a texture location x in the interval [n, n+1[, sample the left + * and right pixels at n and n+1, and interpolate them with + * + * left.r * (1 - a) + left.b * a if fract(x) < 0.5 + * left.b * (1 - a) + right.r * a if fract(x) >= 0.5 + * + * with a = fract(x * 2) which can also be written + * + * a = fract(x) * 2 if fract(x) < 0.5 + * a = fract(x) * 2 - 1 if fract(x) >= 0.5 + */ + vec2 pos = textureOut; + float f_x = fract(pos.x / tex_stepx); + + vec4 left = texture2D(tex_y, vec2(pos.x - f_x * tex_stepx, pos.y)); + vec4 right = texture2D(tex_y, vec2(pos.x + (1.0 - f_x) * tex_stepx , pos.y)); + +#if defined(YUV_PATTERN_UYVY) + float y_left = mix(left.g, left.a, f_x * 2.0); + float y_right = mix(left.a, right.g, f_x * 2.0 - 1.0); + vec2 uv = mix(left.rb, right.rb, f_x); +#elif defined(YUV_PATTERN_VYUY) + float y_left = mix(left.g, left.a, f_x * 2.0); + float y_right = mix(left.a, right.g, f_x * 2.0 - 1.0); + vec2 uv = mix(left.br, right.br, f_x); +#elif defined(YUV_PATTERN_YUYV) + float y_left = mix(left.r, left.b, f_x * 2.0); + float y_right = mix(left.b, right.r, f_x * 2.0 - 1.0); + vec2 uv = mix(left.ga, right.ga, f_x); +#elif defined(YUV_PATTERN_YVYU) + float y_left = mix(left.r, left.b, f_x * 2.0); + float y_right = mix(left.b, right.r, f_x * 2.0 - 1.0); + vec2 uv = mix(left.ag, right.ag, f_x); +#else +#error Invalid pattern +#endif + + float y = mix(y_left, y_right, step(0.5, f_x)); + + vec3 rgb = yuv2rgb_bt601_mat * (vec3(y, uv) - yuv2rgb_bt601_offset); + + gl_FragColor = vec4(rgb, 1.0); +} diff --git a/src/qcam/assets/shader/shaders.qrc b/src/qcam/assets/shader/shaders.qrc index 7010d8433c9b..857ed9fd5cde 100644 --- a/src/qcam/assets/shader/shaders.qrc +++ b/src/qcam/assets/shader/shaders.qrc @@ -4,5 +4,6 @@ YUV.vert 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 b8a4827267c3..0b5c942658cd 100644 --- a/src/qcam/viewfinder_gl.cpp +++ b/src/qcam/viewfinder_gl.cpp @@ -14,12 +14,19 @@ #include static const QList supportedFormats{ + /* Packed (single plane) */ + libcamera::formats::UYVY, + libcamera::formats::VYUY, + libcamera::formats::YUYV, + libcamera::formats::YVYU, + /* 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) */ libcamera::formats::YUV420, libcamera::formats::YVU420, }; @@ -149,6 +156,22 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format) vertSubSample_ = 2; fragmentShaderFile_ = ":YUV_3_planes.frag"; break; + case libcamera::formats::UYVY: + fragmentShaderDefines_.append("#define YUV_PATTERN_UYVY"); + fragmentShaderFile_ = ":YUV_packed.frag"; + break; + case libcamera::formats::VYUY: + fragmentShaderDefines_.append("#define YUV_PATTERN_VYUY"); + fragmentShaderFile_ = ":YUV_packed.frag"; + break; + case libcamera::formats::YUYV: + fragmentShaderDefines_.append("#define YUV_PATTERN_YUYV"); + fragmentShaderFile_ = ":YUV_packed.frag"; + break; + case libcamera::formats::YVYU: + fragmentShaderDefines_.append("#define YUV_PATTERN_YVYU"); + fragmentShaderFile_ = ":YUV_packed.frag"; + break; default: ret = false; qWarning() << "[ViewFinderGL]:" @@ -235,6 +258,7 @@ bool ViewFinderGL::createFragmentShader() textureUniformY_ = shaderProgram_.uniformLocation("tex_y"); textureUniformU_ = shaderProgram_.uniformLocation("tex_u"); textureUniformV_ = shaderProgram_.uniformLocation("tex_v"); + textureUniformStepX_ = shaderProgram_.uniformLocation("tex_stepx"); if (!textureY_.isCreated()) textureY_.create(); @@ -431,6 +455,38 @@ void ViewFinderGL::doRender() shaderProgram_.setUniformValue(textureUniformU_, 1); break; + case libcamera::formats::UYVY: + case libcamera::formats::VYUY: + case libcamera::formats::YUYV: + case libcamera::formats::YVYU: + /* + * Packed YUV formats are stored in a RGBA texture to match the + * OpenGL texel size with the 4 bytes repeating pattern in YUV. + * The texture width is thus half of the image with. + */ + glActiveTexture(GL_TEXTURE0); + configureTexture(textureY_); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + size_.width() / 2, + size_.height(), + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + yuvData_); + shaderProgram_.setUniformValue(textureUniformY_, 0); + + /* + * The shader needs the step between two texture pixels in the + * horizontal direction, expressed in texture coordinate units + * ([0, 1]). There are exactly width - 1 steps between the + * leftmost and rightmost texels. + */ + shaderProgram_.setUniformValue(textureUniformStepX_, + 1.0f / (size_.width() / 2 - 1)); + break; + default: break; }; diff --git a/src/qcam/viewfinder_gl.h b/src/qcam/viewfinder_gl.h index 53424dc10bc5..ad1e195e45c7 100644 --- a/src/qcam/viewfinder_gl.h +++ b/src/qcam/viewfinder_gl.h @@ -79,6 +79,7 @@ private: GLuint textureUniformU_; GLuint textureUniformV_; GLuint textureUniformY_; + GLuint textureUniformStepX_; QOpenGLTexture textureU_; QOpenGLTexture textureV_; QOpenGLTexture textureY_;