diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2019-10-31 14:34:01 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2019-10-31 14:42:48 +0100 |
commit | 1a52c4db428e65f4a0b92bea5811014aaa387263 (patch) | |
tree | 5a8c0d02c08cd32db10b3923496fa0010336a123 /src/compositor | |
parent | 5832b6628d848b271efae99585206fa02fc214c9 (diff) | |
parent | 8d1fedd6781babaf130486e5c7192b0ebc9fb039 (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts:
src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
Change-Id: I42733f5ad9429a5d2ff6c804eb1f3f2d50f50811
Diffstat (limited to 'src/compositor')
6 files changed, 47 insertions, 15 deletions
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp index 471018ebd..b75ead7bd 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.cpp +++ b/src/compositor/compositor_api/qwaylandcompositor.cpp @@ -365,11 +365,6 @@ void QWaylandCompositorPrivate::initializeHardwareIntegration() loadClientBufferIntegration(); loadServerBufferIntegration(); - - if (client_buffer_integration) - client_buffer_integration->initializeHardware(display); - if (server_buffer_integration) - server_buffer_integration->initializeHardware(q); #endif } @@ -399,18 +394,39 @@ void QWaylandCompositorPrivate::loadClientBufferIntegration() if (!targetKey.isEmpty()) { client_buffer_integration.reset(QtWayland::ClientBufferIntegrationFactory::create(targetKey, QStringList())); if (client_buffer_integration) { + qCDebug(qLcWaylandCompositorHardwareIntegration) << "Loaded client buffer integration:" << targetKey; client_buffer_integration->setCompositor(q); - if (hw_integration) - hw_integration->setClientBufferIntegration(targetKey); + if (!client_buffer_integration->initializeHardware(display)) { + qCWarning(qLcWaylandCompositorHardwareIntegration) + << "Failed to initialize hardware for client buffer integration:" << targetKey; + client_buffer_integration.reset(); + } + } else { + qCWarning(qLcWaylandCompositorHardwareIntegration) + << "Failed to load client buffer integration:" << targetKey; } } - //BUG: if there is no client buffer integration, bad things will happen when opengl is used + + if (!client_buffer_integration) { + qCWarning(qLcWaylandCompositorHardwareIntegration) + << "No client buffer integration was loaded, this means that clients will fall back" + << "to use CPU buffers (wl_shm) for transmitting buffers instead of using zero-copy" + << "GPU buffer handles. Expect serious performance impact with OpenGL clients due" + << "to potentially multiple copies between CPU and GPU memory per buffer.\n" + << "See the QtWayland readme for more info about how to build and configure Qt for" + << "your device."; + return; + } + + if (client_buffer_integration && hw_integration) + hw_integration->setClientBufferIntegration(targetKey); #endif } void QWaylandCompositorPrivate::loadServerBufferIntegration() { #if QT_CONFIG(opengl) + Q_Q(QWaylandCompositor); QStringList keys = QtWayland::ServerBufferIntegrationFactory::keys(); QString targetKey; QByteArray serverBufferIntegration = qgetenv("QT_WAYLAND_SERVER_BUFFER_INTEGRATION"); @@ -419,9 +435,22 @@ void QWaylandCompositorPrivate::loadServerBufferIntegration() } if (!targetKey.isEmpty()) { server_buffer_integration.reset(QtWayland::ServerBufferIntegrationFactory::create(targetKey, QStringList())); - if (hw_integration) - hw_integration->setServerBufferIntegration(targetKey); + if (server_buffer_integration) { + qCDebug(qLcWaylandCompositorHardwareIntegration) + << "Loaded server buffer integration:" << targetKey; + if (!server_buffer_integration->initializeHardware(q)) { + qCWarning(qLcWaylandCompositorHardwareIntegration) + << "Failed to initialize hardware for server buffer integration:" << targetKey; + server_buffer_integration.reset(); + } + } else { + qCWarning(qLcWaylandCompositorHardwareIntegration) + << "Failed to load server buffer integration:" << targetKey; + } } + + if (server_buffer_integration && hw_integration) + hw_integration->setServerBufferIntegration(targetKey); #endif } diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index 7b73688cf..2ebb04a35 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -378,7 +378,8 @@ QWaylandSurface::QWaylandSurface(QWaylandSurfacePrivate &dptr) QWaylandSurface::~QWaylandSurface() { Q_D(QWaylandSurface); - QWaylandCompositorPrivate::get(d->compositor)->unregisterSurface(this); + if (d->compositor) + QWaylandCompositorPrivate::get(d->compositor)->unregisterSurface(this); d->notifyViewsAboutDestruction(); } diff --git a/src/compositor/extensions/qwaylandwlshell.cpp b/src/compositor/extensions/qwaylandwlshell.cpp index aa8a93aff..6eb1c06e4 100644 --- a/src/compositor/extensions/qwaylandwlshell.cpp +++ b/src/compositor/extensions/qwaylandwlshell.cpp @@ -457,7 +457,8 @@ QWaylandWlShellSurface::QWaylandWlShellSurface(QWaylandWlShell *shell, QWaylandS QWaylandWlShellSurface::~QWaylandWlShellSurface() { Q_D(QWaylandWlShellSurface); - QWaylandWlShellPrivate::get(d->m_shell)->unregisterShellSurface(this); + if (d->m_shell) + QWaylandWlShellPrivate::get(d->m_shell)->unregisterShellSurface(this); } /*! diff --git a/src/compositor/hardware_integration/qwlclientbufferintegration_p.h b/src/compositor/hardware_integration/qwlclientbufferintegration_p.h index 0195f3d4b..2e962273f 100644 --- a/src/compositor/hardware_integration/qwlclientbufferintegration_p.h +++ b/src/compositor/hardware_integration/qwlclientbufferintegration_p.h @@ -64,7 +64,7 @@ public: void setCompositor(QWaylandCompositor *compositor) { m_compositor = compositor; } QWaylandCompositor *compositor() const { return m_compositor; } - virtual void initializeHardware(struct ::wl_display *display) = 0; + virtual bool initializeHardware(struct ::wl_display *display) = 0; virtual ClientBuffer *createBufferFor(struct ::wl_resource *buffer) = 0; diff --git a/src/compositor/hardware_integration/qwlserverbufferintegration.cpp b/src/compositor/hardware_integration/qwlserverbufferintegration.cpp index 423376665..e8c1a21fd 100644 --- a/src/compositor/hardware_integration/qwlserverbufferintegration.cpp +++ b/src/compositor/hardware_integration/qwlserverbufferintegration.cpp @@ -58,9 +58,10 @@ ServerBufferIntegration::ServerBufferIntegration() ServerBufferIntegration::~ServerBufferIntegration() { } -void ServerBufferIntegration::initializeHardware(QWaylandCompositor *compositor) +bool ServerBufferIntegration::initializeHardware(QWaylandCompositor *compositor) { Q_UNUSED(compositor); + return true; } } diff --git a/src/compositor/hardware_integration/qwlserverbufferintegration_p.h b/src/compositor/hardware_integration/qwlserverbufferintegration_p.h index bd4911e4e..96efd9e46 100644 --- a/src/compositor/hardware_integration/qwlserverbufferintegration_p.h +++ b/src/compositor/hardware_integration/qwlserverbufferintegration_p.h @@ -93,7 +93,7 @@ public: ServerBufferIntegration(); virtual ~ServerBufferIntegration(); - virtual void initializeHardware(QWaylandCompositor *); + virtual bool initializeHardware(QWaylandCompositor *); virtual bool supportsFormat(ServerBuffer::Format format) const = 0; virtual ServerBuffer *createServerBufferFromImage(const QImage &qimage, ServerBuffer::Format format) = 0; |