From: Peter Seiderer <ps.report@gmx.net>
To: linux-media@vger.kernel.org
Subject: [PATCH v4l-utils v1 2/4] qv4l2: enable Qt6 compile with Qt OpenGL support
Date: Thu, 16 Nov 2023 13:24:00 +0100 [thread overview]
Message-ID: <20231116122402.28730-2-ps.report@gmx.net> (raw)
In-Reply-To: <20231116122402.28730-1-ps.report@gmx.net>
Signed-off-by: Peter Seiderer <ps.report@gmx.net>
---
utils/qv4l2/capture-win-gl.cpp | 125 ++++++++++++++++++++++++++++++---
utils/qv4l2/capture-win-gl.h | 17 +++++
utils/qv4l2/qv4l2.cpp | 4 ++
utils/qv4l2/qv4l2.pro | 3 +
4 files changed, 138 insertions(+), 11 deletions(-)
diff --git a/utils/qv4l2/capture-win-gl.cpp b/utils/qv4l2/capture-win-gl.cpp
index 6cbeb426..7e993e3b 100644
--- a/utils/qv4l2/capture-win-gl.cpp
+++ b/utils/qv4l2/capture-win-gl.cpp
@@ -151,7 +151,9 @@ CaptureWinGLEngine::CaptureWinGLEngine() :
m_min_filter(GL_NEAREST)
{
makeCurrent();
+#if QT_VERSION < 0x060000
m_glfunction.initializeGLFunctions(context());
+#endif
}
CaptureWinGLEngine::~CaptureWinGLEngine()
@@ -285,6 +287,9 @@ void CaptureWinGLEngine::stop()
void CaptureWinGLEngine::initializeGL()
{
+#if QT_VERSION >= 0x060000
+ initializeOpenGLFunctions();
+#endif
glShadeModel(GL_FLAT);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
@@ -337,7 +342,11 @@ void CaptureWinGLEngine::setFrame(int width, int height, int WCrop, int HCrop,
m_frameData = data;
m_frameData2 = data2 ? data2 : data;
m_frameData3 = data3 ? data3 : data;
+#if QT_VERSION < 0x060000
updateGL();
+#else
+ update();
+#endif
}
void CaptureWinGLEngine::checkError(const char *msg)
@@ -431,8 +440,13 @@ bool CaptureWinGLEngine::hasNativeFormat(__u32 format)
0
};
+#if QT_VERSION < 0x060000
if (!m_glfunction.hasOpenGLFeature(QGLFunctions::Shaders))
return false;
+#else
+ if (!hasOpenGLFeature(QOpenGLFunctions::Shaders))
+ return false;
+#endif
for (int i = 0; supported_fmts[i]; i++)
if (supported_fmts[i] == format)
@@ -449,7 +463,11 @@ void CaptureWinGLEngine::changeShader()
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, m_frameWidth, m_frameHeight, 0, 0, 1);
+#if QT_VERSION < 0x060000
resizeGL(QGLWidget::width(), QGLWidget::height());
+#else
+ resizeGL(QOpenGLWidget::width(), QOpenGLWidget::height());
+#endif
checkError("Render settings.\n");
switch (m_frameFormat) {
@@ -1010,7 +1028,12 @@ void CaptureWinGLEngine::shader_YUV(__u32 format)
codeSuffix;
bool src_c = m_shaderProgram.addShaderFromSourceCode(
- QGLShader::Fragment, codeHead + codeTail);
+#if QT_VERSION < 0x060000
+ QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
+ codeHead + codeTail);
if (!src_c)
fprintf(stderr, "OpenGL Error: YUV shader compilation failed.\n");
@@ -1053,7 +1076,11 @@ void CaptureWinGLEngine::render_YUV(__u32 format)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#endif
glUniform1i(Y, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_frameWidth, m_frameHeight,
m_glRed, GL_UNSIGNED_BYTE, m_frameData);
@@ -1061,7 +1088,11 @@ void CaptureWinGLEngine::render_YUV(__u32 format)
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[1]);
+#if QT_VERSION < 0x060000
GLint U = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "utex");
+#else
+ GLint U = glGetUniformLocation(m_shaderProgram.programId(), "utex");
+#endif
glUniform1i(U, 1);
switch (format) {
case V4L2_PIX_FMT_YUV422P:
@@ -1087,7 +1118,11 @@ void CaptureWinGLEngine::render_YUV(__u32 format)
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[2]);
+#if QT_VERSION < 0x060000
GLint V = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "vtex");
+#else
+ GLint V = glGetUniformLocation(m_shaderProgram.programId(), "vtex");
+#endif
glUniform1i(V, 2);
switch (format) {
case V4L2_PIX_FMT_YUV422P:
@@ -1189,7 +1224,11 @@ void CaptureWinGLEngine::shader_NV12(__u32 format)
codeSuffix;
bool src_c = m_shaderProgram.addShaderFromSourceCode(
+#if QT_VERSION < 0x060000
QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
QString("%1%2%3").arg(codeHead, codeBody, codeTail));
if (!src_c)
@@ -1211,7 +1250,11 @@ void CaptureWinGLEngine::render_NV12(__u32 format)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#endif
glUniform1i(Y, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_frameWidth, m_frameHeight,
m_glRed, GL_UNSIGNED_BYTE, m_frameData);
@@ -1219,7 +1262,11 @@ void CaptureWinGLEngine::render_NV12(__u32 format)
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[1]);
+#if QT_VERSION < 0x060000
GLint U = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "uvtex");
+#else
+ GLint U = glGetUniformLocation(m_shaderProgram.programId(), "uvtex");
+#endif
glUniform1i(U, 1);
switch (format) {
case V4L2_PIX_FMT_NV12:
@@ -1307,7 +1354,11 @@ void CaptureWinGLEngine::shader_NV24(__u32 format)
codeSuffix;
bool src_c = m_shaderProgram.addShaderFromSourceCode(
+#if QT_VERSION < 0x060000
QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
QString("%1%2%3").arg(codeHead, codeBody, codeTail));
if (!src_c)
@@ -1327,7 +1378,11 @@ void CaptureWinGLEngine::render_NV24(__u32 format)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#endif
glUniform1i(Y, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_frameWidth, m_frameHeight,
m_glRed, GL_UNSIGNED_BYTE, m_frameData);
@@ -1335,7 +1390,11 @@ void CaptureWinGLEngine::render_NV24(__u32 format)
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[1]);
+#if QT_VERSION < 0x060000
GLint U = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "uvtex");
+#else
+ GLint U = glGetUniformLocation(m_shaderProgram.programId(), "uvtex");
+#endif
glUniform1i(U, 1);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_frameWidth, m_frameHeight,
m_glRedGreen, GL_UNSIGNED_BYTE,
@@ -1419,8 +1478,12 @@ void CaptureWinGLEngine::shader_NV16(__u32 format)
codeSuffix;
bool src_ok = m_shaderProgram.addShaderFromSourceCode(
- QGLShader::Fragment, QString("%1%2%3").arg(codeHead, codeBody, codeTail)
- );
+#if QT_VERSION < 0x060000
+ QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
+ QString("%1%2%3").arg(codeHead, codeBody, codeTail));
if (!src_ok)
fprintf(stderr, "OpenGL Error: NV16 shader compilation failed.\n");
@@ -1440,7 +1503,11 @@ void CaptureWinGLEngine::render_NV16(__u32 format)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "ytex");
+#endif
glUniform1i(Y, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_frameWidth, m_frameHeight,
m_glRed, GL_UNSIGNED_BYTE, m_frameData);
@@ -1448,7 +1515,11 @@ void CaptureWinGLEngine::render_NV16(__u32 format)
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[1]);
+#if QT_VERSION < 0x060000
GLint UV = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "uvtex");
+#else
+ GLint UV = glGetUniformLocation(m_shaderProgram.programId(), "uvtex");
+#endif
glUniform1i(UV, 1);
switch (format) {
case V4L2_PIX_FMT_NV16:
@@ -1559,8 +1630,12 @@ void CaptureWinGLEngine::shader_YUY2(__u32 format)
codeSuffix;
bool src_ok = m_shaderProgram.addShaderFromSourceCode(
- QGLShader::Fragment, QString("%1%2%3").arg(codeHead, codeBody, codeTail)
- );
+#if QT_VERSION < 0x060000
+ QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
+ QString("%1%2%3").arg(codeHead, codeBody, codeTail));
if (!src_ok)
fprintf(stderr, "OpenGL Error: YUY2 shader compilation failed.\n");
@@ -1580,7 +1655,11 @@ void CaptureWinGLEngine::render_YUY2(__u32 format)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#endif
glUniform1i(Y, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_frameWidth / 2, m_frameHeight,
GL_RGBA, GL_UNSIGNED_BYTE, m_frameData);
@@ -1785,8 +1864,12 @@ void CaptureWinGLEngine::shader_RGB(__u32 format)
(hasAlpha ? codeSuffixWithAlpha : codeSuffix);
bool src_ok = m_shaderProgram.addShaderFromSourceCode(
- QGLShader::Fragment, QString("%1%2").arg(codeHead, codeTail)
- );
+#if QT_VERSION < 0x060000
+ QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
+ QString("%1%2").arg(codeHead, codeTail));
if (!src_ok)
fprintf(stderr, "OpenGL Error: RGB shader compilation failed.\n");
@@ -1798,7 +1881,11 @@ void CaptureWinGLEngine::render_RGB(__u32 format)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#endif
glUniform1i(Y, 0);
int idx = glGetUniformLocation(m_shaderProgram.programId(), "tex_h"); // Texture height
glUniform1f(idx, m_frameHeight);
@@ -2016,8 +2103,12 @@ void CaptureWinGLEngine::shader_Bayer(__u32 format)
codeSuffix;
bool src_ok = m_shaderProgram.addShaderFromSourceCode(
- QGLShader::Fragment, QString("%1%2").arg(codeHead, codeTail)
- );
+#if QT_VERSION < 0x060000
+ QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
+ QString("%1%2").arg(codeHead, codeTail));
if (!src_ok)
fprintf(stderr, "OpenGL Error: Bayer shader compilation failed.\n");
@@ -2029,7 +2120,11 @@ void CaptureWinGLEngine::render_Bayer(__u32 format)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#endif
glUniform1i(Y, 0);
int idx = glGetUniformLocation(m_shaderProgram.programId(), "tex_h"); // Texture height
glUniform1f(idx, m_frameHeight);
@@ -2146,8 +2241,12 @@ void CaptureWinGLEngine::shader_YUV_packed(__u32 format)
(hasAlpha ? codeSuffixWithAlpha : codeSuffix);
bool src_ok = m_shaderProgram.addShaderFromSourceCode(
- QGLShader::Fragment, QString("%1%2").arg(codeHead, codeTail)
- );
+#if QT_VERSION < 0x060000
+ QGLShader::Fragment,
+#else
+ QOpenGLShader::Fragment,
+#endif
+ QString("%1%2").arg(codeHead, codeTail));
if (!src_ok)
fprintf(stderr, "OpenGL Error: Packed YUV shader compilation failed.\n");
@@ -2159,7 +2258,11 @@ void CaptureWinGLEngine::render_YUV_packed(__u32 format)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_screenTexture[0]);
+#if QT_VERSION < 0x060000
GLint Y = m_glfunction.glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#else
+ GLint Y = glGetUniformLocation(m_shaderProgram.programId(), "tex");
+#endif
glUniform1i(Y, 0);
int idx = glGetUniformLocation(m_shaderProgram.programId(), "tex_h"); // Texture height
glUniform1f(idx, m_frameHeight);
diff --git a/utils/qv4l2/capture-win-gl.h b/utils/qv4l2/capture-win-gl.h
index e27b2b3f..96376934 100644
--- a/utils/qv4l2/capture-win-gl.h
+++ b/utils/qv4l2/capture-win-gl.h
@@ -10,10 +10,17 @@
#define GL_GLEXT_PROTOTYPES
#define QT_NO_OPENGL_ES_2
+#include <QtCore>
+#if QT_VERSION < 0x060000
#include <QGLWidget>
#include <QGLShader>
#include <QGLShaderProgram>
#include <QGLFunctions>
+#else
+#include <QOpenGLWidget>
+#include <QOpenGLFunctions>
+#include <QOpenGLShaderProgram>
+#endif
#endif
#include "qv4l2.h"
@@ -26,7 +33,11 @@
// This must be equal to the max number of textures that any shader uses
#define MAX_TEXTURES_NEEDED 3
+#if QT_VERSION < 0x060000
class CaptureWinGLEngine : public QGLWidget
+#else
+class CaptureWinGLEngine : public QOpenGLWidget, protected QOpenGLFunctions
+#endif
{
public:
CaptureWinGLEngine();
@@ -102,11 +113,17 @@ private:
bool m_formatChange;
__u32 m_frameFormat;
GLuint m_screenTexture[MAX_TEXTURES_NEEDED];
+#if QT_VERSION < 0x060000
QGLFunctions m_glfunction;
+#endif
unsigned char *m_frameData;
unsigned char *m_frameData2;
unsigned char *m_frameData3;
+#if QT_VERSION < 0x060000
QGLShaderProgram m_shaderProgram;
+#else
+ QOpenGLShaderProgram m_shaderProgram;
+#endif
bool m_haveFramebufferSRGB;
bool m_hasGLRed;
unsigned m_glRed;
diff --git a/utils/qv4l2/qv4l2.cpp b/utils/qv4l2/qv4l2.cpp
index e37ee87f..534bedb2 100644
--- a/utils/qv4l2/qv4l2.cpp
+++ b/utils/qv4l2/qv4l2.cpp
@@ -401,7 +401,11 @@ void ApplicationWindow::setDevice(const QString &device, bool rawOpen)
{
closeDevice();
m_sigMapper = new QSignalMapper(this);
+#if QT_VERSION < 0x060000
connect(m_sigMapper, SIGNAL(mapped(int)), this, SLOT(ctrlAction(int)));
+#else
+ connect(m_sigMapper, &QSignalMapper::mappedInt, this, &ApplicationWindow::ctrlAction);
+#endif
s_direct(rawOpen);
diff --git a/utils/qv4l2/qv4l2.pro b/utils/qv4l2/qv4l2.pro
index 1ea07374..a9343c89 100644
--- a/utils/qv4l2/qv4l2.pro
+++ b/utils/qv4l2/qv4l2.pro
@@ -8,6 +8,9 @@ CONFIG += debug
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
+# opengl: to disable opengl suppport on Qt6 comment out the
+# following line
+greaterThan(QT_MAJOR_VERSION, 5): QT += openglwidgets
# adjust to your local meson build path
MESON_BUILD_PATH = $$PWD/build-meson
--
2.42.1
next prev parent reply other threads:[~2023-11-16 12:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-16 12:23 [PATCH v4l-utils v1 1/4] qv4l2: remove unused local variables 'QString what' Peter Seiderer
2023-11-16 12:24 ` Peter Seiderer [this message]
2023-11-16 12:24 ` [PATCH v4l-utils v1 3/4] qvidcap: fix v4l2_convert_hook (add PRE_TARGETDEPS) Peter Seiderer
2023-11-16 12:24 ` [PATCH v4l-utils v1 4/4] qvidcap: enable Qt6 compile with Qt OpenGL support Peter Seiderer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231116122402.28730-2-ps.report@gmx.net \
--to=ps.report@gmx.net \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.