diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bcd8da9b..063b46549 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,7 +117,8 @@ set(sdrbase_SOURCES sdrbase/gui/colormapper.cpp sdrbase/gui/glscope.cpp sdrbase/gui/glscopegui.cpp - sdrbase/gui/glspectrum.cpp + sdrbase/gui/glshadersources.cpp + sdrbase/gui/glspectrum.cpp sdrbase/gui/glspectrumgui.cpp sdrbase/gui/indicator.cpp sdrbase/gui/pluginsdialog.cpp @@ -199,7 +200,8 @@ set(sdrbase_HEADERS include/gui/colormapper.h include/gui/glscope.h include/gui/glscopegui.h - include/gui/glspectrum.h + include/gui/glshadersources.h + include/gui/glspectrum.h include/gui/glspectrumgui.h include/gui/indicator.h include/gui/physicalunit.h diff --git a/include/gui/glshadersources.h b/include/gui/glshadersources.h index 4fa9a72f7..7f2ecdffa 100644 --- a/include/gui/glshadersources.h +++ b/include/gui/glshadersources.h @@ -23,13 +23,11 @@ class GLShaderSources { public: - static const QString& getVertexShaderSourceSimple(); - static const QString& getFragmentShaderSourceColored(); + static const QString& getVertexShaderSourceSimple() { return m_vertexShaderSourceSimple; } + static const QString& getFragmentShaderSourceColored() { return m_fragmentShaderSourceColored; } private: static const QString m_vertexShaderSourceSimple; static const QString m_fragmentShaderSourceColored; }; - - #endif /* INCLUDE_GUI_GLSHADERSOURCES_H_ */ diff --git a/include/gui/glspectrum.h b/include/gui/glspectrum.h index c2b4a59b5..ea994c29e 100644 --- a/include/gui/glspectrum.h +++ b/include/gui/glspectrum.h @@ -21,11 +21,15 @@ #include #include #include +#include +#include #include "dsp/dsptypes.h" #include "gui/scaleengine.h" #include "dsp/channelmarker.h" #include "util/export.h" +class QOpenGLShaderProgram; + class SDRANGEL_API GLSpectrum : public QGLWidget { Q_OBJECT @@ -150,6 +154,12 @@ private: bool m_displayChanged; + QOpenGLVertexArrayObject m_vao; + QOpenGLBuffer m_vbo; + QOpenGLShaderProgram *m_program; + int m_matrixLoc; + int m_colorLoc; + void updateWaterfall(const std::vector& spectrum); void updateHistogram(const std::vector& spectrum); @@ -167,6 +177,8 @@ private: void enterEvent(QEvent* event); void leaveEvent(QEvent* event); + void cleanup(); + private slots: void tick(); void channelMarkerChanged(); diff --git a/sdrbase/gui/glshadersources.cpp b/sdrbase/gui/glshadersources.cpp index 30bfea3b0..f9ca5ed97 100644 --- a/sdrbase/gui/glshadersources.cpp +++ b/sdrbase/gui/glshadersources.cpp @@ -18,16 +18,14 @@ #include "gui/glshadersources.h" const QString GLShaderSources::m_vertexShaderSourceSimple = QString( - "#version 150\n" "uniform mat4 uMatrix;\n" - "in vec4 vertex\n" + "attribute vec4 vertex;\n" "void main() {\n" " gl_Position = uMatrix * vertex;\n" "}\n" ); const QString GLShaderSources::m_fragmentShaderSourceColored = QString( - "#version 150\n" "uniform mediump vec4 uColour;\n" "void main() {\n" " gl_FragColor = uColour;\n" diff --git a/sdrbase/gui/glspectrum.cpp b/sdrbase/gui/glspectrum.cpp index ff0315bf5..89c2625b8 100644 --- a/sdrbase/gui/glspectrum.cpp +++ b/sdrbase/gui/glspectrum.cpp @@ -20,7 +20,9 @@ #endif #include +#include #include "gui/glspectrum.h" +#include "gui/glshadersources.h" #include @@ -58,7 +60,8 @@ GLSpectrum::GLSpectrum(QWidget* parent) : m_histogramHoldoff(NULL), m_histogramTextureAllocated(false), m_displayHistogram(true), - m_displayChanged(false) + m_displayChanged(false), + m_program(0) { setAutoFillBackground(false); setAttribute(Qt::WA_OpaquePaintEvent, true); @@ -110,6 +113,12 @@ GLSpectrum::GLSpectrum(QWidget* parent) : m_frequencyScale.setFont(font()); m_frequencyScale.setOrientation(Qt::Horizontal); + m_vao.create(); + QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); + m_vbo.create(); + m_vbo.bind(); + // TODO: allocate VBO + connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick())); m_timer.start(50); } @@ -154,6 +163,10 @@ GLSpectrum::~GLSpectrum() deleteTexture(m_frequencyTexture); m_frequencyTextureAllocated = false; } + + makeCurrent(); // TODO: move to cleanup() wnem inheriting from QOpenGLWidget + m_vbo.destroy(); + doneCurrent(); } void GLSpectrum::setCenterFrequency(quint64 frequency) @@ -484,7 +497,18 @@ void GLSpectrum::updateHistogram(const std::vector& spectrum) void GLSpectrum::initializeGL() { - glDisable(GL_DEPTH_TEST); + //connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &GLSpectrum::cleanup); // TODO: when migrating to QOpenGLWidget + glDisable(GL_DEPTH_TEST); + + m_program = new QOpenGLShaderProgram; + m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, GLShaderSources::getVertexShaderSourceSimple()); + m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, GLShaderSources::getFragmentShaderSourceColored()); + m_program->bindAttributeLocation("vertex", 0); + m_program->link(); + m_program->bind(); + m_matrixLoc = m_program->uniformLocation("uMatrix"); + m_colorLoc = m_program->uniformLocation("uColor"); + m_program->release(); } void GLSpectrum::resizeGL(int width, int height) @@ -2041,3 +2065,14 @@ void GLSpectrum::connectTimer(const QTimer& timer) connect(&timer, SIGNAL(timeout()), this, SLOT(tick())); m_timer.stop(); } + +void GLSpectrum::cleanup() +{ + makeCurrent(); + if (m_program) { + delete m_program; + m_program = 0; + } + m_program = 0; + doneCurrent(); +}