summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2016-02-26 15:19:58 +0200
committerJani Heikkinen <jani.heikkinen@theqtcompany.com>2016-03-01 13:07:10 +0000
commitf4ba2fb9840279f986bd11ab6860e6a3125d9599 (patch)
tree9d5d42d76679788848fcfdb94c6ab695e433476e
parent672ea1cb191f9d386ce32b96102fe638fcae5fba (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.cpp8
-rw-r--r--src/chartsqml2/declarativechartnode.cpp28
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()