'Qt: Qt 6.1.1 Failed to create vertex shader: Error 0x80070057

Guys! I'm a new user of qt and I faced a problem with qml. This issue has already been discussed in this article, but for python. I write in C ++/Qt 6.1.1, QtCreator 4.15.1 for open source. Help me please.

Here is the crux of the problem: qml does not work, Application output writes the following message: "Failed to create vertex shader: Error 0x80070057: ???????? ????? ???????. Failed to build graphics pipeline state ".

The Qt documentation says that this is because of "Scene Graph Adaptations". Here is the link: https://doc-snapshots.qt.io/qt6-dev/qtquick-visualcanvas-adaptations.html.

I tried to use this method from the article in main: QQuickWindow :: setSceneGraphBackend ("QT_QUICK_BACKEND"); For it, you also need to include the library QQuickWindow.

However, Qt gives the following error: Could not create scene graph context for backend 'QT_QUICK_BACKEND' - check that plugins are installed correctly in C: /Qt/6.1.1/mingw81_64/plugins Here I no longer understand what to do ...

I provide the code for clarity. Since in qml it is enough to create a window and include the Rectangle {} in it.

I took the code from the example (tried 3 QtQuick examples). Here is the main function code:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>

int main(int argc, char *argv[])
{
    QQuickWindow::setSceneGraphBackend("QT_QUICK_BACKEND");
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl("qrc:/sidepanel.qml"));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML code:

import QtQuick
import QtQuick.Controls

ApplicationWindow {
    id: window
    width: 360
    height: 520
    visible: true
    title: qsTr("Side Panel")

    //! [orientation]
    readonly property bool inPortrait: window.width < window.height
    //! [orientation]

    ToolBar {
        id: overlayHeader

        z: 1
        width: parent.width
        parent: Overlay.overlay

        Label {
            id: label
            anchors.centerIn: parent
            text: "Qt Quick Controls"
        }
    }

    Drawer {
        id: drawer

        y: overlayHeader.height
        width: window.width / 2
        height: window.height - overlayHeader.height

        modal: inPortrait
        interactive: inPortrait
        position: inPortrait ? 0 : 1
        visible: !inPortrait

        ListView {
            id: listView
            anchors.fill: parent

            headerPositioning: ListView.OverlayHeader
            header: Pane {
                id: header
                z: 2
                width: parent.width

                contentHeight: logo.height

                Image {
                    id: logo
                    width: parent.width
                    source: "images/qt-logo.png"
                    fillMode: implicitWidth > width ? Image.PreserveAspectFit : Image.Pad
                }

                MenuSeparator {
                    parent: header
                    width: parent.width
                    anchors.verticalCenter: parent.bottom
                    visible: !listView.atYBeginning
                }
            }

            footer: ItemDelegate {
                id: footer
                text: qsTr("Footer")
                width: parent.width

                MenuSeparator {
                    parent: footer
                    width: parent.width
                    anchors.verticalCenter: parent.top
                }
            }

            model: 10

            delegate: ItemDelegate {
                text: qsTr("Title %1").arg(index + 1)
                width: listView.width
            }

            ScrollIndicator.vertical: ScrollIndicator { }
        }
    }

    Flickable {
        id: flickable

        anchors.fill: parent
        anchors.topMargin: overlayHeader.height
        anchors.leftMargin: !inPortrait ? drawer.width : undefined

        topMargin: 20
        bottomMargin: 20
        contentHeight: column.height

        Column {
            id: column
            spacing: 20
            anchors.margins: 20
            anchors.left: parent.left
            anchors.right: parent.right

            Label {
                font.pixelSize: 22
                width: parent.width
                elide: Label.ElideRight
                horizontalAlignment: Qt.AlignHCenter
                text: qsTr("Side Panel Example")
            }

            Label {
                width: parent.width
                wrapMode: Label.WordWrap
                text: qsTr("This example demonstrates how Drawer can be used as a non-closable persistent side panel.\n\n" +
                           "When the application is in portrait mode, the drawer is an interactive side panel that can " +
                           "be swiped open from the left edge. When the application is in landscape mode, the drawer " +
                           "and the content are laid out side by side.\n\nThe application is currently in %1 mode.").arg(inPortrait ? qsTr("portrait") : qsTr("landscape"))
            }
        }

        ScrollIndicator.vertical: ScrollIndicator { }
    }
}


Solution 1:[1]

I have just switched from Qt 5.12 to Qt 6.1.2 and also experiencing the same problem as yours. I'm on :

  • Windows x64 (with quite old CPU and so does the graphics)
  • Qt 6.1.2 , targeting desktop for both MSVC and MingW

In the nutshell , the working solution is to set the Qt Quick rendering to software. But how to do it?

Nah, you just got to choose one based on your scenario:

Solution 1: Set the rendering to software permanently at OS env level

pros: you don't have to set the env value every time you create the project.

cons: this will less portable and if you move your project to another machine you might to set it again at the OS Env level.

So, this method works best for development purpose only.

How to do it? Simply set QT_QUICK_BACKEND to software at the system env. On Windows:

  • hit Win+R and type control sysdm.cpl,,3
  • on Environment Variables>System Variables register New... variable named QT_QUICK_BACKEND with value software
  • Restart Qt creator and rebuild. This should make it work without any code modification.

enter image description here

Solution 2: Set the QT_QUICK_BACKEND value on the fly to software

this just the same as solution 1 , but instead of writing to OS Env we just set it on the fly the flag from the code.

This method can be used either for production or development.

How to do it?

  • On your main.cpp simply put qputenv("QT_QUICK_BACKEND","software"); right after the main() declaration.
  • save and rebuild the project
  • Done

Solution 3: Explicitly set scene graph renderer to software

Well I see your code and that's bit miss. Instead of setting the value to QT_QUICK_BACKEND you should set to software instead.

How to do it?

  • on your main.cpp do importing QQuickWindow:

#include <QQuickWindow>

  • next, just after the main() declaration add:

QQuickWindow::setSceneGraphBackend("software");

  • save and rebuild project
  • DONE

enter image description here

it should works now , the window no longer show blank canvas, the QtQuick widgets are showing : enter image description here

Solution 2:[2]

If the software renderer is not a solution, for me in the case of QtQuick3D, setting QSG_RHI_PREFER_SOFTWARE_RENDERER=1 or QT_D3D_ADAPTER_INDEX=1 as environment variables solved the issue.

See also Quick3D fails with software render backend.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Programmer Dancuk
Solution 2 Peter Mortensen