From 08cc6d02f54ce793dae832f9041883a7a30d8f93 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Thu, 21 Jul 2022 19:55:31 +0100 Subject: [PATCH 1/2] Use 2D textures as 1D not supported in Open GL ES on ARM --- sdrgui/gui/glshadercolormap.cpp | 24 ++++++++--------- sdrgui/gui/glshaderspectrogram.cpp | 42 +++++++++++++++--------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/sdrgui/gui/glshadercolormap.cpp b/sdrgui/gui/glshadercolormap.cpp index 5a576bf06..92dacaa7a 100644 --- a/sdrgui/gui/glshadercolormap.cpp +++ b/sdrgui/gui/glshadercolormap.cpp @@ -111,9 +111,9 @@ void GLShaderColorMap::initColorMapTextureImmutable(const QString &colorMapName) { if (!m_colorMapTexture) { - m_colorMapTexture = new QOpenGLTexture(QOpenGLTexture::Target1D); + m_colorMapTexture = new QOpenGLTexture(QOpenGLTexture::Target2D); m_colorMapTexture->setFormat(QOpenGLTexture::RGB32F); - m_colorMapTexture->setSize(256); + m_colorMapTexture->setSize(256, 1); m_colorMapTexture->allocateStorage(); m_colorMapTexture->setMinificationFilter(QOpenGLTexture::Linear); m_colorMapTexture->setMagnificationFilter(QOpenGLTexture::Linear); @@ -137,18 +137,18 @@ void GLShaderColorMap::initColorMapTextureMutable(const QString &colorMapName) } glGenTextures(1, &m_colorMapTextureId); - glBindTexture(GL_TEXTURE_1D, m_colorMapTextureId); + glBindTexture(GL_TEXTURE_2D, m_colorMapTextureId); // Use 2D texture as 1D not supported in OpenGL ES on ARM GLfloat *colorMap = (GLfloat *)ColorMap::getColorMap(colorMapName); if (colorMap) { - glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 256, 0, GL_RGB, GL_FLOAT, colorMap); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 1, 0, GL_RGB, GL_FLOAT, colorMap); } else { qDebug() << "GLShaderColorMap::initColorMapTextureMutable: colorMap " << colorMapName << " not supported"; } - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, QOpenGLTexture::Repeat); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, QOpenGLTexture::Repeat); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, QOpenGLTexture::Repeat); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, QOpenGLTexture::Repeat); } void GLShaderColorMap::drawSurfaceStrip(const QMatrix4x4& transformMatrix, GLfloat *vertices, int nbVertices, float scale, float alpha) @@ -263,10 +263,10 @@ const QString GLShaderColorMap::m_vertexShaderSourceColorMap = QString( const QString GLShaderColorMap::m_fragmentShaderSourceColorMap2 = QString( "uniform float alpha;\n" "uniform float scale;\n" - "uniform highp sampler1D colorMap;\n" + "uniform highp sampler2D colorMap;\n" "varying float y;\n" "void main() {\n" - " gl_FragColor = vec4(texture1D(colorMap, 1.0-(y/scale)).rgb, alpha);\n" + " gl_FragColor = vec4(texture2D(colorMap, vec2(1.0-(y/scale), 0)).rgb, alpha);\n" "}\n" ); @@ -274,10 +274,10 @@ const QString GLShaderColorMap::m_fragmentShaderSourceColorMap = QString( "#version 330\n" "uniform float alpha;\n" "uniform float scale;\n" - "uniform sampler1D colorMap;\n" + "uniform sampler2D colorMap;\n" "in float y;\n" "out vec4 fragColor;\n" "void main() {\n" - " fragColor = vec4(texture(colorMap, 1.0-(y/scale)).rgb, alpha);\n" + " fragColor = vec4(texture(colorMap, vec2(1.0-(y/scale), 0)).rgb, alpha);\n" "}\n" ); diff --git a/sdrgui/gui/glshaderspectrogram.cpp b/sdrgui/gui/glshaderspectrogram.cpp index 8de166051..b20642af1 100644 --- a/sdrgui/gui/glshaderspectrogram.cpp +++ b/sdrgui/gui/glshaderspectrogram.cpp @@ -240,9 +240,9 @@ void GLShaderSpectrogram::initColorMapTextureImmutable(const QString &colorMapNa { if (!m_colorMapTexture) { - m_colorMapTexture = new QOpenGLTexture(QOpenGLTexture::Target1D); + m_colorMapTexture = new QOpenGLTexture(QOpenGLTexture::Target2D); m_colorMapTexture->setFormat(QOpenGLTexture::RGB32F); - m_colorMapTexture->setSize(256); + m_colorMapTexture->setSize(256, 1); m_colorMapTexture->allocateStorage(); m_colorMapTexture->setMinificationFilter(QOpenGLTexture::Linear); m_colorMapTexture->setMagnificationFilter(QOpenGLTexture::Linear); @@ -266,18 +266,18 @@ void GLShaderSpectrogram::initColorMapTextureMutable(const QString &colorMapName } glGenTextures(1, &m_colorMapTextureId); - glBindTexture(GL_TEXTURE_1D, m_colorMapTextureId); + glBindTexture(GL_TEXTURE_2D, m_colorMapTextureId); // Use 2D texture as 1D not supported in OpenGL ES on ARM GLfloat *colorMap = (GLfloat *)ColorMap::getColorMap(colorMapName); if (colorMap) { - glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 256, 0, GL_RGB, GL_FLOAT, colorMap); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 1, 0, GL_RGB, GL_FLOAT, colorMap); } else { qDebug() << "GLShaderSpectrogram::initColorMapTextureMutable: colorMap " << colorMapName << " not supported"; } - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, QOpenGLTexture::Repeat); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, QOpenGLTexture::Repeat); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, QOpenGLTexture::Repeat); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, QOpenGLTexture::Repeat); } void GLShaderSpectrogram::initTexture(const QImage& image) @@ -412,7 +412,7 @@ void GLShaderSpectrogram::drawSurface(SpectrumSettings::SpectrogramStyle style, { glBindTexture(GL_TEXTURE_2D, m_textureId); glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_1D, m_colorMapTextureId); + glBindTexture(GL_TEXTURE_2D, m_colorMapTextureId); glActiveTexture(GL_TEXTURE0); } @@ -786,7 +786,7 @@ const QString GLShaderSpectrogram::m_fragmentShaderShaded = QString( "in vec3 normal;\n" "in float lightDistance2;\n" "out vec4 fragColor;\n" - "uniform sampler1D colorMap;\n" + "uniform sampler2D colorMap;\n" "uniform vec3 lightDir;\n" "void main(void) {\n" " float factor;\n" @@ -796,9 +796,9 @@ const QString GLShaderSpectrogram::m_fragmentShaderShaded = QString( " factor = 0.5;\n" " float ambient = 0.4;\n" " vec3 color;\n" - " color.r = texture(colorMap, coord2.z).r;\n" - " color.g = texture(colorMap, coord2.z).g;\n" - " color.b = texture(colorMap, coord2.z).b;\n" + " color.r = texture(colorMap, vec2(coord2.z, 0)).r;\n" + " color.g = texture(colorMap, vec2(coord2.z, 0)).g;\n" + " color.b = texture(colorMap, vec2(coord2.z, 0)).b;\n" " float cosTheta = max(0.0, dot(normal, lightDir));\n" " float d2 = max(1.0, lightDistance2*lightDistance2);\n" " vec3 relection = (ambient * color + color * cosTheta / d2) * factor;\n" @@ -812,16 +812,16 @@ const QString GLShaderSpectrogram::m_fragmentShaderShaded = QString( const QString GLShaderSpectrogram::m_fragmentShaderSimple2 = QString( "varying vec4 coord;\n" "uniform float brightness;\n" - "uniform sampler1D colorMap;\n" + "uniform sampler2D colorMap;\n" "void main(void) {\n" " float factor;\n" " if (gl_FrontFacing)\n" " factor = 1.0;\n" " else\n" " factor = 0.5;\n" - " gl_FragColor[0] = texture1D(colorMap, coord.z).r * brightness * factor;\n" - " gl_FragColor[1] = texture1D(colorMap, coord.z).g * brightness * factor;\n" - " gl_FragColor[2] = texture1D(colorMap, coord.z).b * brightness * factor;\n" + " gl_FragColor[0] = texture2D(colorMap, vec2(coord.z, 0)).r * brightness * factor;\n" + " gl_FragColor[1] = texture2D(colorMap, vec2(coord.z, 0)).g * brightness * factor;\n" + " gl_FragColor[2] = texture2D(colorMap, vec2(coord.z, 0)).b * brightness * factor;\n" " gl_FragColor[3] = 1.0;\n" "}\n" ); @@ -831,16 +831,16 @@ const QString GLShaderSpectrogram::m_fragmentShaderSimple = QString( "in vec4 coord;\n" "out vec4 fragColor;\n" "uniform float brightness;\n" - "uniform sampler1D colorMap;\n" + "uniform sampler2D colorMap;\n" "void main(void) {\n" " float factor;\n" " if (gl_FrontFacing)\n" " factor = 1.0;\n" " else\n" " factor = 0.5;\n" - " fragColor[0] = texture(colorMap, coord.z).r * brightness * factor;\n" - " fragColor[1] = texture(colorMap, coord.z).g * brightness * factor;\n" - " fragColor[2] = texture(colorMap, coord.z).b * brightness * factor;\n" + " fragColor[0] = texture(colorMap, vec2(coord.z, 0)).r * brightness * factor;\n" + " fragColor[1] = texture(colorMap, vec2(coord.z, 0)).g * brightness * factor;\n" + " fragColor[2] = texture(colorMap, vec2(coord.z, 0)).b * brightness * factor;\n" " fragColor[3] = 1.0;\n" "}\n" ); From 7ba8540dd4fa0e52e8766ce83e42aa5582388766 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Thu, 21 Jul 2022 21:09:41 +0100 Subject: [PATCH 2/2] Fix shaders so they don't crash when OpenGL 2.0 ES is used --- sdrgui/gui/glshadercolormap.cpp | 14 +++++++++----- sdrgui/gui/glshaderspectrogram.cpp | 13 +++++++------ sdrgui/gui/glshaderspectrogram.h | 1 + 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/sdrgui/gui/glshadercolormap.cpp b/sdrgui/gui/glshadercolormap.cpp index 92dacaa7a..f1d2bb464 100644 --- a/sdrgui/gui/glshadercolormap.cpp +++ b/sdrgui/gui/glshadercolormap.cpp @@ -156,7 +156,11 @@ void GLShaderColorMap::drawSurfaceStrip(const QMatrix4x4& transformMatrix, GLflo QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); m_program->bind(); m_program->setUniformValue(m_matrixLoc, transformMatrix); - m_colorMapTexture->bind(); + if (m_useImmutableStorage) { + m_colorMapTexture->bind(); + } else { + glBindTexture(GL_TEXTURE_2D, m_colorMapTextureId); + } m_program->setUniformValue(m_colorMapLoc, 0); // Texture unit 0 for color map m_program->setUniformValue(m_scaleLoc, scale); m_program->setUniformValue(m_alphaLoc, alpha); @@ -242,7 +246,7 @@ bool GLShaderColorMap::useImmutableStorage() const QString GLShaderColorMap::m_vertexShaderSourceColorMap2 = QString( "uniform highp mat4 uMatrix;\n" "attribute highp vec4 vertex;\n" - "varying float y;\n" + "varying highp float y;\n" "void main() {\n" " gl_Position = uMatrix * vertex;\n" " y = vertex.y;\n" @@ -261,10 +265,10 @@ const QString GLShaderColorMap::m_vertexShaderSourceColorMap = QString( ); const QString GLShaderColorMap::m_fragmentShaderSourceColorMap2 = QString( - "uniform float alpha;\n" - "uniform float scale;\n" + "uniform highp float alpha;\n" + "uniform highp float scale;\n" "uniform highp sampler2D colorMap;\n" - "varying float y;\n" + "varying highp float y;\n" "void main() {\n" " gl_FragColor = vec4(texture2D(colorMap, vec2(1.0-(y/scale), 0)).rgb, alpha);\n" "}\n" diff --git a/sdrgui/gui/glshaderspectrogram.cpp b/sdrgui/gui/glshaderspectrogram.cpp index b20642af1..10d3d0dc4 100644 --- a/sdrgui/gui/glshaderspectrogram.cpp +++ b/sdrgui/gui/glshaderspectrogram.cpp @@ -288,6 +288,7 @@ void GLShaderSpectrogram::initTexture(const QImage& image) initTextureMutable(image); } initGrid(image.width()); + m_limit = 1.4f*1.0f/(float)image.height(); } void GLShaderSpectrogram::initTextureImmutable(const QImage& image) @@ -419,7 +420,7 @@ void GLShaderSpectrogram::drawSurface(SpectrumSettings::SpectrogramStyle style, program->setUniformValue(m_dataTextureLoc, 0); // set uniform to texture unit? program->setUniformValue(m_colorMapLoc, 1); - program->setUniformValue(m_limitLoc, 1.4f*1.0f/(float)(m_texture->height())); + program->setUniformValue(m_limitLoc, m_limit); if (style == SpectrumSettings::Outline) { @@ -721,11 +722,11 @@ void GLShaderSpectrogram::applyPerspective(QMatrix4x4 &matrix) const QString GLShaderSpectrogram::m_vertexShader2 = QString( "attribute vec2 coord2d;\n" "varying vec4 coord;\n" - "varying float lightDistance;\n" + "varying highp float lightDistance;\n" "uniform mat4 textureTransform;\n" "uniform mat4 vertexTransform;\n" "uniform sampler2D dataTexture;\n" - "uniform float limit;\n" + "uniform highp float limit;\n" "uniform vec3 lightPos;\n" "void main(void) {\n" " coord = textureTransform * vec4(clamp(coord2d, limit, 1.0-limit), 0, 1);\n" @@ -810,11 +811,11 @@ const QString GLShaderSpectrogram::m_fragmentShaderShaded = QString( ); const QString GLShaderSpectrogram::m_fragmentShaderSimple2 = QString( - "varying vec4 coord;\n" - "uniform float brightness;\n" + "varying highp vec4 coord;\n" + "uniform highp float brightness;\n" "uniform sampler2D colorMap;\n" "void main(void) {\n" - " float factor;\n" + " highp float factor;\n" " if (gl_FrontFacing)\n" " factor = 1.0;\n" " else\n" diff --git a/sdrgui/gui/glshaderspectrogram.h b/sdrgui/gui/glshaderspectrogram.h index 5b196b0c6..35050606c 100644 --- a/sdrgui/gui/glshaderspectrogram.h +++ b/sdrgui/gui/glshaderspectrogram.h @@ -81,6 +81,7 @@ private: unsigned int m_textureId; QOpenGLTexture *m_colorMapTexture; unsigned int m_colorMapTextureId; + float m_limit; QOpenGLShaderProgram *m_programForLocs; // Which program the locations are for int m_coord2dLoc;