0

我已经非常小心地禁用了我的 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"
          ]
        }
    ]
}
4

2 回答 2

0

如果要完全禁用 Angle,则应设置应用程序属性Qt::AA_UseDesktopOpenGL。如果这还不够,链接到 OpenGL32.lib 可能会有所帮助。

于 2017-03-14T11:44:22.623 回答
0
  1. 将 QT_LOGGING_RULES 环境变量设置为“qt.qpa.gl=true”。因此,您将看到一些额外的调试输出,这将有助于理解 Qt 究竟选择了什么(opengl/angle/software)。

  2. 尝试将 Z:/disable_angle.txt 更改为 Z:\disable_angle.txt 注意反斜杠 :) 它是 Windows,所以这可能是罪魁祸首。

  3. 除了 disable_angle(你的配置对我来说似乎是正确的)之外,还尝试设置 disable_d3d11 和 disable_d3d9。

    “disable_angle”、“disable_d3d11”、“disable_d3d9”

于 2017-02-01T12:44:31.033 回答