0

我正在尝试使用此处找到的示例创建一个非常简单的 Wayland 合成器,如下所示:

import QtQuick 2.12
import QtQuick.Window 2.2
import QtWayland.Compositor 1.3

WaylandCompositor {
    id: wlcompositor
    WaylandOutput {
        compositor: wlcompositor
        window: Window {
            width: 800
            height: 480
            visible: true
            title: wlcompositor.socketName
            Grid {
                anchors.fill: parent
                anchors.margins: 100
                columns: 2
                Repeater {
                    model: shellSurfaces
                    ShellSurfaceItem {
                        id: shellSurfaceItem
                        autoCreatePopupItems: true
                        shellSurface: modelData
                        onSurfaceDestroyed: shellSurfaces.remove(index)
                    }
                }
            }
        }
    }
    ListModel { id: shellSurfaces }

    XdgShell {
        onToplevelCreated: shellSurfaces.append({shellSurface: xdgSurface})
    }
}

然后我正在创建一个单独的客户端应用程序,它只创建几个矩形作为测试。

import QtQuick 2.12
import QtQuick.Window 2.12

Window
{
    id: window
    visible: true
    width: 200
    height: 200

    Rectangle
    {
        anchors.fill: parent
        color: "green"

        Rectangle
        {
            x: 10
            y: 10
            width: 100
            height: 100
            color: "blue"
        }
    }
}

一切似乎都简单明了。但是当我在我的 Pi4 上运行它(使用-platform wayland标志)时,客户端会出现疯狂的失真,如下所示: 截屏

我正在使用 Boot2Qt 对其进行测试,它是一个 yocto linux 映像。我已经尝试过 Qt 版本 5.14.2 和最新的 5.15.0,结果相同。控制台上没有错误。除了看起来很糟糕之外,没有任何迹象表明有任何问题。

我确实注意到,如果我使用 weston 而不是 QtWayland 作为我的合成器,那么该应用程序看起来很完美。所以这让我觉得 WaylandCompositor 有问题。但是我在谷歌上的搜索发现没有其他人抱怨同样的事情。

我什至不知道该尝试什么。有人有什么想法吗?

4

3 回答 3

2

我在 pi 4 上使用带有 qt wayland 的 qt 5.15.1 和 qt 5.15.2 也有类似的效果。通过使用以下选项编译 mesa 驱动程序 20.3.3 和 20.3.4,我设法让 QT Wayland 无失真地工作:
-Dplatforms=x11,wayland -Dvulkan-drivers=broadcom -Ddri-drivers= -Dgallium-drivers=kmsro,v3d,vc4 -Dbuildtype=release -Dprefix=/usr -Degl=true

安装驱动程序后,我更新了主机上的 sysroot 并交叉编译了 QT Lib。这使它终于起作用了。祝你好运。

于 2021-02-23T21:04:00.057 回答
1

从 Qt 5.12 到 5.15 和 Qt 6.2.0 RC,我遇到了同样的问题。

避免失真的解决方案是dma-buf在 QtWayland 中启用,并从合成器端设置硬件集成:

export QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=linux-dmabuf-unstable-v1
export QT_WAYLAND_SERVER_BUFFER_INTEGRATION=dmabuf-server 

请注意,为了启用dma-buf它,我需要调整.proconfigure.json文件(我在 Pi4 上进行本地构建),因为libdrm-devqmake 或 cmake 无法正确检测到标头。

添加INCLUDEPATH += /usr/include/libdrm/到以下两个:

./src/plugins/hardwareintegration/client/dmabuf-server/dmabuf-server.pro
./src/plugins/hardwareintegration/compositor/dmabuf-server/dmabuf-server.pro

libdrm/在以下文件中的 drm 标头之前添加:

./src/client/configure.json
./src/compositor/configure.json

重新配置和重建应该可以工作。使用覆盖在 Pi4 + Qt 5.15.2 上使用 armhf 和 arm64 图像进行测试dtoverlay=vc4-kms-v3d-pi4

于 2021-09-22T15:43:11.397 回答
0

如果我没记错的话,在 Wayland 支持方面,闭源图形驱动程序真的很痛苦。QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=brcm通过在启动合成器之前进行设置,为 qt wayland 启用 Broadcom 后端(我认为它适合 rpi)可能会带来一些运气。

在这个自述文件中有一些关于这个环境变量的信息:https ://code.qt.io/cgit/qt/qtwayland.git/tree/README

但如果实际上可能的话,我认为 mesa 开源驱动程序会给你带来更少的痛苦,因为它的使用范围更广,支持也可能更好。

于 2021-04-07T09:56:08.463 回答