From e8e5286ff5c5e5ba822e798dc0c1f8270817a562 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Fri, 6 Jun 2014 10:19:38 +0300 Subject: Fix for static optimization crash on android MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added checks if visible items really exists and if buffers are empty. Change-Id: Id29f87924e098c6f8b7b57bc74543ce37787995f Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/scatter3drenderer.cpp | 14 ++++- .../utils/scatterobjectbufferhelper.cpp | 62 ++++++++++++---------- .../utils/scatterpointbufferhelper.cpp | 27 ++++++---- 3 files changed, 64 insertions(+), 39 deletions(-) (limited to 'src/datavisualization') diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 26c393bd..dd50188b 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -444,6 +444,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } QVector3D modelScaler(itemSize, itemSize, itemSize); + if (!optimizationDefault + && ((drawingPoints && cache->bufferPoints()->indexCount() == 0) + || (!drawingPoints && cache->bufferObject()->indexCount() == 0))) { + continue; + } + int loopCount = 1; if (optimizationDefault) loopCount = renderArraySize; @@ -709,6 +715,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #endif QVector3D modelScaler(itemSize, itemSize, itemSize); + if (!optimizationDefault + && ((drawingPoints && cache->bufferPoints()->indexCount() == 0) + || (!drawingPoints && cache->bufferObject()->indexCount() == 0))) { + continue; + } + // Rebind shader if it has changed if (drawingPoints != previousDrawingPoints || (!drawingPoints && @@ -920,7 +932,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) if (!drawingPoints) { glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(-0.5f, 1.0f); + glPolygonOffset(-1.0f, 1.0f); } #if !defined(QT_OPENGL_ES_2) diff --git a/src/datavisualization/utils/scatterobjectbufferhelper.cpp b/src/datavisualization/utils/scatterobjectbufferhelper.cpp index 123588f1..d68b9df4 100644 --- a/src/datavisualization/utils/scatterobjectbufferhelper.cpp +++ b/src/datavisualization/utils/scatterobjectbufferhelper.cpp @@ -38,12 +38,16 @@ void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal { initializeOpenGLFunctions(); + m_meshDataLoaded = false; + m_indexCount = 0; + ObjectHelper *dotObj = cache->object(); ScatterRenderItemArray &renderArray = cache->renderArray(); const uint renderArraySize = renderArray.size(); + if (renderArraySize == 0) + return; // No use to go forward uint itemCount = renderArraySize; QQuaternion seriesRotation(cache->meshRotation()); - if (m_meshDataLoaded) { // Delete old data glDeleteBuffers(1, &m_vertexbuffer); @@ -51,7 +55,6 @@ void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal glDeleteBuffers(1, &m_normalbuffer); glDeleteBuffers(1, &m_elementbuffer); } - // Index vertices const QVector indices = dotObj->indices(); const QVector indexed_vertices = dotObj->indexedvertices(); @@ -89,6 +92,7 @@ void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal buffered_uvs.resize(uvsCount * renderArraySize); buffered_normals.resize(normalsCount * renderArraySize); uint pos = 0; + for (uint i = 0; i < renderArraySize; i++) { ScatterRenderItem &item = renderArray[i]; if (!item.isVisible()) { @@ -130,32 +134,34 @@ void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal m_indexCount = indicesCount * itemCount; - glGenBuffers(1, &m_vertexbuffer); - glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer); - glBufferData(GL_ARRAY_BUFFER, verticeCount * itemCount * sizeof(QVector3D), - &buffered_vertices.at(0), - GL_STATIC_DRAW); - - glGenBuffers(1, &m_normalbuffer); - glBindBuffer(GL_ARRAY_BUFFER, m_normalbuffer); - glBufferData(GL_ARRAY_BUFFER, normalsCount * itemCount * sizeof(QVector3D), - &buffered_normals.at(0), - GL_STATIC_DRAW); - - glGenBuffers(1, &m_uvbuffer); - glBindBuffer(GL_ARRAY_BUFFER, m_uvbuffer); - glBufferData(GL_ARRAY_BUFFER, uvsCount * itemCount * sizeof(QVector2D), - &buffered_uvs.at(0), GL_STATIC_DRAW); - - glGenBuffers(1, &m_elementbuffer); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_elementbuffer); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesCount * itemCount * sizeof(GLint), - &buffered_indices.at(0), GL_STATIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - - m_meshDataLoaded = true; + if (itemCount > 0) { + glGenBuffers(1, &m_vertexbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer); + glBufferData(GL_ARRAY_BUFFER, verticeCount * itemCount * sizeof(QVector3D), + &buffered_vertices.at(0), + GL_STATIC_DRAW); + + glGenBuffers(1, &m_normalbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_normalbuffer); + glBufferData(GL_ARRAY_BUFFER, normalsCount * itemCount * sizeof(QVector3D), + &buffered_normals.at(0), + GL_STATIC_DRAW); + + glGenBuffers(1, &m_uvbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_uvbuffer); + glBufferData(GL_ARRAY_BUFFER, uvsCount * itemCount * sizeof(QVector2D), + &buffered_uvs.at(0), GL_STATIC_DRAW); + + glGenBuffers(1, &m_elementbuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_elementbuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesCount * itemCount * sizeof(GLint), + &buffered_indices.at(0), GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + m_meshDataLoaded = true; + } } void ScatterObjectBufferHelper::update(ScatterSeriesRenderCache *cache, qreal dotScale) diff --git a/src/datavisualization/utils/scatterpointbufferhelper.cpp b/src/datavisualization/utils/scatterpointbufferhelper.cpp index cf3bc0fc..b14d84ad 100644 --- a/src/datavisualization/utils/scatterpointbufferhelper.cpp +++ b/src/datavisualization/utils/scatterpointbufferhelper.cpp @@ -81,6 +81,7 @@ void ScatterPointBufferHelper::load(ScatterSeriesRenderCache *cache) ScatterRenderItemArray &renderArray = cache->renderArray(); const int renderArraySize = renderArray.size(); + m_indexCount = 0; if (m_meshDataLoaded) { // Delete old data @@ -88,25 +89,31 @@ void ScatterPointBufferHelper::load(ScatterSeriesRenderCache *cache) m_bufferedPoints.clear(); } + bool itemsVisible = false; m_bufferedPoints.resize(renderArraySize); for (int i = 0; i < renderArraySize; i++) { ScatterRenderItem &item = renderArray[i]; - if (!item.isVisible()) + if (!item.isVisible()) { m_bufferedPoints[i] = hiddenPos; - else + } else { + itemsVisible = true; m_bufferedPoints[i] = item.translation(); + } } - m_indexCount = renderArraySize; + if (itemsVisible) + m_indexCount = renderArraySize; - glGenBuffers(1, &m_pointbuffer); - glBindBuffer(GL_ARRAY_BUFFER, m_pointbuffer); - glBufferData(GL_ARRAY_BUFFER, m_bufferedPoints.size() * sizeof(QVector3D), - &m_bufferedPoints.at(0), - GL_DYNAMIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (m_indexCount > 0) { + glGenBuffers(1, &m_pointbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_pointbuffer); + glBufferData(GL_ARRAY_BUFFER, m_bufferedPoints.size() * sizeof(QVector3D), + &m_bufferedPoints.at(0), + GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - m_meshDataLoaded = true; + m_meshDataLoaded = true; + } } QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3