我已经非常小心地禁用了我的 Qt 应用程序中的 ANGLE 层,但显然它没有发生。当我在 CodeXL 调试器中运行应用程序时,事件日志包含如下行:
加载的 DLL:C:\Windows\SysWOW64\d3d11.dll
所以它正在加载 Direct3D,我认为这在 Qt 中只能通过 ANGLE 发生。在 CodeXL 中点击“Break”按钮也无济于事,这对我来说意味着没有发生真正的 OpenGL 调用,它们仅被转换为 D3D。
事件日志还说:
调试字符串:加载 opengl32.dll 失败(找不到指定的模块。)
为什么会发生这种情况,我该如何解决?
我想禁用 ANGLE 的原因是因为否则我无法使用 CodeXL 进行调试(它不支持 D3D 调试)。
我的系统:
- 视窗 10
- 第一个 GPU:Intel HD Graphics 5500
- 第二个 GPU:AMD Radeon R5 M330(我认为这是我的应用程序使用的)
我的代码:
主.cpp:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickFramebufferObject>
#include <QOpenGLShaderProgram>
#include <QOpenGLFramebufferObject>
#include <QQuickWindow>
class MyItem : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer* createRenderer() const;
};
class MyItemRenderer : public QQuickFramebufferObject::Renderer {
public:
void render() {
update();
}
QOpenGLFramebufferObject* createFramebufferObject(const QSize &size) {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
return new QOpenGLFramebufferObject(size, format);
}
};
QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
return new MyItemRenderer();
}
int main(int argc, char **argv) {
qputenv("QT_OPENGL_BUGLIST", "Z:/disable_angle.txt");
QGuiApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
QGuiApplication app(argc, argv);
qmlRegisterType<MyItem>("MyItem", 1, 0, "MyItem");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
#include "main.moc"
main.qml:
import QtQuick 2.0
import MyItem 1.0
import QtQuick.Window 2.2
Window {
visible: true
width: 400
height: 400
MyItem {
anchors.fill: parent
}
}
Z:/disable_angle.txt :
{
"entries": [
{
"id": 1,
"description": "Disable angle",
"os": {
"type": "win"
},
"features": [
"disable_angle"
]
}
]
}