summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-10-22 16:09:46 +0300
committerMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-10-26 07:40:36 +0000
commitb8fa015e77f6a78e7b2c10e45cf332924a7c146f (patch)
tree09abadf1af52667aea63e625397a4b05cadc8ce8 /src
parentacbb2d44b7ce736d4c29a8c3c579b1cdf725bddd (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.cpp28
-rw-r--r--src/imports/qtcanvas3d/canvas3d_p.h2
-rw-r--r--src/imports/qtcanvas3d/canvasrenderer.cpp2
-rw-r--r--src/imports/qtcanvas3d/context3d.cpp12
-rw-r--r--src/imports/qtcanvas3d/context3d_p.h1
-rw-r--r--src/imports/qtcanvas3d/texture3d.cpp2
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;