1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
From 167a941f8070f4a9abacb3aa2f61ee6ee00d6cb8 Mon Sep 17 00:00:00 2001
From: Mladen Milinkovic <maxrd2@smoothware.net>
Date: Thu, 7 Oct 2021 19:37:23 +0200
Subject: [PATCH] GLRenderer: added GLES support
---
src/videoplayer/backend/glrenderer.cpp | 44 ++++++++++++++++++++++----
1 file changed, 38 insertions(+), 6 deletions(-)
diff --git a/src/videoplayer/backend/glrenderer.cpp b/src/videoplayer/backend/glrenderer.cpp
index 7c9c38b..5cb985d 100644
--- a/src/videoplayer/backend/glrenderer.cpp
+++ b/src/videoplayer/backend/glrenderer.cpp
@@ -20,6 +20,7 @@ extern "C" {
}
#define DEBUG_GL 0
+#define FORCE_GLES 0
#define OPENGL_CORE 0
#define OPENGL_VER 2,0
@@ -33,6 +34,17 @@ extern "C" {
#define asGL(glCall) glCall
#endif
+#if defined(GL_ES_VERSION_2_0) || FORCE_GLES
+#define USE_GLES
+#define TEXTURE_RGB_FORMAT GL_RGBA
+// NOTE: we don't currently support more than 8bpp on GLES
+#define TEXTURE_U16_FORMAT GL_R8
+#else
+#undef USE_GLES
+#define TEXTURE_RGB_FORMAT GL_BGRA
+#define TEXTURE_U16_FORMAT GL_R16
+#endif
+
using namespace SubtitleComposer;
enum { ID_Y, ID_U, ID_V, ID_OVR, ID_SIZE };
@@ -82,6 +94,9 @@ void
GLRenderer::setupProfile()
{
QSurfaceFormat format(QSurfaceFormat::defaultFormat());
+#if FORCE_GLES
+ format.setRenderableType(QSurfaceFormat::OpenGLES);
+#endif
format.setVersion(OPENGL_VER);
#if DEBUG_GL
format.setOption(QSurfaceFormat::DebugContext);
@@ -126,7 +141,7 @@ GLRenderer::setFrameFormat(int width, int height, int compBits, int crWidthShift
m_crHeight = crHeight;
m_glType = compBytes == 1 ? GL_UNSIGNED_BYTE : GL_UNSIGNED_SHORT;
- m_glFormat = compBytes == 1 ? GL_R8 : GL_R16;
+ m_glFormat = compBytes == 1 ? GL_R8 : TEXTURE_U16_FORMAT;
delete[] m_bufYUV;
m_bufSize = bufSize;
@@ -261,7 +276,11 @@ GLRenderer::initShader()
delete m_vertShader;
m_vertShader = new QOpenGLShader(QOpenGLShader::Vertex, this);
bool success = m_vertShader->compileSourceCode(
+#ifdef USE_GLES
+ "#version 100\n"
+#else
"#version 120\n"
+#endif
"attribute vec4 vPos;"
"attribute vec2 vVidTex;"
"attribute vec2 vOvrTex;"
@@ -288,7 +307,13 @@ GLRenderer::initShader()
csms.append(QString::number(csm[i], 'g', 10));
}
- success = m_fragShader->compileSourceCode(QStringLiteral("#version 120\n"
+ success = m_fragShader->compileSourceCode(QStringLiteral(
+#ifdef USE_GLES
+ "#version 100\n"
+ "precision mediump float;\n"
+#else
+ "#version 120\n"
+#endif
"varying vec2 vfVidTex;"
"varying vec2 vfOvrTex;"
"uniform sampler2D texY;"
@@ -348,8 +373,15 @@ GLRenderer::initializeGL()
QMutexLocker l(&m_texMutex);
initializeOpenGLFunctions();
- qDebug() << "OpenGL version: " << reinterpret_cast<const char *>(glGetString(GL_VERSION));
- qDebug() << "GLSL version: " << reinterpret_cast<const char *>(glGetString(GL_SHADING_LANGUAGE_VERSION));
+ qDebug().nospace() << "GL API: OpenGL " << (format().renderableType() == QSurfaceFormat::OpenGLES ? "ES" : "Desktop")
+ << ' ' << format().majorVersion() << "." << format().minorVersion()
+#ifdef USE_GLES
+ << " (compiled for OpenGL ES)";
+#else
+ << " (compiled for OpenGL Desktop)";
+#endif
+ qDebug() << "OpenGL version:" << reinterpret_cast<const char *>(glGetString(GL_VERSION));
+ qDebug() << "GLSL version:" << reinterpret_cast<const char *>(glGetString(GL_SHADING_LANGUAGE_VERSION));
if(m_vao.create())
m_vao.bind();
@@ -453,13 +485,13 @@ GLRenderer::uploadMM(int texWidth, int texHeight, T *texBuf, const T *texSrc)
if(D == 1) {
asGL(glTexImage2D(GL_TEXTURE_2D, level, m_glFormat, texWidth, texHeight, 0, GL_RED, m_glType, texSrc));
} else { // D == 4
- asGL(glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, texWidth, texHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, texSrc));
+ asGL(glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, texWidth, texHeight, 0, TEXTURE_RGB_FORMAT, GL_UNSIGNED_BYTE, texSrc));
}
} else {
if(D == 1) {
asGL(glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, texWidth, texHeight, GL_RED, m_glType, texSrc));
} else { // D == 4
- asGL(glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, texWidth, texHeight, GL_BGRA, GL_UNSIGNED_BYTE, texSrc));
+ asGL(glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, texWidth, texHeight, TEXTURE_RGB_FORMAT, GL_UNSIGNED_BYTE, texSrc));
}
}
--
GitLab
|