From 6dddef1f7a21ab490c3500246460fd3a5bb73703 Mon Sep 17 00:00:00 2001 From: Denis Dovzhenko Date: Sat, 20 Jan 2018 11:25:16 +0300 Subject: [PATCH] Fix segfaults in XY display --- openhantek/src/glscope.cpp | 4 +++- openhantek/src/glscopegraph.cpp | 56 ++++++++++++++++++++++++++++++-------------------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/openhantek/src/glscope.cpp b/openhantek/src/glscope.cpp index 6a0c40b..16212e9 100644 --- a/openhantek/src/glscope.cpp +++ b/openhantek/src/glscope.cpp @@ -275,7 +275,9 @@ void GlScope::paintGL() { unsigned historyIndex = 0; for (Graph &graph : m_GraphHistory) { for (ChannelID channel = 0; channel < scope->voltage.size(); ++channel) { - drawSpectrumChannelGraph(channel, graph, (int)historyIndex); + if (scope->horizontal.format == Dso::GraphFormat::TY) { + drawSpectrumChannelGraph(channel, graph, (int)historyIndex); + } drawVoltageChannelGraph(channel, graph, (int)historyIndex); } ++historyIndex; diff --git a/openhantek/src/glscopegraph.cpp b/openhantek/src/glscopegraph.cpp index 13b5e4b..29ca3ad 100644 --- a/openhantek/src/glscopegraph.cpp +++ b/openhantek/src/glscopegraph.cpp @@ -26,39 +26,43 @@ void Graph::writeData(PPresult *data, QOpenGLShaderProgram *program, int vertexL vaoVoltage.resize(data->vaChannelVoltage.size()); vaoSpectrum.resize(data->vaChannelSpectrum.size()); for (ChannelID channel = 0; channel < vaoVoltage.size(); ++channel) { - VaoCount &v = vaoVoltage[channel]; - VaoCount &s = vaoSpectrum[channel]; int dataSize; // Voltage channel - if (!v.first) { - v.first = new QOpenGLVertexArrayObject; - if (!v.first->create()) throw new std::runtime_error("QOpenGLVertexArrayObject create failed"); + if (channel < vaoVoltage.size()) { + VaoCount &v = vaoVoltage[channel]; + if (!v.first) { + v.first = new QOpenGLVertexArrayObject; + if (!v.first->create()) throw new std::runtime_error("QOpenGLVertexArrayObject create failed"); + } + ChannelGraph &gVoltage = data->vaChannelVoltage[channel]; + v.first->bind(); + dataSize = int(gVoltage.size() * sizeof(QVector3D)); + buffer.write(offset, gVoltage.data(), dataSize); + program->enableAttributeArray(vertexLocation); + program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, 0); + v.first->release(); + v.second = (int)gVoltage.size(); + offset += dataSize; } - ChannelGraph &gVoltage = data->vaChannelVoltage[channel]; - v.first->bind(); - dataSize = int(gVoltage.size() * sizeof(QVector3D)); - buffer.write(offset, gVoltage.data(), dataSize); - program->enableAttributeArray(vertexLocation); - program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, 0); - v.first->release(); - v.second = (int)gVoltage.size(); - offset += dataSize; // Spectrum channel - if (!s.first) { - s.first = new QOpenGLVertexArrayObject; - if (!s.first->create()) throw new std::runtime_error("QOpenGLVertexArrayObject create failed"); + if (channel < vaoSpectrum.size()) { + VaoCount &s = vaoSpectrum[channel]; + if (!s.first) { + s.first = new QOpenGLVertexArrayObject; + if (!s.first->create()) throw new std::runtime_error("QOpenGLVertexArrayObject create failed"); + } + ChannelGraph &gSpectrum = data->vaChannelSpectrum[channel]; + s.first->bind(); + dataSize = int(gSpectrum.size() * sizeof(QVector3D)); + buffer.write(offset, gSpectrum.data(), dataSize); + program->enableAttributeArray(vertexLocation); + program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, 0); + s.first->release(); + s.second = (int)gSpectrum.size(); + offset += dataSize; } - ChannelGraph &gSpectrum = data->vaChannelSpectrum[channel]; - s.first->bind(); - dataSize = int(gSpectrum.size() * sizeof(QVector3D)); - buffer.write(offset, gSpectrum.data(), dataSize); - program->enableAttributeArray(vertexLocation); - program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, 0); - s.first->release(); - s.second = (int)gSpectrum.size(); - offset += dataSize; } buffer.release(); -- libgit2 0.21.4