diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2016-02-26 15:19:58 +0200 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@theqtcompany.com> | 2016-03-01 13:07:10 +0000 |
commit | f4ba2fb9840279f986bd11ab6860e6a3125d9599 (patch) | |
tree | 9d5d42d76679788848fcfdb94c6ab695e433476e | |
parent | 672ea1cb191f9d386ce32b96102fe638fcae5fba (diff) |
Fix crash when using linuxfb and 2D rendererrelease-2.1.0
No longer should call any OpenGL functions on QML charts applications
if we don't have a valid OpenGL context.
Task-number: QTBUG-51387
Change-Id: Ic393f69921e300f19dc42c83fc07677ce7869273
Reviewed-by: Mika Salmela <mika.salmela@theqtcompany.com>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>
-rw-r--r-- | src/chartsqml2/declarativechart.cpp | 8 | ||||
-rw-r--r-- | src/chartsqml2/declarativechartnode.cpp | 28 |
2 files changed, 19 insertions, 17 deletions
diff --git a/src/chartsqml2/declarativechart.cpp b/src/chartsqml2/declarativechart.cpp index ab0a612b..abff6836 100644 --- a/src/chartsqml2/declarativechart.cpp +++ b/src/chartsqml2/declarativechart.cpp @@ -512,14 +512,16 @@ QSGNode *DeclarativeChart::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdateP if (!node) { node = new DeclarativeChartNode(window()); - connect(window(), &QQuickWindow::beforeRendering, - node->glRenderNode(), &DeclarativeRenderNode::render); + if (node->glRenderNode()) { + connect(window(), &QQuickWindow::beforeRendering, + node->glRenderNode(), &DeclarativeRenderNode::render); + } } const QRectF &bRect = boundingRect(); // Update GL data - if (m_glXYDataManager->dataMap().size() || m_glXYDataManager->mapDirty()) { + if (node->glRenderNode() && (m_glXYDataManager->dataMap().size() || m_glXYDataManager->mapDirty())) { const QRectF &plotArea = m_chart->plotArea(); const QSizeF &chartAreaSize = m_chart->size(); diff --git a/src/chartsqml2/declarativechartnode.cpp b/src/chartsqml2/declarativechartnode.cpp index 7b89c032..7d423b25 100644 --- a/src/chartsqml2/declarativechartnode.cpp +++ b/src/chartsqml2/declarativechartnode.cpp @@ -39,27 +39,27 @@ DeclarativeChartNode::DeclarativeChartNode(QQuickWindow *window) : m_textureSize(1, 1), m_glRenderNode(0) { - initializeOpenGLFunctions(); - // Our texture node must have a texture, so use a default one pixel texture - GLuint defaultTexture = 0; - glGenTextures(1, &defaultTexture); - glBindTexture(GL_TEXTURE_2D, defaultTexture); - uchar buf[4] = { 0, 0, 0, 0 }; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &buf); - + QImage dummyImage(QSize(1, 1), QImage::Format_ARGB32); + uchar *imageData = dummyImage.bits(); + imageData[0] = 0; + imageData[1] = 0; + imageData[2] = 0; + imageData[3] = 0; QQuickWindow::CreateTextureOptions defaultTextureOptions = QQuickWindow::CreateTextureOptions( QQuickWindow::TextureHasAlphaChannel | QQuickWindow::TextureOwnsGLTexture); - m_texture = m_window->createTextureFromId(defaultTexture, QSize(1, 1), defaultTextureOptions); + m_texture = m_window->createTextureFromImage(dummyImage, defaultTextureOptions); setTexture(m_texture); setFiltering(QSGTexture::Linear); - // Create child node for rendering GL graphics - m_glRenderNode = new DeclarativeRenderNode(m_window); - m_glRenderNode->setFlag(OwnedByParent); - appendChildNode(m_glRenderNode); - m_glRenderNode->setRect(0, 0, 0, 0); // Hide child node by default + if (QOpenGLContext::currentContext()) { + // Create child node for rendering GL graphics + m_glRenderNode = new DeclarativeRenderNode(m_window); + m_glRenderNode->setFlag(OwnedByParent); + appendChildNode(m_glRenderNode); + m_glRenderNode->setRect(0, 0, 0, 0); // Hide child node by default + } } DeclarativeChartNode::~DeclarativeChartNode() |