diff options
Diffstat (limited to 'src')
7 files changed, 54 insertions, 23 deletions
diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp index c19e2bd9..8ea217bd 100644 --- a/src/compositor/compositor_api/qwaylandoutput.cpp +++ b/src/compositor/compositor_api/qwaylandoutput.cpp @@ -12,7 +12,6 @@ #include <QtWaylandCompositor/private/qwaylandcompositor_p.h> #include <QtWaylandCompositor/private/qwaylandview_p.h> #include <QtWaylandCompositor/private/qwaylandutils_p.h> -#include <QtWaylandCompositor/private/qwaylandxdgoutputv1_p.h> #include <QtCore/QCoreApplication> #include <QtCore/QtMath> @@ -127,9 +126,6 @@ void QWaylandOutputPrivate::sendGeometryInfo() if (resource->version() >= 2) send_done(resource->handle); } - - if (xdgOutput) - QWaylandXdgOutputV1Private::get(xdgOutput)->sendDone(); } void QWaylandOutputPrivate::sendMode(const Resource *resource, const QWaylandOutputMode &mode) @@ -153,9 +149,15 @@ void QWaylandOutputPrivate::sendModesInfo() if (resource->version() >= 2) send_done(resource->handle); } +} - if (xdgOutput) - QWaylandXdgOutputV1Private::get(xdgOutput)->sendDone(); +void QWaylandOutputPrivate::sendDone() +{ + const auto values = resourceMap().values(); + for (auto *resource : values) { + if (resource->version() >= 2) + send_done(resource->handle); + } } void QWaylandOutputPrivate::handleWindowPixelSizeChanged() @@ -816,9 +818,6 @@ void QWaylandOutput::setScaleFactor(int scale) } Q_EMIT scaleFactorChanged(); - - if (d->xdgOutput) - QWaylandXdgOutputV1Private::get(d->xdgOutput)->sendDone(); } /*! diff --git a/src/compositor/compositor_api/qwaylandoutput_p.h b/src/compositor/compositor_api/qwaylandoutput_p.h index 508b4860..5796bea5 100644 --- a/src/compositor/compositor_api/qwaylandoutput_p.h +++ b/src/compositor/compositor_api/qwaylandoutput_p.h @@ -74,11 +74,10 @@ public: void sendMode(const Resource *resource, const QWaylandOutputMode &mode); void sendModesInfo(); + void sendDone(); void handleWindowPixelSizeChanged(); - QPointer<QWaylandXdgOutputV1> xdgOutput; - protected: void output_bind_resource(Resource *resource) override; diff --git a/src/compositor/extensions/qwaylandqttextinputmethod.cpp b/src/compositor/extensions/qwaylandqttextinputmethod.cpp index edcf28d3..5fae0bfe 100644 --- a/src/compositor/extensions/qwaylandqttextinputmethod.cpp +++ b/src/compositor/extensions/qwaylandqttextinputmethod.cpp @@ -344,7 +344,7 @@ void QWaylandQtTextInputMethod::setFocus(QWaylandSurface *surface) Q_D(QWaylandQtTextInputMethod); QWaylandQtTextInputMethodPrivate::Resource *resource = surface != nullptr ? d->resourceMap().value(surface->waylandClient()) : nullptr; - if (d->resource == resource) + if (d->resource == resource && d->focusedSurface == surface) // same client, same surface return; if (d->resource != nullptr && d->focusedSurface != nullptr) { diff --git a/src/compositor/extensions/qwaylandxdgoutputv1.cpp b/src/compositor/extensions/qwaylandxdgoutputv1.cpp index 035d8dd3..4204e2d3 100644 --- a/src/compositor/extensions/qwaylandxdgoutputv1.cpp +++ b/src/compositor/extensions/qwaylandxdgoutputv1.cpp @@ -130,7 +130,6 @@ void QWaylandXdgOutputManagerV1Private::registerXdgOutput(QWaylandOutput *output { if (!xdgOutputs.contains(output)) { xdgOutputs[output] = xdgOutput; - QWaylandOutputPrivate::get(output)->xdgOutput = xdgOutput; } } @@ -139,6 +138,11 @@ void QWaylandXdgOutputManagerV1Private::unregisterXdgOutput(QWaylandOutput *outp xdgOutputs.remove(output); } +QWaylandXdgOutputV1 *QWaylandXdgOutputManagerV1Private::xdgOutput(QWaylandOutput *output) const +{ + return xdgOutputs.value(output); +} + void QWaylandXdgOutputManagerV1Private::zxdg_output_manager_v1_get_xdg_output(Resource *resource, uint32_t id, wl_resource *outputResource) @@ -454,7 +458,6 @@ void QWaylandXdgOutputV1Private::sendLogicalPosition(const QPoint &position) const auto values = resourceMap().values(); for (auto *resource : values) send_logical_position(resource->handle, position.x(), position.y()); - needToSendDone = true; } void QWaylandXdgOutputV1Private::sendLogicalSize(const QSize &size) @@ -462,19 +465,17 @@ void QWaylandXdgOutputV1Private::sendLogicalSize(const QSize &size) const auto values = resourceMap().values(); for (auto *resource : values) send_logical_size(resource->handle, size.width(), size.height()); - needToSendDone = true; } void QWaylandXdgOutputV1Private::sendDone() { - if (needToSendDone) { - const auto values = resourceMap().values(); - for (auto *resource : values) { - if (resource->version() < 3) - send_done(resource->handle); - } - needToSendDone = false; + const auto values = resourceMap().values(); + for (auto *resource : values) { + if (resource->version() < 3) + send_done(resource->handle); } + + QWaylandOutputPrivate::get(output)->sendDone(); } void QWaylandXdgOutputV1Private::setManager(QWaylandXdgOutputManagerV1 *_manager) diff --git a/src/compositor/extensions/qwaylandxdgoutputv1_p.h b/src/compositor/extensions/qwaylandxdgoutputv1_p.h index 9db3703f..15adae98 100644 --- a/src/compositor/extensions/qwaylandxdgoutputv1_p.h +++ b/src/compositor/extensions/qwaylandxdgoutputv1_p.h @@ -34,6 +34,7 @@ public: void registerXdgOutput(QWaylandOutput *output, QWaylandXdgOutputV1 *xdgOutput); void unregisterXdgOutput(QWaylandOutput *output); + QWaylandXdgOutputV1 *xdgOutput(QWaylandOutput *output) const; static QWaylandXdgOutputManagerV1Private *get(QWaylandXdgOutputManagerV1 *manager) { return manager ? manager->d_func() : nullptr; } @@ -69,7 +70,6 @@ public: QSize logicalSize; QString name; QString description; - bool needToSendDone = false; protected: void zxdg_output_v1_bind_resource(Resource *resource) override; diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp index 16615abc..dba911e7 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp @@ -258,6 +258,31 @@ void QWaylandGLContext::destroyTemporaryOffscreenSurface(EGLSurface eglSurface) m_wlSurface = nullptr; } +void QWaylandGLContext::runGLChecks() +{ + bool ok; + const int doneCurrentWorkAround = qEnvironmentVariableIntValue("QT_WAYLAND_ENABLE_DONECURRENT_WORKAROUND", &ok); + if (ok) { + m_doneCurrentWorkAround = doneCurrentWorkAround != 0; + if (m_doneCurrentWorkAround) + qCDebug(lcQpaWayland) << "Enabling doneCurrent() workaround on request."; + else + qCDebug(lcQpaWayland) << "Disabling doneCurrent() workaround on request."; + + } else { + // Note that even though there is an EGL context current here, + // QOpenGLContext and QOpenGLFunctions are not yet usable at this stage. + const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER)); + if (renderer && strstr(renderer, "Mali")) { + qCDebug(lcQpaWayland) << "Enabling doneCurrent() workaround for Mali GPU." + << "Set QT_WAYLAND_ENABLE_DONECURRENT_WORKAROUND=0 to disable."; + m_doneCurrentWorkAround = true; + } + } + + QEGLPlatformContext::runGLChecks(); +} + QWaylandGLContext::~QWaylandGLContext() { delete m_blitter; @@ -276,6 +301,11 @@ void QWaylandGLContext::beginFrame() void QWaylandGLContext::endFrame() { Q_ASSERT(m_currentWindow != nullptr); + if (m_doneCurrentWorkAround) { + doneCurrent(); + QOpenGLContextPrivate::setCurrentContext(nullptr); + } + if (m_supportNonBlockingSwap) m_currentWindow->endFrame(); } diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h index 00ef99b1..361885e1 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h @@ -52,6 +52,7 @@ protected: EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface) override; EGLSurface createTemporaryOffscreenSurface() override; void destroyTemporaryOffscreenSurface(EGLSurface surface) override; + void runGLChecks() override; private: QWaylandDisplay *m_display = nullptr; @@ -62,6 +63,7 @@ private: wl_surface *m_wlSurface = nullptr; wl_egl_window *m_eglWindow = nullptr; QWaylandEglWindow *m_currentWindow = nullptr; + bool m_doneCurrentWorkAround = false; }; } |
