diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-10-22 16:09:46 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-10-26 07:40:36 +0000 |
commit | b8fa015e77f6a78e7b2c10e45cf332924a7c146f (patch) | |
tree | 09abadf1af52667aea63e625397a4b05cadc8ce8 /src | |
parent | acbb2d44b7ce736d4c29a8c3c579b1cdf725bddd (diff) |
New manual test application to test context lost
Also fixed issues found while running the new application
Change-Id: I01f77570deceb2417cbf27fa13a905421c33d8e0
Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com>
Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/qtcanvas3d/canvas3d.cpp | 28 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/canvas3d_p.h | 2 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/canvasrenderer.cpp | 2 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/context3d.cpp | 12 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/context3d_p.h | 1 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/texture3d.cpp | 2 |
6 files changed, 31 insertions, 16 deletions
diff --git a/src/imports/qtcanvas3d/canvas3d.cpp b/src/imports/qtcanvas3d/canvas3d.cpp index d5896ef..08892ad 100644 --- a/src/imports/qtcanvas3d/canvas3d.cpp +++ b/src/imports/qtcanvas3d/canvas3d.cpp @@ -83,7 +83,6 @@ Canvas::Canvas(QQuickItem *parent): QQuickItem(parent), m_isNeedRenderQueued(false), m_rendererReady(false), - m_context3D(0), m_fboSize(0, 0), m_maxSize(0, 0), m_frameTimeMs(0), @@ -157,7 +156,8 @@ Canvas::Canvas(QQuickItem *parent): Canvas::~Canvas() { // Ensure that all JS objects have been destroyed before we destroy the command queue. - delete m_context3D; + if (!m_context3D.isNull()) + delete m_context3D.data(); if (m_renderer) m_renderer->destroy(); @@ -433,7 +433,7 @@ QJSValue Canvas::getContext(const QString &type, const QVariantMap &options) m_renderer->commandQueue()); connect(m_renderer, &CanvasRenderer::textureIdResolved, - m_context3D, &CanvasContext::handleTextureIdResolved, + m_context3D.data(), &CanvasContext::handleTextureIdResolved, Qt::QueuedConnection); // Verify that width and height are not initially too large, in case width and height @@ -457,10 +457,10 @@ QJSValue Canvas::getContext(const QString &type, const QVariantMap &options) m_context3D->setDevicePixelRatio(m_devicePixelRatio); m_context3D->setContextAttributes(m_contextAttribs); - emit contextChanged(m_context3D); + emit contextChanged(m_context3D.data()); } - return QQmlEngine::contextForObject(this)->engine()->newQObject(m_context3D); + return QQmlEngine::contextForObject(this)->engine()->newQObject(m_context3D.data()); } /*! @@ -540,6 +540,9 @@ void Canvas::handleWindowChanged(QQuickWindow *window) m_contextWindow = window; } else { // Re-added to same window + if (!m_context3D.isNull()) + m_context3D->markQuickTexturesDirty(); + if (m_renderer) { if (m_renderTarget == RenderTargetForeground) { connect(window, &QQuickWindow::beforeRendering, @@ -594,7 +597,7 @@ void Canvas::itemChange(ItemChange change, const ItemChangeData &value) CanvasContext *Canvas::context() { qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ << "()"; - return m_context3D; + return m_context3D.data(); } void Canvas::updateWindowParameters() @@ -614,7 +617,7 @@ void Canvas::updateWindowParameters() } } - if (m_context3D) { + if (!m_context3D.isNull()) { if (m_context3D->devicePixelRatio() != m_devicePixelRatio) m_context3D->setDevicePixelRatio(m_devicePixelRatio); } @@ -648,10 +651,10 @@ bool Canvas::firstSync() m_contextState = ContextRestoring; // Update necessary things to m_context3D - if (m_context3D) { + if (!m_context3D.isNull()) { m_context3D->setCommandQueue(m_renderer->commandQueue()); connect(m_renderer, &CanvasRenderer::textureIdResolved, - m_context3D, &CanvasContext::handleTextureIdResolved, + m_context3D.data(), &CanvasContext::handleTextureIdResolved, Qt::QueuedConnection); } connect(m_renderer, &CanvasRenderer::fpsChanged, @@ -848,13 +851,13 @@ void Canvas::queueNextRender() return; } - if (!m_context3D || m_contextState == ContextRestoring) { + if (m_context3D.isNull() || m_contextState == ContextRestoring) { // Call the initialize function from QML/JavaScript. It'll call the getContext() // that in turn creates the renderer context. qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ << " Emit initializeGL() signal"; - if (m_context3D) { + if (!m_context3D.isNull()) { m_context3D->setContextLostState(false); emit contextRestored(); } @@ -972,6 +975,7 @@ void Canvas::handleContextLost() if (m_contextState == ContextAlive || m_contextState == ContextRestoring) { m_contextState = ContextLost; m_rendererReady = false; + m_fboSize = QSize(0, 0); if (!m_contextWindow.isNull()) { disconnect(m_contextWindow.data(), &QQuickWindow::sceneGraphInvalidated, @@ -980,7 +984,7 @@ void Canvas::handleContextLost() this, &Canvas::handleContextLost); } - if (m_context3D) + if (!m_context3D.isNull()) m_context3D->setContextLostState(true); emit contextLost(); diff --git a/src/imports/qtcanvas3d/canvas3d_p.h b/src/imports/qtcanvas3d/canvas3d_p.h index b9e7d5e..3ee5049 100644 --- a/src/imports/qtcanvas3d/canvas3d_p.h +++ b/src/imports/qtcanvas3d/canvas3d_p.h @@ -177,7 +177,7 @@ private: bool m_isNeedRenderQueued; bool m_rendererReady; - CanvasContext *m_context3D; + QPointer<CanvasContext> m_context3D; QSize m_fboSize; QSize m_maxSize; diff --git a/src/imports/qtcanvas3d/canvasrenderer.cpp b/src/imports/qtcanvas3d/canvasrenderer.cpp index 59cc06e..f2e13e4 100644 --- a/src/imports/qtcanvas3d/canvasrenderer.cpp +++ b/src/imports/qtcanvas3d/canvasrenderer.cpp @@ -137,7 +137,7 @@ void CanvasRenderer::createContextShare() m_glContextQt->doneCurrent(); if (!m_glContextShare->create()) { qCWarning(canvas3drendering).nospace() << "CanvasRenderer::" << __FUNCTION__ - << "Failed to create share context"; + << " Failed to create share context"; } if (!m_glContextQt->makeCurrent(surface)) { qCWarning(canvas3drendering).nospace() << "CanvasRenderer::" << __FUNCTION__ diff --git a/src/imports/qtcanvas3d/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp index 0971996..014fe30 100644 --- a/src/imports/qtcanvas3d/context3d.cpp +++ b/src/imports/qtcanvas3d/context3d.cpp @@ -78,7 +78,6 @@ const int maxUniformAttributeNameLen = 512; * * \sa Canvas3D */ - CanvasContext::CanvasContext(QQmlEngine *engine, bool isES2, int maxVertexAttribs, int contextVersion, const QSet<QByteArray> &extensions, CanvasGlCommandQueue *commandQueue, QObject *parent) : @@ -6087,6 +6086,17 @@ void CanvasContext::setCommandQueue(CanvasGlCommandQueue *queue) this, &CanvasContext::handleFullCommandQueue, Qt::DirectConnection); } +void CanvasContext::markQuickTexturesDirty() +{ + if (m_quickItemToTextureMap.size()) { + QMap<QQuickItem *, CanvasTexture *>::iterator i = m_quickItemToTextureMap.begin(); + while (i != m_quickItemToTextureMap.end()) { + m_commandQueue->addQuickItemAsTexture(i.key(), i.value()->textureId()); + i++; + } + } +} + void CanvasContext::handleObjectDeletion(QObject *obj) { CanvasAbstractObject *jsObj = qobject_cast<CanvasAbstractObject *>(obj); diff --git a/src/imports/qtcanvas3d/context3d_p.h b/src/imports/qtcanvas3d/context3d_p.h index f1623ef..52cf800 100644 --- a/src/imports/qtcanvas3d/context3d_p.h +++ b/src/imports/qtcanvas3d/context3d_p.h @@ -1197,6 +1197,7 @@ public: CanvasGlCommandQueue *commandQueue() { return m_commandQueue; } void setCommandQueue(CanvasGlCommandQueue *queue); + void markQuickTexturesDirty(); signals: void canvasChanged(Canvas *canvas); diff --git a/src/imports/qtcanvas3d/texture3d.cpp b/src/imports/qtcanvas3d/texture3d.cpp index f53e94d..6cc7aed 100644 --- a/src/imports/qtcanvas3d/texture3d.cpp +++ b/src/imports/qtcanvas3d/texture3d.cpp @@ -96,7 +96,7 @@ bool CanvasTexture::isAlive() const void CanvasTexture::del() { - if (m_textureId) { + if (!invalidated() && m_textureId) { if (m_quickItem) { m_context->quickItemToTextureMap().remove(m_quickItem); m_quickItem = 0; |