From 7d6b144818774573e07edbd652ad2209377046b3 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 13 Feb 2023 08:10:29 +0100 Subject: Move server-buffer example to manual tests This is undocumented and demonstrates an experimental feature which was never maintained or exercised. It's a nice feature, so we keep the example around for when we get the time to bring it back. Task-number: QTBUG-110993 Change-Id: I045cb2ef02a50017a26226c493607100ea0f1b95 Reviewed-by: Inho Lee (cherry picked from commit acb68bd3bbbc0001bcf460dd175ff92cc3ce594a) Reviewed-by: Qt Cherry-pick Bot --- examples/wayland/CMakeLists.txt | 3 - examples/wayland/server-buffer/CMakeLists.txt | 5 -- examples/wayland/server-buffer/README | 32 -------- .../server-buffer/compositor/CMakeLists.txt | 57 ------------- .../server-buffer/compositor/compositor.pro | 26 ------ .../server-buffer/compositor/compositor.qrc | 7 -- .../images/Siberischer_tiger_de_edit02.jpg | Bin 21801 -> 0 bytes .../images/Siberischer_tiger_de_edit02.txt | 5 -- .../server-buffer/compositor/images/background.png | Bin 9528 -> 0 bytes examples/wayland/server-buffer/compositor/main.cpp | 29 ------- .../wayland/server-buffer/compositor/qml/main.qml | 43 ---------- .../compositor/sharebufferextension.cpp | 86 -------------------- .../compositor/sharebufferextension.h | 53 ------------- .../server-buffer/cpp-client/CMakeLists.txt | 44 ----------- .../server-buffer/cpp-client/cpp-client.pro | 15 ---- examples/wayland/server-buffer/cpp-client/main.cpp | 88 --------------------- .../cpp-client/sharebufferextension.cpp | 36 --------- .../cpp-client/sharebufferextension.h | 36 --------- examples/wayland/server-buffer/server-buffer.pro | 6 -- examples/wayland/server-buffer/share-buffer.xml | 13 --- examples/wayland/wayland.pro | 5 -- tests/manual/CMakeLists.txt | 4 + tests/manual/server-buffer/CMakeLists.txt | 5 ++ tests/manual/server-buffer/README | 32 ++++++++ .../manual/server-buffer/compositor/CMakeLists.txt | 57 +++++++++++++ .../manual/server-buffer/compositor/compositor.pro | 26 ++++++ .../manual/server-buffer/compositor/compositor.qrc | 7 ++ .../images/Siberischer_tiger_de_edit02.jpg | Bin 0 -> 21801 bytes .../images/Siberischer_tiger_de_edit02.txt | 5 ++ .../server-buffer/compositor/images/background.png | Bin 0 -> 9528 bytes tests/manual/server-buffer/compositor/main.cpp | 29 +++++++ tests/manual/server-buffer/compositor/qml/main.qml | 43 ++++++++++ .../compositor/sharebufferextension.cpp | 86 ++++++++++++++++++++ .../compositor/sharebufferextension.h | 53 +++++++++++++ .../manual/server-buffer/cpp-client/CMakeLists.txt | 44 +++++++++++ .../manual/server-buffer/cpp-client/cpp-client.pro | 15 ++++ tests/manual/server-buffer/cpp-client/main.cpp | 88 +++++++++++++++++++++ .../cpp-client/sharebufferextension.cpp | 36 +++++++++ .../cpp-client/sharebufferextension.h | 36 +++++++++ tests/manual/server-buffer/server-buffer.pro | 6 ++ tests/manual/server-buffer/share-buffer.xml | 13 +++ 41 files changed, 585 insertions(+), 589 deletions(-) delete mode 100644 examples/wayland/server-buffer/CMakeLists.txt delete mode 100644 examples/wayland/server-buffer/README delete mode 100644 examples/wayland/server-buffer/compositor/CMakeLists.txt delete mode 100644 examples/wayland/server-buffer/compositor/compositor.pro delete mode 100644 examples/wayland/server-buffer/compositor/compositor.qrc delete mode 100644 examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg delete mode 100644 examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt delete mode 100644 examples/wayland/server-buffer/compositor/images/background.png delete mode 100644 examples/wayland/server-buffer/compositor/main.cpp delete mode 100644 examples/wayland/server-buffer/compositor/qml/main.qml delete mode 100644 examples/wayland/server-buffer/compositor/sharebufferextension.cpp delete mode 100644 examples/wayland/server-buffer/compositor/sharebufferextension.h delete mode 100644 examples/wayland/server-buffer/cpp-client/CMakeLists.txt delete mode 100644 examples/wayland/server-buffer/cpp-client/cpp-client.pro delete mode 100644 examples/wayland/server-buffer/cpp-client/main.cpp delete mode 100644 examples/wayland/server-buffer/cpp-client/sharebufferextension.cpp delete mode 100644 examples/wayland/server-buffer/cpp-client/sharebufferextension.h delete mode 100644 examples/wayland/server-buffer/server-buffer.pro delete mode 100644 examples/wayland/server-buffer/share-buffer.xml create mode 100644 tests/manual/server-buffer/CMakeLists.txt create mode 100644 tests/manual/server-buffer/README create mode 100644 tests/manual/server-buffer/compositor/CMakeLists.txt create mode 100644 tests/manual/server-buffer/compositor/compositor.pro create mode 100644 tests/manual/server-buffer/compositor/compositor.qrc create mode 100644 tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg create mode 100644 tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt create mode 100644 tests/manual/server-buffer/compositor/images/background.png create mode 100644 tests/manual/server-buffer/compositor/main.cpp create mode 100644 tests/manual/server-buffer/compositor/qml/main.qml create mode 100644 tests/manual/server-buffer/compositor/sharebufferextension.cpp create mode 100644 tests/manual/server-buffer/compositor/sharebufferextension.h create mode 100644 tests/manual/server-buffer/cpp-client/CMakeLists.txt create mode 100644 tests/manual/server-buffer/cpp-client/cpp-client.pro create mode 100644 tests/manual/server-buffer/cpp-client/main.cpp create mode 100644 tests/manual/server-buffer/cpp-client/sharebufferextension.cpp create mode 100644 tests/manual/server-buffer/cpp-client/sharebufferextension.h create mode 100644 tests/manual/server-buffer/server-buffer.pro create mode 100644 tests/manual/server-buffer/share-buffer.xml diff --git a/examples/wayland/CMakeLists.txt b/examples/wayland/CMakeLists.txt index 2783d7a9..93d7efa9 100644 --- a/examples/wayland/CMakeLists.txt +++ b/examples/wayland/CMakeLists.txt @@ -21,7 +21,4 @@ if(TARGET Qt::Quick AND TARGET Qt::WaylandClient) qt_internal_add_example(custom-extension) qt_internal_add_example(custom-shell) endif() -if(QT_FEATURE_opengl AND TARGET Qt::Quick AND TARGET Qt::WaylandClient) - qt_internal_add_example(server-buffer) -endif() endif() diff --git a/examples/wayland/server-buffer/CMakeLists.txt b/examples/wayland/server-buffer/CMakeLists.txt deleted file mode 100644 index 973063c7..00000000 --- a/examples/wayland/server-buffer/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(server-buffer) - -add_subdirectory(cpp-client) -add_subdirectory(compositor) diff --git a/examples/wayland/server-buffer/README b/examples/wayland/server-buffer/README deleted file mode 100644 index da20b0f5..00000000 --- a/examples/wayland/server-buffer/README +++ /dev/null @@ -1,32 +0,0 @@ -This example shows how to use the low-level server buffer extension. This -version of Qt also provides a texture sharing extension that provides more -functionality and convenience for sharing graphical assets with Qt Quick -clients: see the texture-sharing example. - -Compile up both compositor and client. - -If you have the dmabuf-server buffer integration (and you are running Mesa) -then start the compositor with: - -$ QT_WAYLAND_SERVER_BUFFER_INTEGRATION=dmabuf-server ./compositor - - -Note: if you are running a compositor on an X11 desktop, you also need to -set QT_XCB_GL_INTEGRATION=xcb_egl as usual. - -The compositor broadcasts the name of the server buffer integration to -all clients through the hardware integration extension. Therefore, -all you need to do is to start the client with - -$ ./cpp-client -platform wayland - -The client will show all the buffers shared by the compositor. - -For testing on desktop, there is also a shared memory based server buffer -integration that works with any graphics hardware: - -$ QT_WAYLAND_SERVER_BUFFER_INTEGRATION=shm-emulation-server QT_XCB_GL_INTEGRATION=xcb_egl ./compositor - -Note: the shm-emulation-server integration does not actually share graphics -buffers, so it will not give any graphics memory savings. It is intended solely -for testing during development and should never be used in production. diff --git a/examples/wayland/server-buffer/compositor/CMakeLists.txt b/examples/wayland/server-buffer/compositor/CMakeLists.txt deleted file mode 100644 index 5f4fb0c5..00000000 --- a/examples/wayland/server-buffer/compositor/CMakeLists.txt +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(compositor) - -set(CMAKE_AUTOMOC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/server-buffer/compositor") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml WaylandCompositor) - -qt_add_executable(compositor - main.cpp - sharebufferextension.cpp sharebufferextension.h -) - -qt6_generate_wayland_protocol_server_sources(compositor - FILES - ${CMAKE_CURRENT_SOURCE_DIR}/../share-buffer.xml -) - -set_target_properties(compositor PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(compositor PUBLIC - Qt::Core - Qt::Gui - Qt::Qml - Qt::WaylandCompositorPrivate -) - -# Resources: -set(compositor_resource_files - "images/Siberischer_tiger_de_edit02.jpg" - "images/background.png" - "qml/main.qml" -) - -qt6_add_resources(compositor "compositor" - PREFIX - "/" - FILES - ${compositor_resource_files} -) - -install(TARGETS compositor - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/wayland/server-buffer/compositor/compositor.pro b/examples/wayland/server-buffer/compositor/compositor.pro deleted file mode 100644 index 26334c63..00000000 --- a/examples/wayland/server-buffer/compositor/compositor.pro +++ /dev/null @@ -1,26 +0,0 @@ -QT += core gui qml - -QT += waylandcompositor-private - -CONFIG += wayland-scanner -CONFIG += c++11 -SOURCES += \ - main.cpp \ - sharebufferextension.cpp - -OTHER_FILES = \ - qml/main.qml \ - images/background.jpg - -WAYLANDSERVERSOURCES += \ - ../share-buffer.xml - -RESOURCES += compositor.qrc - -TARGET = compositor - -HEADERS += \ - sharebufferextension.h - -target.path = $$[QT_INSTALL_EXAMPLES]/wayland/server-buffer/compositor -INSTALLS += target diff --git a/examples/wayland/server-buffer/compositor/compositor.qrc b/examples/wayland/server-buffer/compositor/compositor.qrc deleted file mode 100644 index b50594b5..00000000 --- a/examples/wayland/server-buffer/compositor/compositor.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - images/background.png - images/Siberischer_tiger_de_edit02.jpg - qml/main.qml - - diff --git a/examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg b/examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg deleted file mode 100644 index eb1b73f8..00000000 Binary files a/examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg and /dev/null differ diff --git a/examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt b/examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt deleted file mode 100644 index 3a26c00d..00000000 --- a/examples/wayland/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt +++ /dev/null @@ -1,5 +0,0 @@ -Image from https://en.wikipedia.org/wiki/File:Siberischer_tiger_de_edit02.jpg - -Author: S. Taheri, edited by Fir0002 - -License: Creative Commons Attribution-Share Alike 2.5 Generic diff --git a/examples/wayland/server-buffer/compositor/images/background.png b/examples/wayland/server-buffer/compositor/images/background.png deleted file mode 100644 index 292160cd..00000000 Binary files a/examples/wayland/server-buffer/compositor/images/background.png and /dev/null differ diff --git a/examples/wayland/server-buffer/compositor/main.cpp b/examples/wayland/server-buffer/compositor/main.cpp deleted file mode 100644 index 3c33620c..00000000 --- a/examples/wayland/server-buffer/compositor/main.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include -#include -#include -#include - -#include -#include - -#include "sharebufferextension.h" - -static void registerTypes() -{ - qmlRegisterType("io.qt.examples.sharebufferextension", 1, 0, "ShareBufferExtension"); -} - -int main(int argc, char *argv[]) -{ - // Make sure there is a valid OpenGL context in the main thread - qputenv("QSG_RENDER_LOOP", "basic"); - - QGuiApplication app(argc, argv); - registerTypes(); - QQmlApplicationEngine appEngine(QUrl("qrc:///qml/main.qml")); - - return app.exec(); -} diff --git a/examples/wayland/server-buffer/compositor/qml/main.qml b/examples/wayland/server-buffer/compositor/qml/main.qml deleted file mode 100644 index 484a9563..00000000 --- a/examples/wayland/server-buffer/compositor/qml/main.qml +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -import QtQuick -import QtWayland.Compositor -import QtWayland.Compositor.WlShell -import QtQuick.Window - -import io.qt.examples.sharebufferextension - -WaylandCompositor { - WaylandOutput { - sizeFollowsWindow: true - window: Window { - width: 1024 - height: 768 - visible: true - Image { - id: surfaceArea - anchors.fill: parent - fillMode: Image.Tile - source: "qrc:/images/background.png" - smooth: false - } - } - } - - Component { - id: chromeComponent - ShellSurfaceItem { - onSurfaceDestroyed: destroy() - } - } - - WlShell { - onWlShellSurfaceCreated: (shellSurface) => { - chromeComponent.createObject(surfaceArea, { "shellSurface": shellSurface } ); - } - } - - ShareBufferExtension { - } -} diff --git a/examples/wayland/server-buffer/compositor/sharebufferextension.cpp b/examples/wayland/server-buffer/compositor/sharebufferextension.cpp deleted file mode 100644 index b1b499ff..00000000 --- a/examples/wayland/server-buffer/compositor/sharebufferextension.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "sharebufferextension.h" - -#include - -#include - -#include - -#include -#include - -ShareBufferExtension::ShareBufferExtension(QWaylandCompositor *compositor) - : QWaylandCompositorExtensionTemplate(compositor) -{ -} - -void ShareBufferExtension::initialize() -{ - QWaylandCompositorExtensionTemplate::initialize(); - QWaylandCompositor *compositor = static_cast(extensionContainer()); - init(compositor->display(), 1); -} - -QtWayland::ServerBuffer *ShareBufferExtension::addImage(const QImage &img) -{ - if (!m_server_buffer_integration) { - QWaylandCompositor *compositor = static_cast(extensionContainer()); - - m_server_buffer_integration = QWaylandCompositorPrivate::get(compositor)->serverBufferIntegration(); - if (!m_server_buffer_integration) { - qWarning("Could not find a server buffer integration"); - return nullptr; - } - } - - QImage image = img.convertToFormat(QImage::Format_RGBA8888); - - auto *buffer = m_server_buffer_integration->createServerBufferFromImage(image, QtWayland::ServerBuffer::RGBA32); - - m_server_buffers.append(buffer); - return buffer; -} - -void ShareBufferExtension::createServerBuffers() -{ - QImage image(100,100,QImage::Format_ARGB32_Premultiplied); - image.fill(QColor(0x55,0x0,0x55,0x01)); - { - QPainter p(&image); - QPen pen = p.pen(); - pen.setWidthF(3); - pen.setColor(Qt::red); - p.setPen(pen); - p.drawLine(0,0,100,100); - pen.setColor(Qt::green); - p.setPen(pen); - p.drawLine(100,0,0,100); - pen.setColor(Qt::blue); - p.setPen(pen); - p.drawLine(25,15,75,15); - } - - addImage(image); - - QImage image2(":/images/Siberischer_tiger_de_edit02.jpg"); - addImage(image2); - - m_server_buffers_created = true; -} - - -void ShareBufferExtension::share_buffer_bind_resource(Resource *resource) -{ - if (!m_server_buffers_created) - createServerBuffers(); - - for (auto *buffer : std::as_const(m_server_buffers)) { - qDebug() << "sending" << buffer << "to client"; - struct ::wl_client *client = wl_resource_get_client(resource->handle); - struct ::wl_resource *buffer_resource = buffer->resourceForClient(client); - send_cross_buffer(resource->handle, buffer_resource); - } -} diff --git a/examples/wayland/server-buffer/compositor/sharebufferextension.h b/examples/wayland/server-buffer/compositor/sharebufferextension.h deleted file mode 100644 index 98dcc7d8..00000000 --- a/examples/wayland/server-buffer/compositor/sharebufferextension.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef SHAREBUFFEREXTENSION_H -#define SHAREBUFFEREXTENSION_H - -#include "wayland-util.h" - -#include - -#include -#include -#include - -#include -#include - -#include "qwayland-server-share-buffer.h" - -QT_BEGIN_NAMESPACE - -namespace QtWayland -{ - class ServerBufferIntegration; -}; - - -class ShareBufferExtension : public QWaylandCompositorExtensionTemplate - , public QtWaylandServer::qt_share_buffer -{ - Q_OBJECT -public: - ShareBufferExtension(QWaylandCompositor *compositor = nullptr); - void initialize() override; - -protected slots: - QtWayland::ServerBuffer *addImage(const QImage &image); - -protected: - void share_buffer_bind_resource(Resource *resource) override; - -private: - void createServerBuffers(); - QList m_server_buffers; - QtWayland::ServerBufferIntegration *m_server_buffer_integration = nullptr; - bool m_server_buffers_created = false; -}; - -Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(ShareBufferExtension) - -QT_END_NAMESPACE - -#endif // SHAREBUFFEREXTENSION_H diff --git a/examples/wayland/server-buffer/cpp-client/CMakeLists.txt b/examples/wayland/server-buffer/cpp-client/CMakeLists.txt deleted file mode 100644 index 01c0df44..00000000 --- a/examples/wayland/server-buffer/cpp-client/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(server-buffer-cpp-client) - -set(CMAKE_AUTOMOC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/server-buffer/cpp-client") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL WaylandClient) - -qt_add_executable(server-buffer-cpp-client - main.cpp - sharebufferextension.cpp sharebufferextension.h -) - -qt6_generate_wayland_protocol_client_sources(server-buffer-cpp-client - FILES - ${CMAKE_CURRENT_SOURCE_DIR}/../share-buffer.xml -) - -set_target_properties(server-buffer-cpp-client PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(server-buffer-cpp-client PUBLIC - Qt::Core - Qt::Gui - Qt::GuiPrivate - Qt::OpenGL - Qt::WaylandClientPrivate -) - -install(TARGETS server-buffer-cpp-client - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/wayland/server-buffer/cpp-client/cpp-client.pro b/examples/wayland/server-buffer/cpp-client/cpp-client.pro deleted file mode 100644 index 6ac55132..00000000 --- a/examples/wayland/server-buffer/cpp-client/cpp-client.pro +++ /dev/null @@ -1,15 +0,0 @@ -QT += waylandclient-private gui-private opengl -CONFIG += wayland-scanner - -WAYLANDCLIENTSOURCES += ../share-buffer.xml - -SOURCES += main.cpp \ - sharebufferextension.cpp - -HEADERS += \ - sharebufferextension.h - -TARGET = server-buffer-cpp-client - -target.path = $$[QT_INSTALL_EXAMPLES]/wayland/server-buffer/cpp-client -INSTALLS += target diff --git a/examples/wayland/server-buffer/cpp-client/main.cpp b/examples/wayland/server-buffer/cpp-client/main.cpp deleted file mode 100644 index 8adac252..00000000 --- a/examples/wayland/server-buffer/cpp-client/main.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include "sharebufferextension.h" - -#include -#include -#include -#include - -class TestWindow : public QOpenGLWindow -{ - Q_OBJECT - -public: - TestWindow() - { - m_extension = new ShareBufferExtension; - connect(m_extension, SIGNAL(bufferReceived(QtWaylandClient::QWaylandServerBuffer*)), this, SLOT(receiveBuffer(QtWaylandClient::QWaylandServerBuffer*))); - } - -public slots: - void receiveBuffer(QtWaylandClient::QWaylandServerBuffer *buffer) - { - m_buffers.append(buffer); - update(); - } - -protected: - - void initializeGL() override - { - m_blitter = new QOpenGLTextureBlitter; - m_blitter->create(); - } - - void paintGL() override { - glClearColor(.5, .45, .42, 1.); - glClear(GL_COLOR_BUFFER_BIT); - int x = 0; - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - for (auto buffer: m_buffers) { - m_blitter->bind(); - QPointF pos(x,0); - QSize s(buffer->size()); - QRectF targetRect(pos, s); - QOpenGLTexture *texture = buffer->toOpenGlTexture(); - auto surfaceOrigin = QOpenGLTextureBlitter::OriginTopLeft; - QMatrix4x4 targetTransform = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(), size())); - m_blitter->blit(texture->textureId(), targetTransform, surfaceOrigin); - m_blitter->release(); - x += s.width() + 10; - } - } - -private: - - QOpenGLTextureBlitter *m_blitter = nullptr; - ShareBufferExtension *m_extension = nullptr; - QList m_buffers; - -}; - -int main (int argc, char **argv) -{ - QGuiApplication app(argc, argv); - - TestWindow window; - window.show(); - - return app.exec(); -} - -#include "main.moc" diff --git a/examples/wayland/server-buffer/cpp-client/sharebufferextension.cpp b/examples/wayland/server-buffer/cpp-client/sharebufferextension.cpp deleted file mode 100644 index 3641ec63..00000000 --- a/examples/wayland/server-buffer/cpp-client/sharebufferextension.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "sharebufferextension.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - -ShareBufferExtension::ShareBufferExtension() - : QWaylandClientExtensionTemplate(/* Supported protocol version */ 1 ) -{ - - auto *wayland_integration = static_cast(QGuiApplicationPrivate::platformIntegration()); - m_server_buffer_integration = wayland_integration->serverBufferIntegration(); - if (!m_server_buffer_integration) { - qCritical() << "This application requires a working serverBufferIntegration"; - QGuiApplication::quit(); - } -} - -void ShareBufferExtension::share_buffer_cross_buffer(struct ::qt_server_buffer *buffer) -{ - QtWaylandClient::QWaylandServerBuffer *serverBuffer = m_server_buffer_integration->serverBuffer(buffer); - emit bufferReceived(serverBuffer); -} - - -QT_END_NAMESPACE diff --git a/examples/wayland/server-buffer/cpp-client/sharebufferextension.h b/examples/wayland/server-buffer/cpp-client/sharebufferextension.h deleted file mode 100644 index 78e3ca7f..00000000 --- a/examples/wayland/server-buffer/cpp-client/sharebufferextension.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef SHAREBUFFEREXTENSION_H -#define SHAREBUFFEREXTENSION_H - -#include -#include -#include -#include "qwayland-share-buffer.h" - -QT_BEGIN_NAMESPACE - -namespace QtWaylandClient { - class QWaylandServerBuffer; - class QWaylandServerBufferIntegration; -}; - -class ShareBufferExtension : public QWaylandClientExtensionTemplate - , public QtWayland::qt_share_buffer -{ - Q_OBJECT -public: - ShareBufferExtension(); - -signals: - void bufferReceived(QtWaylandClient::QWaylandServerBuffer *buffer); - -private: - void share_buffer_cross_buffer(struct ::qt_server_buffer *buffer) override; - QtWaylandClient::QWaylandServerBufferIntegration *m_server_buffer_integration = nullptr; -}; - -QT_END_NAMESPACE - -#endif // SHAREBUFFEREXTENSION_H diff --git a/examples/wayland/server-buffer/server-buffer.pro b/examples/wayland/server-buffer/server-buffer.pro deleted file mode 100644 index 0c737ea8..00000000 --- a/examples/wayland/server-buffer/server-buffer.pro +++ /dev/null @@ -1,6 +0,0 @@ -TEMPLATE=subdirs - -SUBDIRS += cpp-client compositor - -EXAMPLE_FILES += \ - share-buffer.xml diff --git a/examples/wayland/server-buffer/share-buffer.xml b/examples/wayland/server-buffer/share-buffer.xml deleted file mode 100644 index 53020c4e..00000000 --- a/examples/wayland/server-buffer/share-buffer.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - Copyright (C) 2015 The Qt Company Ltd. - SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - - - - - - - - diff --git a/examples/wayland/wayland.pro b/examples/wayland/wayland.pro index 4a4aaf81..c0ff3ec9 100644 --- a/examples/wayland/wayland.pro +++ b/examples/wayland/wayland.pro @@ -22,11 +22,6 @@ qtHaveModule(quick) { SUBDIRS += \ custom-extension \ custom-shell - - qtConfig(opengl) { - SUBDIRS += \ - server-buffer - } } SUBDIRS += hwlayer-compositor } diff --git a/tests/manual/CMakeLists.txt b/tests/manual/CMakeLists.txt index 4393d4f1..d2f6959a 100644 --- a/tests/manual/CMakeLists.txt +++ b/tests/manual/CMakeLists.txt @@ -12,3 +12,7 @@ if(TARGET Qt::WaylandCompositor) #add_subdirectory(wip-cpp-compositor) add_subdirectory(scaling-compositor) endif() + +if(QT_FEATURE_opengl AND TARGET Qt::Quick AND TARGET Qt::WaylandClient) + qt_internal_add_example(server-buffer) +endif() diff --git a/tests/manual/server-buffer/CMakeLists.txt b/tests/manual/server-buffer/CMakeLists.txt new file mode 100644 index 00000000..973063c7 --- /dev/null +++ b/tests/manual/server-buffer/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.16) +project(server-buffer) + +add_subdirectory(cpp-client) +add_subdirectory(compositor) diff --git a/tests/manual/server-buffer/README b/tests/manual/server-buffer/README new file mode 100644 index 00000000..da20b0f5 --- /dev/null +++ b/tests/manual/server-buffer/README @@ -0,0 +1,32 @@ +This example shows how to use the low-level server buffer extension. This +version of Qt also provides a texture sharing extension that provides more +functionality and convenience for sharing graphical assets with Qt Quick +clients: see the texture-sharing example. + +Compile up both compositor and client. + +If you have the dmabuf-server buffer integration (and you are running Mesa) +then start the compositor with: + +$ QT_WAYLAND_SERVER_BUFFER_INTEGRATION=dmabuf-server ./compositor + + +Note: if you are running a compositor on an X11 desktop, you also need to +set QT_XCB_GL_INTEGRATION=xcb_egl as usual. + +The compositor broadcasts the name of the server buffer integration to +all clients through the hardware integration extension. Therefore, +all you need to do is to start the client with + +$ ./cpp-client -platform wayland + +The client will show all the buffers shared by the compositor. + +For testing on desktop, there is also a shared memory based server buffer +integration that works with any graphics hardware: + +$ QT_WAYLAND_SERVER_BUFFER_INTEGRATION=shm-emulation-server QT_XCB_GL_INTEGRATION=xcb_egl ./compositor + +Note: the shm-emulation-server integration does not actually share graphics +buffers, so it will not give any graphics memory savings. It is intended solely +for testing during development and should never be used in production. diff --git a/tests/manual/server-buffer/compositor/CMakeLists.txt b/tests/manual/server-buffer/compositor/CMakeLists.txt new file mode 100644 index 00000000..5f4fb0c5 --- /dev/null +++ b/tests/manual/server-buffer/compositor/CMakeLists.txt @@ -0,0 +1,57 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(compositor) + +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/server-buffer/compositor") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml WaylandCompositor) + +qt_add_executable(compositor + main.cpp + sharebufferextension.cpp sharebufferextension.h +) + +qt6_generate_wayland_protocol_server_sources(compositor + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/../share-buffer.xml +) + +set_target_properties(compositor PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(compositor PUBLIC + Qt::Core + Qt::Gui + Qt::Qml + Qt::WaylandCompositorPrivate +) + +# Resources: +set(compositor_resource_files + "images/Siberischer_tiger_de_edit02.jpg" + "images/background.png" + "qml/main.qml" +) + +qt6_add_resources(compositor "compositor" + PREFIX + "/" + FILES + ${compositor_resource_files} +) + +install(TARGETS compositor + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/manual/server-buffer/compositor/compositor.pro b/tests/manual/server-buffer/compositor/compositor.pro new file mode 100644 index 00000000..26334c63 --- /dev/null +++ b/tests/manual/server-buffer/compositor/compositor.pro @@ -0,0 +1,26 @@ +QT += core gui qml + +QT += waylandcompositor-private + +CONFIG += wayland-scanner +CONFIG += c++11 +SOURCES += \ + main.cpp \ + sharebufferextension.cpp + +OTHER_FILES = \ + qml/main.qml \ + images/background.jpg + +WAYLANDSERVERSOURCES += \ + ../share-buffer.xml + +RESOURCES += compositor.qrc + +TARGET = compositor + +HEADERS += \ + sharebufferextension.h + +target.path = $$[QT_INSTALL_EXAMPLES]/wayland/server-buffer/compositor +INSTALLS += target diff --git a/tests/manual/server-buffer/compositor/compositor.qrc b/tests/manual/server-buffer/compositor/compositor.qrc new file mode 100644 index 00000000..b50594b5 --- /dev/null +++ b/tests/manual/server-buffer/compositor/compositor.qrc @@ -0,0 +1,7 @@ + + + images/background.png + images/Siberischer_tiger_de_edit02.jpg + qml/main.qml + + diff --git a/tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg b/tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg new file mode 100644 index 00000000..eb1b73f8 Binary files /dev/null and b/tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.jpg differ diff --git a/tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt b/tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt new file mode 100644 index 00000000..3a26c00d --- /dev/null +++ b/tests/manual/server-buffer/compositor/images/Siberischer_tiger_de_edit02.txt @@ -0,0 +1,5 @@ +Image from https://en.wikipedia.org/wiki/File:Siberischer_tiger_de_edit02.jpg + +Author: S. Taheri, edited by Fir0002 + +License: Creative Commons Attribution-Share Alike 2.5 Generic diff --git a/tests/manual/server-buffer/compositor/images/background.png b/tests/manual/server-buffer/compositor/images/background.png new file mode 100644 index 00000000..292160cd Binary files /dev/null and b/tests/manual/server-buffer/compositor/images/background.png differ diff --git a/tests/manual/server-buffer/compositor/main.cpp b/tests/manual/server-buffer/compositor/main.cpp new file mode 100644 index 00000000..3c33620c --- /dev/null +++ b/tests/manual/server-buffer/compositor/main.cpp @@ -0,0 +1,29 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include +#include +#include +#include + +#include +#include + +#include "sharebufferextension.h" + +static void registerTypes() +{ + qmlRegisterType("io.qt.examples.sharebufferextension", 1, 0, "ShareBufferExtension"); +} + +int main(int argc, char *argv[]) +{ + // Make sure there is a valid OpenGL context in the main thread + qputenv("QSG_RENDER_LOOP", "basic"); + + QGuiApplication app(argc, argv); + registerTypes(); + QQmlApplicationEngine appEngine(QUrl("qrc:///qml/main.qml")); + + return app.exec(); +} diff --git a/tests/manual/server-buffer/compositor/qml/main.qml b/tests/manual/server-buffer/compositor/qml/main.qml new file mode 100644 index 00000000..484a9563 --- /dev/null +++ b/tests/manual/server-buffer/compositor/qml/main.qml @@ -0,0 +1,43 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtWayland.Compositor +import QtWayland.Compositor.WlShell +import QtQuick.Window + +import io.qt.examples.sharebufferextension + +WaylandCompositor { + WaylandOutput { + sizeFollowsWindow: true + window: Window { + width: 1024 + height: 768 + visible: true + Image { + id: surfaceArea + anchors.fill: parent + fillMode: Image.Tile + source: "qrc:/images/background.png" + smooth: false + } + } + } + + Component { + id: chromeComponent + ShellSurfaceItem { + onSurfaceDestroyed: destroy() + } + } + + WlShell { + onWlShellSurfaceCreated: (shellSurface) => { + chromeComponent.createObject(surfaceArea, { "shellSurface": shellSurface } ); + } + } + + ShareBufferExtension { + } +} diff --git a/tests/manual/server-buffer/compositor/sharebufferextension.cpp b/tests/manual/server-buffer/compositor/sharebufferextension.cpp new file mode 100644 index 00000000..b1b499ff --- /dev/null +++ b/tests/manual/server-buffer/compositor/sharebufferextension.cpp @@ -0,0 +1,86 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "sharebufferextension.h" + +#include + +#include + +#include + +#include +#include + +ShareBufferExtension::ShareBufferExtension(QWaylandCompositor *compositor) + : QWaylandCompositorExtensionTemplate(compositor) +{ +} + +void ShareBufferExtension::initialize() +{ + QWaylandCompositorExtensionTemplate::initialize(); + QWaylandCompositor *compositor = static_cast(extensionContainer()); + init(compositor->display(), 1); +} + +QtWayland::ServerBuffer *ShareBufferExtension::addImage(const QImage &img) +{ + if (!m_server_buffer_integration) { + QWaylandCompositor *compositor = static_cast(extensionContainer()); + + m_server_buffer_integration = QWaylandCompositorPrivate::get(compositor)->serverBufferIntegration(); + if (!m_server_buffer_integration) { + qWarning("Could not find a server buffer integration"); + return nullptr; + } + } + + QImage image = img.convertToFormat(QImage::Format_RGBA8888); + + auto *buffer = m_server_buffer_integration->createServerBufferFromImage(image, QtWayland::ServerBuffer::RGBA32); + + m_server_buffers.append(buffer); + return buffer; +} + +void ShareBufferExtension::createServerBuffers() +{ + QImage image(100,100,QImage::Format_ARGB32_Premultiplied); + image.fill(QColor(0x55,0x0,0x55,0x01)); + { + QPainter p(&image); + QPen pen = p.pen(); + pen.setWidthF(3); + pen.setColor(Qt::red); + p.setPen(pen); + p.drawLine(0,0,100,100); + pen.setColor(Qt::green); + p.setPen(pen); + p.drawLine(100,0,0,100); + pen.setColor(Qt::blue); + p.setPen(pen); + p.drawLine(25,15,75,15); + } + + addImage(image); + + QImage image2(":/images/Siberischer_tiger_de_edit02.jpg"); + addImage(image2); + + m_server_buffers_created = true; +} + + +void ShareBufferExtension::share_buffer_bind_resource(Resource *resource) +{ + if (!m_server_buffers_created) + createServerBuffers(); + + for (auto *buffer : std::as_const(m_server_buffers)) { + qDebug() << "sending" << buffer << "to client"; + struct ::wl_client *client = wl_resource_get_client(resource->handle); + struct ::wl_resource *buffer_resource = buffer->resourceForClient(client); + send_cross_buffer(resource->handle, buffer_resource); + } +} diff --git a/tests/manual/server-buffer/compositor/sharebufferextension.h b/tests/manual/server-buffer/compositor/sharebufferextension.h new file mode 100644 index 00000000..98dcc7d8 --- /dev/null +++ b/tests/manual/server-buffer/compositor/sharebufferextension.h @@ -0,0 +1,53 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef SHAREBUFFEREXTENSION_H +#define SHAREBUFFEREXTENSION_H + +#include "wayland-util.h" + +#include + +#include +#include +#include + +#include +#include + +#include "qwayland-server-share-buffer.h" + +QT_BEGIN_NAMESPACE + +namespace QtWayland +{ + class ServerBufferIntegration; +}; + + +class ShareBufferExtension : public QWaylandCompositorExtensionTemplate + , public QtWaylandServer::qt_share_buffer +{ + Q_OBJECT +public: + ShareBufferExtension(QWaylandCompositor *compositor = nullptr); + void initialize() override; + +protected slots: + QtWayland::ServerBuffer *addImage(const QImage &image); + +protected: + void share_buffer_bind_resource(Resource *resource) override; + +private: + void createServerBuffers(); + QList m_server_buffers; + QtWayland::ServerBufferIntegration *m_server_buffer_integration = nullptr; + bool m_server_buffers_created = false; +}; + +Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(ShareBufferExtension) + +QT_END_NAMESPACE + +#endif // SHAREBUFFEREXTENSION_H diff --git a/tests/manual/server-buffer/cpp-client/CMakeLists.txt b/tests/manual/server-buffer/cpp-client/CMakeLists.txt new file mode 100644 index 00000000..01c0df44 --- /dev/null +++ b/tests/manual/server-buffer/cpp-client/CMakeLists.txt @@ -0,0 +1,44 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(server-buffer-cpp-client) + +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/server-buffer/cpp-client") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL WaylandClient) + +qt_add_executable(server-buffer-cpp-client + main.cpp + sharebufferextension.cpp sharebufferextension.h +) + +qt6_generate_wayland_protocol_client_sources(server-buffer-cpp-client + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/../share-buffer.xml +) + +set_target_properties(server-buffer-cpp-client PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(server-buffer-cpp-client PUBLIC + Qt::Core + Qt::Gui + Qt::GuiPrivate + Qt::OpenGL + Qt::WaylandClientPrivate +) + +install(TARGETS server-buffer-cpp-client + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/manual/server-buffer/cpp-client/cpp-client.pro b/tests/manual/server-buffer/cpp-client/cpp-client.pro new file mode 100644 index 00000000..6ac55132 --- /dev/null +++ b/tests/manual/server-buffer/cpp-client/cpp-client.pro @@ -0,0 +1,15 @@ +QT += waylandclient-private gui-private opengl +CONFIG += wayland-scanner + +WAYLANDCLIENTSOURCES += ../share-buffer.xml + +SOURCES += main.cpp \ + sharebufferextension.cpp + +HEADERS += \ + sharebufferextension.h + +TARGET = server-buffer-cpp-client + +target.path = $$[QT_INSTALL_EXAMPLES]/wayland/server-buffer/cpp-client +INSTALLS += target diff --git a/tests/manual/server-buffer/cpp-client/main.cpp b/tests/manual/server-buffer/cpp-client/main.cpp new file mode 100644 index 00000000..8adac252 --- /dev/null +++ b/tests/manual/server-buffer/cpp-client/main.cpp @@ -0,0 +1,88 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "sharebufferextension.h" + +#include +#include +#include +#include + +class TestWindow : public QOpenGLWindow +{ + Q_OBJECT + +public: + TestWindow() + { + m_extension = new ShareBufferExtension; + connect(m_extension, SIGNAL(bufferReceived(QtWaylandClient::QWaylandServerBuffer*)), this, SLOT(receiveBuffer(QtWaylandClient::QWaylandServerBuffer*))); + } + +public slots: + void receiveBuffer(QtWaylandClient::QWaylandServerBuffer *buffer) + { + m_buffers.append(buffer); + update(); + } + +protected: + + void initializeGL() override + { + m_blitter = new QOpenGLTextureBlitter; + m_blitter->create(); + } + + void paintGL() override { + glClearColor(.5, .45, .42, 1.); + glClear(GL_COLOR_BUFFER_BIT); + int x = 0; + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + for (auto buffer: m_buffers) { + m_blitter->bind(); + QPointF pos(x,0); + QSize s(buffer->size()); + QRectF targetRect(pos, s); + QOpenGLTexture *texture = buffer->toOpenGlTexture(); + auto surfaceOrigin = QOpenGLTextureBlitter::OriginTopLeft; + QMatrix4x4 targetTransform = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(), size())); + m_blitter->blit(texture->textureId(), targetTransform, surfaceOrigin); + m_blitter->release(); + x += s.width() + 10; + } + } + +private: + + QOpenGLTextureBlitter *m_blitter = nullptr; + ShareBufferExtension *m_extension = nullptr; + QList m_buffers; + +}; + +int main (int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + TestWindow window; + window.show(); + + return app.exec(); +} + +#include "main.moc" diff --git a/tests/manual/server-buffer/cpp-client/sharebufferextension.cpp b/tests/manual/server-buffer/cpp-client/sharebufferextension.cpp new file mode 100644 index 00000000..3641ec63 --- /dev/null +++ b/tests/manual/server-buffer/cpp-client/sharebufferextension.cpp @@ -0,0 +1,36 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "sharebufferextension.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +ShareBufferExtension::ShareBufferExtension() + : QWaylandClientExtensionTemplate(/* Supported protocol version */ 1 ) +{ + + auto *wayland_integration = static_cast(QGuiApplicationPrivate::platformIntegration()); + m_server_buffer_integration = wayland_integration->serverBufferIntegration(); + if (!m_server_buffer_integration) { + qCritical() << "This application requires a working serverBufferIntegration"; + QGuiApplication::quit(); + } +} + +void ShareBufferExtension::share_buffer_cross_buffer(struct ::qt_server_buffer *buffer) +{ + QtWaylandClient::QWaylandServerBuffer *serverBuffer = m_server_buffer_integration->serverBuffer(buffer); + emit bufferReceived(serverBuffer); +} + + +QT_END_NAMESPACE diff --git a/tests/manual/server-buffer/cpp-client/sharebufferextension.h b/tests/manual/server-buffer/cpp-client/sharebufferextension.h new file mode 100644 index 00000000..78e3ca7f --- /dev/null +++ b/tests/manual/server-buffer/cpp-client/sharebufferextension.h @@ -0,0 +1,36 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef SHAREBUFFEREXTENSION_H +#define SHAREBUFFEREXTENSION_H + +#include +#include +#include +#include "qwayland-share-buffer.h" + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + class QWaylandServerBuffer; + class QWaylandServerBufferIntegration; +}; + +class ShareBufferExtension : public QWaylandClientExtensionTemplate + , public QtWayland::qt_share_buffer +{ + Q_OBJECT +public: + ShareBufferExtension(); + +signals: + void bufferReceived(QtWaylandClient::QWaylandServerBuffer *buffer); + +private: + void share_buffer_cross_buffer(struct ::qt_server_buffer *buffer) override; + QtWaylandClient::QWaylandServerBufferIntegration *m_server_buffer_integration = nullptr; +}; + +QT_END_NAMESPACE + +#endif // SHAREBUFFEREXTENSION_H diff --git a/tests/manual/server-buffer/server-buffer.pro b/tests/manual/server-buffer/server-buffer.pro new file mode 100644 index 00000000..0c737ea8 --- /dev/null +++ b/tests/manual/server-buffer/server-buffer.pro @@ -0,0 +1,6 @@ +TEMPLATE=subdirs + +SUBDIRS += cpp-client compositor + +EXAMPLE_FILES += \ + share-buffer.xml diff --git a/tests/manual/server-buffer/share-buffer.xml b/tests/manual/server-buffer/share-buffer.xml new file mode 100644 index 00000000..53020c4e --- /dev/null +++ b/tests/manual/server-buffer/share-buffer.xml @@ -0,0 +1,13 @@ + + + + Copyright (C) 2015 The Qt Company Ltd. + SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + + + + + + + + -- cgit v1.2.1