summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-02-27 14:22:01 +0100
committerLars Knoll <lars.knoll@qt.io>2020-02-27 14:22:01 +0100
commit5c6c0289f09d9bf18aaa35eed792e40840af5dce (patch)
treebe49cdea36de09b01b570af3bdc7f0a95f5dd02e /src/plugins/platforms/wasm
parent469c3338407a5cf74c5e35c43ebb48c14e21ecac (diff)
parente30aa59a897ca3849fb99c6393cfb426ed22d33b (diff)
Merge remote-tracking branch 'origin/5.14' into 5.15
Diffstat (limited to 'src/plugins/platforms/wasm')
-rw-r--r--src/plugins/platforms/wasm/qwasmbackingstore.cpp27
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.cpp7
-rw-r--r--src/plugins/platforms/wasm/qwasmcompositor.h5
-rw-r--r--src/plugins/platforms/wasm/qwasmintegration.cpp5
-rw-r--r--src/plugins/platforms/wasm/qwasmintegration.h1
5 files changed, 36 insertions, 9 deletions
diff --git a/src/plugins/platforms/wasm/qwasmbackingstore.cpp b/src/plugins/platforms/wasm/qwasmbackingstore.cpp
index 7e8a382512..6ac685083d 100644
--- a/src/plugins/platforms/wasm/qwasmbackingstore.cpp
+++ b/src/plugins/platforms/wasm/qwasmbackingstore.cpp
@@ -36,7 +36,7 @@
#include <QtGui/qpainter.h>
#include <private/qguiapplication_p.h>
#include <qpa/qplatformscreen.h>
-
+#include <QtGui/qoffscreensurface.h>
#include <QtGui/qbackingstore.h>
QT_BEGIN_NAMESPACE
@@ -53,12 +53,29 @@ QWasmBackingStore::QWasmBackingStore(QWasmCompositor *compositor, QWindow *windo
QWasmBackingStore::~QWasmBackingStore()
{
+ auto window = this->window();
+ QWasmIntegration::get()->removeBackingStore(window);
+ destroy();
+ QWasmWindow *wasmWindow = static_cast<QWasmWindow *>(window->handle());
+ if (wasmWindow)
+ wasmWindow->setBackingStore(nullptr);
}
void QWasmBackingStore::destroy()
{
- if (m_texture->isCreated())
- m_texture->destroy();
+ if (m_texture->isCreated()) {
+ auto context = m_compositor->context();
+ auto currentContext = QOpenGLContext::currentContext();
+ if (!currentContext || !QOpenGLContext::areSharing(context, currentContext)) {
+ QOffscreenSurface offScreenSurface(m_compositor->screen()->screen());
+ offScreenSurface.setFormat(context->format());
+ offScreenSurface.create();
+ context->makeCurrent(&offScreenSurface);
+ m_texture->destroy();
+ } else {
+ m_texture->destroy();
+ }
+ }
}
QPaintDevice *QWasmBackingStore::paintDevice()
@@ -81,9 +98,9 @@ void QWasmBackingStore::updateTexture()
if (m_dirty.isNull())
return;
- if (m_recreateTexture && m_texture->isCreated()) {
+ if (m_recreateTexture) {
m_recreateTexture = false;
- m_texture->destroy();
+ destroy();
}
if (!m_texture->isCreated()) {
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp
index e9c4559971..2f0b0414d9 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.cpp
+++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp
@@ -59,7 +59,6 @@ QWasmCompositedWindow::QWasmCompositedWindow()
QWasmCompositor::QWasmCompositor(QWasmScreen *screen)
:QObject(screen)
- , m_frameBuffer(nullptr)
, m_blitter(new QOpenGLTextureBlitter)
, m_needComposit(false)
, m_inFlush(false)
@@ -71,7 +70,6 @@ QWasmCompositor::QWasmCompositor(QWasmScreen *screen)
QWasmCompositor::~QWasmCompositor()
{
- delete m_frameBuffer;
destroy();
}
@@ -748,3 +746,8 @@ QWasmScreen *QWasmCompositor::screen()
{
return static_cast<QWasmScreen *>(parent());
}
+
+QOpenGLContext *QWasmCompositor::context()
+{
+ return m_context.data();
+}
diff --git a/src/plugins/platforms/wasm/qwasmcompositor.h b/src/plugins/platforms/wasm/qwasmcompositor.h
index 98f4a79b27..422f990175 100644
--- a/src/plugins/platforms/wasm/qwasmcompositor.h
+++ b/src/plugins/platforms/wasm/qwasmcompositor.h
@@ -125,11 +125,13 @@ public:
static QWasmTitleBarOptions makeTitleBarOptions(const QWasmWindow *window);
static QRect titlebarRect(QWasmTitleBarOptions tb, QWasmCompositor::SubControls subcontrol);
+ QWasmScreen *screen();
+ QOpenGLContext *context();
+
private slots:
void frame();
private:
- QWasmScreen *screen();
void notifyTopWindowChanged(QWasmWindow *window);
void drawWindow(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window);
void drawWindowContent(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window);
@@ -138,7 +140,6 @@ private:
void drawWindowDecorations(QOpenGLTextureBlitter *blitter, QWasmScreen *screen, QWasmWindow *window);
void drwPanelButton();
- QImage *m_frameBuffer;
QScopedPointer<QOpenGLContext> m_context;
QScopedPointer<QOpenGLTextureBlitter> m_blitter;
diff --git a/src/plugins/platforms/wasm/qwasmintegration.cpp b/src/plugins/platforms/wasm/qwasmintegration.cpp
index 45bc49e382..4b42b5788f 100644
--- a/src/plugins/platforms/wasm/qwasmintegration.cpp
+++ b/src/plugins/platforms/wasm/qwasmintegration.cpp
@@ -187,6 +187,11 @@ QPlatformBackingStore *QWasmIntegration::createPlatformBackingStore(QWindow *win
#endif
}
+void QWasmIntegration::removeBackingStore(QWindow* window)
+{
+ m_backingStores.remove(window);
+}
+
#ifndef QT_NO_OPENGL
QPlatformOpenGLContext *QWasmIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
{
diff --git a/src/plugins/platforms/wasm/qwasmintegration.h b/src/plugins/platforms/wasm/qwasmintegration.h
index 08b68cb5f7..cb8639086a 100644
--- a/src/plugins/platforms/wasm/qwasmintegration.h
+++ b/src/plugins/platforms/wasm/qwasmintegration.h
@@ -89,6 +89,7 @@ public:
void resizeScreen(const emscripten::val &canvas);
void resizeAllScreens();
void updateDpi();
+ void removeBackingStore(QWindow* window);
private:
mutable QWasmFontDatabase *m_fontDb;