[libcamera-devel] [PATCH v7 0/4] qcam: accelerate format conversion by OpenGL shader
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Sep 15 04:46:19 CEST 2020
Hello,
This patch series is an updated version of Show's v6. I've updated the
patches during review as I wanted to test my review comments, and it
would be pointless for Show to do the same independently to post a v7.
The series only incorporates review comments. Show, could you please let
me know if you're fine with the result ? To make the comparison easier,
here's the diff between v6 and v7.
diff --git a/src/qcam/assets/shader/NV_2_planes_UV_f.glsl b/src/qcam/assets/shader/NV_2_planes_UV_f.glsl
index 80478c5d0dd4..67633a11ee0f 100644
--- a/src/qcam/assets/shader/NV_2_planes_UV_f.glsl
+++ b/src/qcam/assets/shader/NV_2_planes_UV_f.glsl
@@ -18,10 +18,10 @@ 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)
- );
+ 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).r - 0.500;
diff --git a/src/qcam/assets/shader/NV_2_planes_VU_f.glsl b/src/qcam/assets/shader/NV_2_planes_VU_f.glsl
index 3794be843590..086c5b6d11bd 100644
--- a/src/qcam/assets/shader/NV_2_planes_VU_f.glsl
+++ b/src/qcam/assets/shader/NV_2_planes_VU_f.glsl
@@ -18,10 +18,10 @@ 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)
- );
+ 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;
diff --git a/src/qcam/assets/shader/NV_3_planes_f.glsl b/src/qcam/assets/shader/NV_3_planes_f.glsl
index fca9b659ca05..4bc941842710 100644
--- a/src/qcam/assets/shader/NV_3_planes_f.glsl
+++ b/src/qcam/assets/shader/NV_3_planes_f.glsl
@@ -19,10 +19,10 @@ 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)
- );
+ 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).r - 0.500;
diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
index 4b7d04100c08..f60d3cef0ecb 100644
--- a/src/qcam/main.cpp
+++ b/src/qcam/main.cpp
@@ -33,9 +33,9 @@ OptionsParser::Options parseOptions(int argc, char *argv[])
ArgumentRequired, "camera");
parser.addOption(OptHelp, OptionNone, "Display this help message",
"help");
- parser.addOption(OptRendered, OptionString,
- "Choose the renderer type {qt,gles} (default: qt)", "renderer",
- ArgumentRequired, "render");
+ parser.addOption(OptRenderer, OptionString,
+ "Choose the renderer type {qt,gles} (default: qt)",
+ "renderer", ArgumentRequired, "renderer");
parser.addOption(OptStream, &streamKeyValue,
"Set configuration of a camera stream", "stream", true);
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 315102c39526..e5233f4fb706 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -28,6 +28,8 @@
#include <libcamera/version.h>
#include "dng_writer.h"
+#include "viewfinder_gl.h"
+#include "viewfinder_qt.h"
using namespace libcamera;
@@ -95,9 +97,6 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
{
int ret;
- /* Render Type Qt or GLES, and set Qt by default */
- std::string renderType_ = "qt";
-
/*
* Initialize the UI: Create the toolbar, set the window title and
* create the viewfinder widget.
@@ -108,17 +107,19 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
setWindowTitle(title_);
connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
- if (options_.isSet(OptRendered))
- renderType_ = options_[OptRendered].toString();
+ /* Renderer type Qt or GLES, select Qt by default. */
+ std::string renderType = "qt";
+ if (options_.isSet(OptRenderer))
+ renderType = options_[OptRenderer].toString();
- if (renderType_ == "qt") {
+ if (renderType == "qt") {
ViewFinderQt *viewfinder = new ViewFinderQt(this);
connect(viewfinder, &ViewFinderQt::renderComplete,
this, &MainWindow::queueRequest);
viewfinder_ = viewfinder;
setCentralWidget(viewfinder);
#ifndef QT_NO_OPENGL
- } else if (renderType_ == "gles") {
+ } else if (renderType == "gles") {
ViewFinderGL *viewfinder = new ViewFinderGL(this);
connect(viewfinder, &ViewFinderGL::renderComplete,
this, &MainWindow::queueRequest);
@@ -127,7 +128,7 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
#endif
} else {
qWarning() << "Invalid render type"
- << QString::fromStdString(renderType_);
+ << QString::fromStdString(renderType);
quit();
return;
}
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 251f78bf6833..5c61a4dfce53 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -26,8 +26,6 @@
#include "../cam/stream_options.h"
#include "viewfinder.h"
-#include "viewfinder_gl.h"
-#include "viewfinder_qt.h"
using namespace libcamera;
@@ -39,7 +37,7 @@ class HotplugEvent;
enum {
OptCamera = 'c',
OptHelp = 'h',
- OptRendered = 'r',
+ OptRenderer = 'r',
OptStream = 's',
};
diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
index 84f48666af5b..fbe21dcf1ad2 100644
--- a/src/qcam/viewfinder_gl.cpp
+++ b/src/qcam/viewfinder_gl.cpp
@@ -19,7 +19,7 @@ static const QList<libcamera::PixelFormat> supportedFormats{
libcamera::formats::NV24,
libcamera::formats::NV42,
libcamera::formats::YUV420,
- libcamera::formats::YVU420
+ libcamera::formats::YVU420,
};
ViewFinderGL::ViewFinderGL(QWidget *parent)
@@ -35,9 +35,6 @@ ViewFinderGL::ViewFinderGL(QWidget *parent)
ViewFinderGL::~ViewFinderGL()
{
removeShader();
-
- if (vertexBuffer_.isCreated())
- vertexBuffer_.destroy();
}
const QList<libcamera::PixelFormat> &ViewFinderGL::nativeFormats() const
@@ -48,9 +45,7 @@ const QList<libcamera::PixelFormat> &ViewFinderGL::nativeFormats() const
int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
const QSize &size)
{
- int ret = 0;
-
- /* If the fragment is ceeated remove it and create a new one */
+ /* If the fragment is created remove it and create a new one. */
if (fragmentShader_) {
if (shaderProgram_.isLinked()) {
shaderProgram_.release();
@@ -59,14 +54,14 @@ int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
}
}
- if (selectFormat(format)) {
- format_ = format;
- size_ = size;
- } else {
- ret = -1;
- }
+ if (!selectFormat(format))
+ return -1;
+
+ format_ = format;
+ size_ = size;
+
updateGeometry();
- return ret;
+ return 0;
}
void ViewFinderGL::stop()
@@ -279,10 +274,10 @@ void ViewFinderGL::initializeGL()
},
{
/* Texture coordinates */
- { 1.0f, 0.0f },
- { 1.0f, 1.0f },
{ 0.0f, 1.0f },
{ 0.0f, 0.0f },
+ { 1.0f, 0.0f },
+ { 1.0f, 1.0f },
},
};
@@ -306,7 +301,7 @@ void ViewFinderGL::doRender()
case libcamera::formats::NV61:
case libcamera::formats::NV24:
case libcamera::formats::NV42:
- /* activate texture Y */
+ /* Activate texture Y */
glActiveTexture(GL_TEXTURE0);
configureTexture(id_y_);
glTexImage2D(GL_TEXTURE_2D,
@@ -320,7 +315,7 @@ void ViewFinderGL::doRender()
yuvData_);
shaderProgram_.setUniformValue(textureUniformY_, 0);
- /* activate texture UV/VU */
+ /* Activate texture UV/VU */
glActiveTexture(GL_TEXTURE1);
configureTexture(id_u_);
glTexImage2D(GL_TEXTURE_2D,
@@ -336,7 +331,7 @@ void ViewFinderGL::doRender()
break;
case libcamera::formats::YUV420:
- /* activate texture Y */
+ /* Activate texture Y */
glActiveTexture(GL_TEXTURE0);
configureTexture(id_y_);
glTexImage2D(GL_TEXTURE_2D,
@@ -350,7 +345,7 @@ void ViewFinderGL::doRender()
yuvData_);
shaderProgram_.setUniformValue(textureUniformY_, 0);
- /* activate texture U */
+ /* Activate texture U */
glActiveTexture(GL_TEXTURE1);
configureTexture(id_u_);
glTexImage2D(GL_TEXTURE_2D,
@@ -364,7 +359,7 @@ void ViewFinderGL::doRender()
(char *)yuvData_ + size_.width() * size_.height());
shaderProgram_.setUniformValue(textureUniformU_, 1);
- /* activate texture V */
+ /* Activate texture V */
glActiveTexture(GL_TEXTURE2);
configureTexture(id_v_);
glTexImage2D(GL_TEXTURE_2D,
@@ -380,7 +375,7 @@ void ViewFinderGL::doRender()
break;
case libcamera::formats::YVU420:
- /* activate texture Y */
+ /* Activate texture Y */
glActiveTexture(GL_TEXTURE0);
configureTexture(id_y_);
glTexImage2D(GL_TEXTURE_2D,
@@ -394,7 +389,7 @@ void ViewFinderGL::doRender()
yuvData_);
shaderProgram_.setUniformValue(textureUniformY_, 0);
- /* activate texture V */
+ /* Activate texture V */
glActiveTexture(GL_TEXTURE2);
configureTexture(id_v_);
glTexImage2D(GL_TEXTURE_2D,
@@ -406,9 +401,9 @@ void ViewFinderGL::doRender()
GL_RED,
GL_UNSIGNED_BYTE,
(char *)yuvData_ + size_.width() * size_.height());
- shaderProgram_.setUniformValue(textureUniformV_, 1);
+ shaderProgram_.setUniformValue(textureUniformV_, 2);
- /* activate texture U */
+ /* Activate texture U */
glActiveTexture(GL_TEXTURE1);
configureTexture(id_u_);
glTexImage2D(GL_TEXTURE_2D,
@@ -420,7 +415,7 @@ void ViewFinderGL::doRender()
GL_RED,
GL_UNSIGNED_BYTE,
(char *)yuvData_ + size_.width() * size_.height() * 5 / 4);
- shaderProgram_.setUniformValue(textureUniformU_, 2);
+ shaderProgram_.setUniformValue(textureUniformU_, 1);
break;
default:
Show Liu (4):
qcam: Add OpenGL shader code as Qt resource
qcam: New viewfinder hierarchy
qcam: Add ViewFinderGL class to accelerate the format conversion
qcam: Add additional command line option to select the renderer type
meson.build | 1 +
src/qcam/assets/shader/NV_2_planes_UV_f.glsl | 32 ++
src/qcam/assets/shader/NV_2_planes_VU_f.glsl | 32 ++
src/qcam/assets/shader/NV_3_planes_f.glsl | 33 ++
src/qcam/assets/shader/NV_vertex_shader.glsl | 16 +
src/qcam/assets/shader/shaders.qrc | 9 +
src/qcam/main.cpp | 3 +
src/qcam/main_window.cpp | 32 +-
src/qcam/main_window.h | 1 +
src/qcam/meson.build | 20 +-
src/qcam/viewfinder.h | 57 +--
src/qcam/viewfinder_gl.cpp | 451 ++++++++++++++++++
src/qcam/viewfinder_gl.h | 96 ++++
.../{viewfinder.cpp => viewfinder_qt.cpp} | 24 +-
src/qcam/viewfinder_qt.h | 64 +++
15 files changed, 806 insertions(+), 65 deletions(-)
create mode 100644 src/qcam/assets/shader/NV_2_planes_UV_f.glsl
create mode 100644 src/qcam/assets/shader/NV_2_planes_VU_f.glsl
create mode 100644 src/qcam/assets/shader/NV_3_planes_f.glsl
create mode 100644 src/qcam/assets/shader/NV_vertex_shader.glsl
create mode 100644 src/qcam/assets/shader/shaders.qrc
create mode 100644 src/qcam/viewfinder_gl.cpp
create mode 100644 src/qcam/viewfinder_gl.h
rename src/qcam/{viewfinder.cpp => viewfinder_qt.cpp} (86%)
create mode 100644 src/qcam/viewfinder_qt.h
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list