From 40e9b2885476afcee11833b2da0cafa7f3cc2afd Mon Sep 17 00:00:00 2001 From: David Graeff Date: Tue, 16 Jan 2018 13:44:02 +0100 Subject: [PATCH] Command line switch to change between OpenGL and OpenGL ES. Add necessary dependencies to build.md doc --- docs/build.md | 4 ++-- openhantek/src/glscope.cpp | 59 ++++++++++++++++++++++++----------------------------------- openhantek/src/glscope.h | 2 +- openhantek/src/glscopegraph.cpp | 2 -- openhantek/src/main.cpp | 19 +++++++++++++++---- 5 files changed, 42 insertions(+), 44 deletions(-) diff --git a/docs/build.md b/docs/build.md index f752dea..9bfc821 100644 --- a/docs/build.md +++ b/docs/build.md @@ -3,10 +3,10 @@ layout: default --- ### [Linux](#linux) For debian (stretch and newer), Ubuntu 17.04+ and Mint 17+ and other deb based distributions install named requirements like this: -> apt install g++ cmake qttools5-dev qttools5-dev-tools libfftw3-dev binutils-dev libusb-1.0-0-dev libqt5opengl5-dev mesa-common-dev libgl1-mesa-dev +> apt install g++ cmake qttools5-dev qttools5-dev-tools libfftw3-dev binutils-dev libusb-1.0-0-dev libqt5opengl5-dev mesa-common-dev libgl1-mesa-dev libgles2-mesa-dev For rpm based distributions (Fedora 21+, OpenSuse) use this command: -> dnf install cmake gcc-c++ qt5-qtbase-gui qt5-qttools-devel qt5-qttranslations fftw-devel binutils-devel libusb-devel +> dnf install cmake gcc-c++ qt5-qtbase-gui qt5-qttools-devel qt5-qttranslations fftw-devel binutils-devel libusb-devel mesa-libGL-devel mesa-libGLES-devel After you've installed the requirements run the following commands inside the directory of this package: > mkdir build
diff --git a/openhantek/src/glscope.cpp b/openhantek/src/glscope.cpp index 82bcded..6a0c40b 100644 --- a/openhantek/src/glscope.cpp +++ b/openhantek/src/glscope.cpp @@ -12,9 +12,7 @@ #include #include -// We can't be more modern than OpenGL 3.2 or ES2 because of MacOSX. -#include -#include +#include #include "glscope.h" @@ -24,12 +22,6 @@ #include "viewconstants.h" #include "viewsettings.h" -#if defined(QT_OPENGL_ES_2) -typedef QOpenGLFunctions_ES2 OPENGL_VER; -#else -typedef QOpenGLFunctions_3_2_Core OPENGL_VER; -#endif - GlScope *GlScope::createNormal(DsoSettingsScope *scope, DsoSettingsView *view, QWidget *parent) { GlScope *s = new GlScope(scope, view, parent); s->zoomed = false; @@ -42,22 +34,21 @@ GlScope *GlScope::createZoomed(DsoSettingsScope *scope, DsoSettingsView *view, Q return s; } -void GlScope::fixOpenGLversion() { +void GlScope::fixOpenGLversion(QSurfaceFormat::RenderableType t) { QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); // Prefer full desktop OpenGL without fixed pipeline QSurfaceFormat format; format.setSamples(4); // Antia-Aliasing, Multisampling -#if defined(QT_OPENGL_ES_2) - format.setVersion(2, 0); - format.setProfile(QSurfaceFormat::CoreProfile); - format.setRenderableType(QSurfaceFormat::OpenGLES); - QCoreApplication::setAttribute(Qt::AA_UseOpenGLES, true); -#else - format.setVersion(3, 2); format.setProfile(QSurfaceFormat::CoreProfile); - format.setRenderableType(QSurfaceFormat::OpenGL); -#endif + if (t==QSurfaceFormat::OpenGLES) { + format.setVersion(2, 0); + format.setRenderableType(QSurfaceFormat::OpenGLES); + QCoreApplication::setAttribute(Qt::AA_UseOpenGLES, true); + } else { + format.setVersion(3, 2); + format.setRenderableType(QSurfaceFormat::OpenGL); + } QSurfaceFormat::setDefaultFormat(format); } @@ -66,7 +57,7 @@ GlScope::GlScope(DsoSettingsScope *scope, DsoSettingsView *view, QWidget *parent vaMarker.resize(MARKER_COUNT); } -GlScope::~GlScope() {} +GlScope::~GlScope() {/* virtual destructor necessary */} void GlScope::mousePressEvent(QMouseEvent *event) { if (!zoomed && event->button() == Qt::LeftButton) { @@ -154,7 +145,7 @@ void GlScope::initializeGL() { void main() { gl_FragColor = colour; } )"; - const char *vshaderCore = R"( + const char *vshaderDesktop = R"( #version 150 in highp vec3 vertex; uniform mat4 matrix; @@ -164,7 +155,7 @@ void GlScope::initializeGL() { gl_PointSize = 1.0; } )"; - const char *fshaderCore = R"( + const char *fshaderDesktop = R"( #version 150 uniform highp vec4 colour; out vec4 flatColor; @@ -173,9 +164,9 @@ void GlScope::initializeGL() { qDebug() << "compile shaders"; // Compile vertex shader - bool coreShaders = QSurfaceFormat::defaultFormat().profile() == QSurfaceFormat::CoreProfile; - if (!program->addShaderFromSourceCode(QOpenGLShader::Vertex, coreShaders ? vshaderCore : vshaderES) || - !program->addShaderFromSourceCode(QOpenGLShader::Fragment, coreShaders ? fshaderCore : fshaderES)) { + bool usesOpenGL = QSurfaceFormat::defaultFormat().renderableType()==QSurfaceFormat::OpenGL; + if (!program->addShaderFromSourceCode(QOpenGLShader::Vertex, usesOpenGL ? vshaderDesktop : vshaderES) || + !program->addShaderFromSourceCode(QOpenGLShader::Fragment, usesOpenGL ? fshaderDesktop : fshaderES)) { errorMessage = "Failed to compile OpenGL shader programs.\n" + program->log(); return; } @@ -197,7 +188,7 @@ void GlScope::initializeGL() { program->bind(); - auto *gl = context()->versionFunctions(); + auto *gl = context()->functions(); gl->glDisable(GL_DEPTH_TEST); gl->glEnable(GL_BLEND); // Enable depth buffer @@ -246,8 +237,7 @@ void GlScope::showData(PPresult *data) { // doneCurrent(); } -void GlScope::markerUpdated() -{ +void GlScope::markerUpdated() { for (unsigned marker = 0; marker < vaMarker.size(); ++marker) { if (!scope->horizontal.marker_visible[marker]) continue; @@ -264,7 +254,7 @@ void GlScope::markerUpdated() void GlScope::paintGL() { if (!shaderCompileSuccess) return; - auto *gl = context()->versionFunctions(); + auto *gl = context()->functions(); // Clear OpenGL buffer and configure settings // TODO Don't clear if view->digitalPhosphorDraws()>1 @@ -301,7 +291,7 @@ void GlScope::paintGL() { void GlScope::resizeGL(int width, int height) { if (!shaderCompileSuccess) return; - auto *gl = context()->versionFunctions(); + auto *gl = context()->functions(); gl->glViewport(0, 0, (GLint)width, (GLint)height); // Set axes to div-scale and apply correction for exact pixelization @@ -416,7 +406,7 @@ void GlScope::generateGrid(QOpenGLShaderProgram *program) { } void GlScope::drawGrid() { - auto *gl = context()->versionFunctions(); + auto *gl = context()->functions(); gl->glLineWidth(1); // Grid @@ -439,7 +429,7 @@ void GlScope::drawGrid() { } void GlScope::drawMarkers() { - auto *gl = context()->versionFunctions(); + auto *gl = context()->functions(); QColor trColor = view->screen.markers; m_program->setUniformValue(colorLocation, trColor); @@ -451,7 +441,6 @@ void GlScope::drawMarkers() { // Draw selected if (selectedMarker != NO_MARKER) { - qWarning() << selectedMarker; gl->glLineWidth(3); gl->glDrawArrays(GL_LINES, selectedMarker * 2, (GLsizei)2); } @@ -467,7 +456,7 @@ void GlScope::drawVoltageChannelGraph(ChannelID channel, Graph &graph, int histo QOpenGLVertexArrayObject::Binder b(v.first); const GLenum dMode = (view->interpolation == Dso::INTERPOLATION_OFF) ? GL_POINTS : GL_LINE_STRIP; - context()->versionFunctions()->glDrawArrays(dMode, 0, v.second); + context()->functions()->glDrawArrays(dMode, 0, v.second); } void GlScope::drawSpectrumChannelGraph(ChannelID channel, Graph &graph, int historyIndex) { @@ -478,5 +467,5 @@ void GlScope::drawSpectrumChannelGraph(ChannelID channel, Graph &graph, int hist QOpenGLVertexArrayObject::Binder b(v.first); const GLenum dMode = (view->interpolation == Dso::INTERPOLATION_OFF) ? GL_POINTS : GL_LINE_STRIP; - context()->versionFunctions()->glDrawArrays(dMode, 0, v.second); + context()->functions()->glDrawArrays(dMode, 0, v.second); } diff --git a/openhantek/src/glscope.h b/openhantek/src/glscope.h index 62d5dff..2206344 100644 --- a/openhantek/src/glscope.h +++ b/openhantek/src/glscope.h @@ -34,7 +34,7 @@ class GlScope : public QOpenGLWidget { * We need at least OpenGL 3.2 with shader version 150 or * OpenGL ES 2.0 with shader version 100. */ - static void fixOpenGLversion(); + static void fixOpenGLversion(QSurfaceFormat::RenderableType t=QSurfaceFormat::DefaultRenderableType); /** * Show new post processed data * @param data diff --git a/openhantek/src/glscopegraph.cpp b/openhantek/src/glscopegraph.cpp index 96b7e6c..13b5e4b 100644 --- a/openhantek/src/glscopegraph.cpp +++ b/openhantek/src/glscopegraph.cpp @@ -21,8 +21,6 @@ void Graph::writeData(PPresult *data, QOpenGLShaderProgram *program, int vertexL allocatedMem = neededMemory; } - qDebug() << data->data(0)->frequency; - // Write data to buffer int offset = 0; vaoVoltage.resize(data->vaChannelVoltage.size()); diff --git a/openhantek/src/main.cpp b/openhantek/src/main.cpp index 1de30ce..ad8c243 100644 --- a/openhantek/src/main.cpp +++ b/openhantek/src/main.cpp @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ #include +#include #include #include #include @@ -71,7 +72,19 @@ int main(int argc, char *argv[]) { QCoreApplication::setApplicationName("OpenHantek"); QCoreApplication::setApplicationVersion(VERSION); - GlScope::fixOpenGLversion(); + bool useGles = false; + { + QCoreApplication parserApp(argc, argv); + QCommandLineParser p; + p.addHelpOption(); + p.addVersionOption(); + QCommandLineOption useGlesOption("useGLES", QCoreApplication::tr("Use OpenGL ES instead of OpenGL")); + p.addOption(useGlesOption); + p.process(parserApp); + useGles = p.isSet(useGlesOption); + } + + GlScope::fixOpenGLversion(useGles ? QSurfaceFormat::OpenGLES : QSurfaceFormat::OpenGL); QApplication openHantekApplication(argc, argv); @@ -152,9 +165,7 @@ int main(int argc, char *argv[]) { postProcessingThread.quit(); postProcessingThread.wait(10000); - if (context && device != nullptr) { - libusb_exit(context); - } + if (context && device != nullptr) { libusb_exit(context); } return res; } -- libgit2 0.21.4