summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.cpp17
-rw-r--r--src/compositor/compositor_api/qwaylandoutput_p.h3
-rw-r--r--src/compositor/extensions/qwaylandqttextinputmethod.cpp2
-rw-r--r--src/compositor/extensions/qwaylandxdgoutputv1.cpp21
-rw-r--r--src/compositor/extensions/qwaylandxdgoutputv1_p.h2
-rw-r--r--src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp30
-rw-r--r--src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h2
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;
};
}