OpenGL Core Profile 下的 QML 标签崩溃 App

Posted

技术标签:

【中文标题】OpenGL Core Profile 下的 QML 标签崩溃 App【英文标题】:QML Label Crashes App under OpenGL Core Profile 【发布时间】:2014-09-19 15:26:35 【问题描述】:

从一个新的 QtQuick2 项目开始,使用 Ubuntu 12.04 和 Mac OSX。我在 Qt 5.3.1 和 5.3.2 上试过这个。

我使用此代码创建一个设置为 OpenGL 4.1 Core Profile 的 QQuickView

QApplication app(argc, argv);

QQuickView * m_pMainView = new QQuickView;

QSurfaceFormat f;
f.setProfile(QSurfaceFormat::CoreProfile);
f.setVersion(4, 1);
m_pMainView->setFormat(f);

m_pMainView->setSource(QUrl("qrc:///main.qml"));

m_pMainView->show();

return app.exec();

我的 QML 很简单。

import QtQuick 2.3
import QtQuick.Controls 1.2

Rectangle 
    visible: true

    height: 800
    width: 600

    Label 
        text: "Test"
    

运行此命令会导致应用立即出现段错误。将 QML 中的 Label 控件切换为 Text 控件,没有崩溃。按预期运行。将 QSurfaceFormat 切换到适用的兼容性配置文件(Ubuntu 上为 3.3 / Mac 上为 2.1),不会崩溃。按预期运行。

我在更改 OpenGL 版本方面做错了什么,还是 Qt 5.3 在核心配置文件中不稳定到无法接受?

如果有用,这里是来自 Mac 的堆栈跟踪:

    Thread 6 Crashed:: QSGRenderThread
0   QtGui                           0x0000000101cd41a7 QOpenGLContextPrivate::maxTextureSize() + 343
1   QtGui                           0x0000000101f33907 QOpenGLTextureGlyphCache::maxTextureHeight() const + 39
2   QtGui                           0x0000000101ec4137 QTextureGlyphCache::populate(QFontEngine*, int, unsigned int const*, QFixedPoint const*) + 1687
3   QtQuick                         0x0000000100d488f0 QSGTextMaskMaterial::populate(QPointF const&, QVector<unsigned int> const&, QVector<QPointF> const&, QSGGeometry*, QRectF*, QPointF*, QMargins const&) + 432
4   QtQuick                         0x0000000100d473fd QSGDefaultGlyphNode::update() + 797
5   QtQuick                         0x0000000100dc7632 QQuickTextNode::addGlyphs(QPointF const&, QGlyphRun const&, QColor const&, QQuickText::TextStyle, QColor const&, QSGNode*) + 482
6   QtQuick                         0x0000000100dcbc61 QQuickTextNodeEngine::addToSceneGraph(QQuickTextNode*, QQuickText::TextStyle, QColor const&) + 2049
7   QtQuick                         0x0000000100dc7fbd QQuickTextNode::addTextLayout(QPointF const&, QTextLayout*, QColor const&, QQuickText::TextStyle, QColor const&, QColor const&, QColor const&, QColor const&, int, int, int, int) + 557
8   QtQuick                         0x0000000100dc5368 QQuickText::updatePaintNode(QSGNode*, QQuickItem::UpdatePaintNodeData*) + 1000
9   QtQuick                         0x0000000100d88995 QQuickWindowPrivate::updateDirtyNode(QQuickItem*) + 3317
10  QtQuick                         0x0000000100d7fdb2 QQuickWindowPrivate::syncSceneGraph() + 306
11  QtQuick                         0x0000000100d5d388 QSGRenderThread::sync() + 120
12  QtQuick                         0x0000000100d5d475 QSGRenderThread::syncAndRender() + 117
13  QtQuick                         0x0000000100d5d968 QSGRenderThread::run() + 200
14  QtCore                          0x00000001016923f2 QThreadPrivate::start(void*) + 338
15  libsystem_pthread.dylib         0x00007fff94d23899 _pthread_body + 138
16  libsystem_pthread.dylib         0x00007fff94d2372a _pthread_start + 137
17  libsystem_pthread.dylib         0x00007fff94d27fc9 thread_start + 13

【问题讨论】:

以类似的方式,在同一 main.cpp / main.qml 组合下对 png 文件应用不透明蒙版会产生一串片段着色器错误并且没有渲染,同时切换回兼容性配置文件工作正常。 有没有机会将其粘贴为一堆难以阅读的 cmets,您实际上可以只编辑您的问题以包含跟踪? 您的图形硬件是否支持 OGLv4.1? 是的,我的两台机器上的硬件都支持 4.1。值得注意的是,我在 3.3 Core 上得到了完全相同的结果。我已经用堆栈跟踪更新了这个问题。 另外,如果我将自定义 openGL 小部件添加到工作版本(带有文本而不是标签的小部件)并打印我的 opengl 上下文的版本,它会输出预期/请求的版本。 【参考方案1】:

尽管 Qt 团队的一些成员表示 Qt 5.2 及更高版本与核心配置文件兼容,但实际情况是 Qt Controls 直到 5.4 才能工作。这是错误:

https://bugreports.qt.io/browse/QTBUG-38817

【讨论】:

以上是关于OpenGL Core Profile 下的 QML 标签崩溃 App的主要内容,如果未能解决你的问题,请参考以下文章

使用 GLUT_3_2_CORE_PROFILE 时出现 OpenGL 错误 1282(无效操作)

OpenGL学习之路——窗口

LearnOpenGL 笔记 - 入门 01 OpenGL

glfwCreateWindow返回NULL问题

glfwCreateWindow返回NULL问题

OS X 上的 OpenGL 版本支持