fix: comprehensive boot warnings and exceptions — fixable silenced, unfixable diagnosed

Build system (5 gaps hardened):
- COOKBOOK_OFFLINE defaults to true (fork-mode)
- normalize_patch handles diff -ruN format
- New 'repo validate-patches' command (25/25 relibc patches)
- 14 patched Qt/Wayland/display recipes added to protected list
- relibc archive regenerated with current patch chain

Boot fixes (fixable):
- Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset)
- D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped)
- redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped)
- daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch)
- udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async)
- relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs
- greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait)
- greeter-ui: built and linked (header guard unification, sem_compat stubs removed)
- mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps
- greeter config: removed stale keymapd dependency from display/greeter services
- prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified

Unfixable (diagnosed, upstream):
- i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort
- kded6/greeter-ui: page fault 0x8 — Qt library null deref
- Thread panics fd != -1 — Rust std library on Redox
- DHCP timeout / eth0 MAC — QEMU user-mode networking
- hwrngd/thermald — no hardware RNG/thermal in VM
- live preload allocation — BIOS memory fragmentation, continues on demand
This commit is contained in:
2026-05-05 20:20:37 +01:00
parent a5f97b6632
commit f31522130f
81834 changed files with 11051982 additions and 108 deletions
@@ -0,0 +1,7 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# Generated from texture-sharing.pro.
add_subdirectory(qml-client)
add_subdirectory(custom-compositor)
@@ -0,0 +1,27 @@
This example shows how to use the texture sharing extension, allowing
multiple clients to share the same copy of an image in graphics memory.
The texture sharing extension uses the server buffer extension to transport
graphics buffers. There are different server buffer plugins for different
graphics hardware. This is specified by setting an environment variable for
the compositor process.
-On a device with Mesa and Intel integrated graphics, set:
QT_WAYLAND_SERVER_BUFFER_INTEGRATION=dmabuf-server
-On a device with NVIDIA graphics, set:
QT_WAYLAND_SERVER_BUFFER_INTEGRATION=vulkan-server
'custom-compositor' shows how to write a server that creates shared textures
programmatically.
The file 'minimal-compositor.qml' shows how to add texture sharing to an
existing compositor, using only QML. It is based on the minimal-qml example,
and can be executed with qmlscene.
'qml-client' shows how to use shared textures in a Qt Quick client.
The compositor uses the hardware integration extension to broadcast
the name of the server buffer integration to all clients, so qml-client
can be started like any normal wayland client.
@@ -0,0 +1,28 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
qt_internal_add_manual_test(texture-sharing-custom-compositor
GUI
SOURCES
main.cpp
LIBRARIES
Qt::Qml
Qt::WaylandCompositorPrivate
)
# Resources:
set(compositor_resource_files
"images/background.png"
"images/car.ktx"
"images/qt4.astc"
"images/qt_logo.png"
"qml/main.qml"
)
qt_internal_add_resource(texture-sharing-custom-compositor "compositor"
PREFIX
"/"
FILES
${compositor_resource_files}
)
@@ -0,0 +1,9 @@
<RCC>
<qresource prefix="/">
<file>images/background.png</file>
<file>images/qt_logo.png</file>
<file>images/qt4.astc</file>
<file>images/car.ktx</file>
<file>qml/main.qml</file>
</qresource>
</RCC>
@@ -0,0 +1,17 @@
QT += core gui qml
QT += waylandcompositor-private
SOURCES += \
main.cpp
OTHER_FILES = \
qml/main.qml \
images/background.jpg
RESOURCES += compositor.qrc
TARGET = texture-sharing-custom-compositor
target.path = $$[QT_INSTALL_EXAMPLES]/wayland/texture-sharing/custom-compositor
INSTALLS += target
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,100 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtCore/QUrl>
#include <QtCore/QDebug>
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
#include <QtQml/qqml.h>
#include <QtQml/QQmlEngine>
#include <QtGui/QPainter>
#include <QtGui/QImage>
#include <QtCore/QDateTime>
#include "QtWaylandCompositor/private/qwltexturesharingextension_p.h"
#ifndef GL_RGBA8
#define GL_RGBA8 0x8058
#endif
class CustomSharingExtension : public QWaylandTextureSharingExtension
{
Q_OBJECT
public:
CustomSharingExtension() {qDebug("Instantiating custom texture sharing extension.");}
protected:
bool customPixelData(const QString &key, QByteArray *data, QSize *size, uint *glInternalFormat) override
{
qDebug() << "CustomSharingExtension looking for local texture data for" << key;
if (key.startsWith("unreasonably large ")) {
int w = 10000;
int h = 10000;
int numBytes = w * h * 4;
*data = QByteArray(numBytes, 0);
quint32 *pixels = reinterpret_cast<quint32*>(data->data());
for (int i = 0; i < w*h; ++i)
pixels[i] = 0xff7f1fff;
*glInternalFormat = GL_RGBA8;
*size = QSize(w,h);
return true;
}
QImage img;
if (key == QLatin1String("test pattern 1")) {
img = QImage(128,128,QImage::Format_ARGB32_Premultiplied);
img.fill(QColor(0x55,0x0,0x55,0x01));
{
QPainter p(&img);
QPen pen = p.pen();
pen.setWidthF(3);
pen.setColor(Qt::red);
p.setPen(pen);
p.drawLine(0,0,128,128);
pen.setColor(Qt::green);
p.setPen(pen);
p.drawLine(128,0,0,128);
pen.setColor(Qt::blue);
p.setPen(pen);
p.drawLine(32,16,96,16);
pen.setColor(Qt::black);
p.setPen(pen);
p.translate(64, 64);
p.rotate(45);
p.drawText(QRect(-48, -32, 96, 64),
QDateTime::currentDateTime().toString(),
QTextOption(Qt::AlignHCenter));
}
}
if (!img.isNull()) {
img = img.convertToFormat(QImage::Format_RGBA8888);
*data = QByteArray(reinterpret_cast<const char*>(img.constBits()), img.sizeInBytes());
*size = img.size();
*glInternalFormat = GL_RGBA8;
return true;
}
return false;
}
};
Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(CustomSharingExtension);
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
QGuiApplication app(argc, argv);
QQmlApplicationEngine appEngine;
qmlRegisterType<CustomSharingExtensionQuickExtension>("io.qt.tests.customsharingextension", 1, 0, "CustomSharingExtension");
appEngine.addImageProvider("wlshared", new QWaylandSharedTextureProvider);
appEngine.load(QUrl("qrc:///qml/main.qml"));
return app.exec();
}
#include "main.moc"
@@ -0,0 +1,72 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick.Window
import QtWayland.Compositor
import QtWayland.Compositor.XdgShell
import QtWayland.Compositor.WlShell
import io.qt.tests.customsharingextension
WaylandCompositor {
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: true
Image {
id: background
anchors.fill: parent
fillMode: Image.Tile
source: "qrc:/images/background.png"
smooth: true
Rectangle {
width: 100
height: 100
color: "red"
anchors.bottom: parent.bottom;
anchors.right: parent.right;
MouseArea {
anchors.fill: parent
onClicked: sharedTextureImage.source = "image://wlshared/car.ktx"
}
}
Image {
id: sharedTextureImage
anchors.bottom: parent.bottom;
anchors.right: parent.right;
source: ""
}
Image {
id: topRightImage
anchors.top: parent.top;
anchors.right: parent.right;
source: "image://wlshared/qt_logo.png"
}
}
Repeater {
model: shellSurfaces
ShellSurfaceItem {
shellSurface: modelData
onSurfaceDestroyed: shellSurfaces.remove(index)
}
}
}
}
WlShell {
onWlShellSurfaceCreated:
shellSurfaces.append({shellSurface: shellSurface});
}
XdgShell {
onToplevelCreated:
shellSurfaces.append({shellSurface: xdgSurface});
}
ListModel { id: shellSurfaces }
CustomSharingExtension {
imageSearchPath: ":/images;."
}
}
@@ -0,0 +1,43 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick.Window
import QtWayland.Compositor
import QtWayland.Compositor.XdgShell
import QtWayland.Compositor.WlShell
// importing the texture sharing extension:
import QtWayland.Compositor.TextureSharingExtension
WaylandCompositor {
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: true
Repeater {
model: shellSurfaces
ShellSurfaceItem {
shellSurface: modelData
onSurfaceDestroyed: shellSurfaces.remove(index)
}
}
}
}
WlShell {
onWlShellSurfaceCreated:
shellSurfaces.append({shellSurface: shellSurface});
}
XdgShell {
onToplevelCreated:
shellSurfaces.append({shellSurface: xdgSurface});
}
ListModel { id: shellSurfaces }
// instantiating the texture sharing extension:
TextureSharingExtension {
imageSearchPath: ".;/tmp;/usr/share/pixmaps"
}
}
@@ -0,0 +1,22 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
qt_internal_add_manual_test(qml-client
GUI
SOURCES
main.cpp
LIBRARIES
Qt::Quick
)
# Resources:
set(qml-client_resource_files
"main.qml"
)
qt_internal_add_resource(qml-client "qml-client"
PREFIX
"/"
FILES
${qml-client_resource_files}
)
@@ -0,0 +1,21 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QGuiApplication>
#include <QtQuick/QQuickView>
#include <QStandardPaths>
#include <QFileInfo>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QDir>
#include <QTimer>
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine appEngine;
appEngine.load(QUrl("qrc:///main.qml"));
return app.exec();
}
@@ -0,0 +1,201 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick.Window
import QtWayland.Client.TextureSharing
Window {
width: 800
height: 500
visible: true
Rectangle {
anchors.fill: parent
color: "#C0FEFE"
Flickable {
anchors.fill: parent
contentHeight: imageGrid.height
Grid {
id: imageGrid
columns: 2
width: parent.width
spacing: 25
padding: 25
// loadedImage
Text {
width: 400
wrapMode: Text.Wrap
text: "An Image element using the shared buffer provider to load from a PNG image.<br>" +
"Source: '" + loadedImage.source + "'" +
(loadedImage.sourceSize.height <= 0 ? "<font color=\"#FF0000\"><br>[Image not loaded]</font>" : "")
}
Image {
id: loadedImage
fillMode: Image.PreserveAspectFit
source: "image://wlshared/qt_logo.png"
}
Rectangle {
visible: loadedImage.height <= 0
width:100; height: 100
color: "green"
}
// paintedImage
Text {
width: 400
wrapMode: Text.Wrap
text: "An Image element using the shared buffer provider.<br>" +
"This texture is created by the compositor using QPainter. <br>" +
"Source: '" + paintedImage.source + "'" +
(paintedImage.sourceSize.height <= 0 ? "<font color=\"#FF0000\"><br>[Image not loaded]</font>" : "")
}
Image {
id: paintedImage
fillMode: Image.PreserveAspectFit
source: "image://wlshared/test pattern 1"
}
Rectangle {
visible: paintedImage.height <= 0
width:100; height: 100
color: "green"
}
// ktxImage
Text {
width: 400
wrapMode: Text.Wrap
text: "An Image element using the shared buffer provider to load an ETC2 compressed texture." +
"<br>Source: '" + ktxImage.source + "'" +
(ktxImage.sourceSize.height <= 0 ? "<font color=\"#FF0000\"><br>[Image not loaded]</font>" : "")
}
Image {
id: ktxImage
source: "image://wlshared/car.ktx"
fillMode: Image.PreserveAspectFit
}
Rectangle {
visible: ktxImage.height <= 0
width:100; height: 100
color: "green"
}
//astcImage
Text {
width: 400
wrapMode: Text.Wrap
text: "An Image element using the shared buffer provider to load an ASTC compressed texture." +
"<br>Source: '" + astcImage.source + "'" +
(astcImage.sourceSize.height <= 0 ? "<font color=\"#FF0000\"><br>[Image not loaded]</font>" : "")
}
Image {
id: astcImage
source: "image://wlshared/qt4.astc"
fillMode: Image.PreserveAspectFit
}
Rectangle {
visible: astcImage.height <= 0
width:100; height: 100
color: "green"
}
// dynamicImage
Column {
Text {
width: 400
wrapMode: Text.Wrap
text: "An Image element using the shared buffer provider." +
"<br>Source: '" + dynamicImage.source + "'" +
(dynamicImage.sourceSize.height <= 0 ? "<font color=\"#FF0000\"><br>[Image not loaded]</font>" : "")
}
Row {
spacing: 10
Text {
text: "Enter filename:"
}
Rectangle {
color: "white"
width: sourceEdit.contentWidth + 30
height: sourceEdit.contentHeight
TextInput {
id: sourceEdit
anchors.fill: parent
horizontalAlignment: TextInput.AlignHCenter
onEditingFinished: dynamicImage.source = text ? "image://wlshared/" + text : ""
}
}
}
}
Image {
id: dynamicImage
fillMode: Image.PreserveAspectFit
}
Rectangle {
visible: dynamicImage.height <= 0
width:100; height: 100
color: "green"
}
// largeImage
Text {
width: 400
wrapMode: Text.Wrap
text: "An Image element using the shared buffer provider.<br>" +
"Left click to load a very large image. " +
"Right click to unload the image, potentially freeing graphics memory on the server-side " +
"if no other client is using the image." +
"<br>Source: '" + largeImage.source + "'" +
"<br>Size: " + largeImage.sourceSize +
(largeImage.sourceSize.height <= 0 ? "<font color=\"#FF0000\"><br>[Image not loaded]</font>" : "")
}
Rectangle {
width: 200
height: 200
border.color: "black"
border.width: 2
color: "transparent"
Image {
id: largeImage
anchors.fill: parent
fillMode: Image.PreserveAspectFit
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
if (mouse.button == Qt.LeftButton)
largeImage.source = "image://wlshared/unreasonably large image"
else
largeImage.source = ""
}
}
}
} // Grid
}
Rectangle {
color: "gray"
width: parent.width
height: 20
anchors.bottom: parent.bottom
Text {
color: "white"
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: "Scroll or drag for more"
}
}
}
}
@@ -0,0 +1,13 @@
QT += quick
SOURCES += \
main.cpp
RESOURCES += \
qml-client.qrc
DISTFILES += \
main.qml
target.path = $$[QT_INSTALL_EXAMPLES]/wayland/texture-sharing/qml-client
INSTALLS += target
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>
@@ -0,0 +1,5 @@
TEMPLATE=subdirs
SUBDIRS += \
qml-client \
custom-compositor