diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-07-10 09:30:52 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-07-11 04:45:51 +0000 |
commit | d47c78e6557856da4c0719caf2764b2fbfe2335d (patch) | |
tree | c8bbd14f40edb0440c115f50c2032db0dc399125 /tests | |
parent | a772c0f3cc85baed7434c0e0c8d2a6a7b3601364 (diff) |
Do not delay cleanup of backend Texture instances
If we delay the cleanup of backend Texture instances, in the case of a texture
being reparented from an existing node with backend to a node with no
backend, the resulting node destroyed, node created changes delivered in the
same loop would result in the Texture still being marked for destruction and
eventually being destroyed even though it was recreated.
This patch now still marks textures that were destroyed (by storing their
ids), so that the GL Texture managers can update the resources
accordingly. However, we now cleanup Textures immediately. We also remove
textures ids marked for destruction in the GL texture managers if we detect a
Texture with the same id is readded.
Change-Id: I29092d7dff9f70bb9fb4b15f4e9419ee1791b6e2
Task-number: QTBUG-69379
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/core/common/qbackendnodetester.cpp | 5 | ||||
-rw-r--r-- | tests/auto/core/common/qbackendnodetester.h | 2 | ||||
-rw-r--r-- | tests/auto/render/textures/tst_textures.cpp | 69 |
3 files changed, 76 insertions, 0 deletions
diff --git a/tests/auto/core/common/qbackendnodetester.cpp b/tests/auto/core/common/qbackendnodetester.cpp index 6f87e10d9..5d4a10b81 100644 --- a/tests/auto/core/common/qbackendnodetester.cpp +++ b/tests/auto/core/common/qbackendnodetester.cpp @@ -68,6 +68,11 @@ void QBackendNodeTester::sceneChangeEvent(QBackendNode *backend, const Qt3DCore: backend->sceneChangeEvent(e); } +QNodeCreatedChangeBasePtr QBackendNodeTester::creationChange(QNode *frontend) const +{ + return frontend->createNodeCreationChange(); +} + } // namespace Qt3DCore QT_END_NAMESPACE diff --git a/tests/auto/core/common/qbackendnodetester.h b/tests/auto/core/common/qbackendnodetester.h index 9f266e40d..a9738dff0 100644 --- a/tests/auto/core/common/qbackendnodetester.h +++ b/tests/auto/core/common/qbackendnodetester.h @@ -40,6 +40,7 @@ #include <QObject> #include <Qt3DCore/qnodeid.h> #include <Qt3DCore/qscenechange.h> +#include <Qt3DCore/qnodecreatedchange.h> QT_BEGIN_NAMESPACE @@ -58,6 +59,7 @@ public: void setPeerId(QBackendNode *backend, QNodeId id); void simulateInitialization(QNode *frontend, QBackendNode *backend); void sceneChangeEvent(QBackendNode *backend, const Qt3DCore::QSceneChangePtr &e); + Qt3DCore::QNodeCreatedChangeBasePtr creationChange(QNode *frontend) const; }; } // namespace Qt3DCore diff --git a/tests/auto/render/textures/tst_textures.cpp b/tests/auto/render/textures/tst_textures.cpp index f50131e12..364bfd7a9 100644 --- a/tests/auto/render/textures/tst_textures.cpp +++ b/tests/auto/render/textures/tst_textures.cpp @@ -583,6 +583,75 @@ private Q_SLOTS: QVERIFY(texImgDataMgr->getData(frontendGenerator).isNull()); QVERIFY(texImgDataMgr->getData(backendGenerator).isNull()); } + + void checkTextureIsMarkedForDeletion() + { + QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers()); + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); + Qt3DRender::Render::TextureManager *texMgr = mgrs->textureManager(); + Qt3DRender::Render::TextureImageManager *texImgMgr = mgrs->textureImageManager(); + renderer.setNodeManagers(mgrs.data()); + + Qt3DRender::Render::TextureFunctor textureBackendNodeMapper(&renderer, + texMgr, + texImgMgr); + + // GIVEN + Qt3DRender::QAbstractTexture* frontendTexture = createQTexture(1, {1}, true); + + Qt3DRender::Render::Texture *backendTexture = static_cast<Qt3DRender::Render::Texture *>(textureBackendNodeMapper.create(creationChange(frontendTexture))); + simulateInitialization(frontendTexture, backendTexture); + + // THEN + QVERIFY(backendTexture != nullptr); + QCOMPARE(texMgr->textureIdsToCleanup().size(), 0); + + QCOMPARE(texMgr->lookupResource(frontendTexture->id()), backendTexture); + + // WHEN + textureBackendNodeMapper.destroy(frontendTexture->id()); + + // THEN + QCOMPARE(texMgr->textureIdsToCleanup().size(), 1); + QCOMPARE(texMgr->textureIdsToCleanup().first(), frontendTexture->id()); + QVERIFY(texMgr->lookupResource(frontendTexture->id()) == nullptr); + } + + void checkTextureDestructionReconstructionWithinSameLoop() + { + QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers()); + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); + Qt3DRender::Render::TextureManager *texMgr = mgrs->textureManager(); + Qt3DRender::Render::TextureImageManager *texImgMgr = mgrs->textureImageManager(); + renderer.setNodeManagers(mgrs.data()); + + Qt3DRender::Render::TextureFunctor textureBackendNodeMapper(&renderer, + texMgr, + texImgMgr); + + // GIVEN + Qt3DRender::QAbstractTexture* frontendTexture = createQTexture(1, {1}, true); + + Qt3DRender::Render::Texture *backendTexture = static_cast<Qt3DRender::Render::Texture *>(textureBackendNodeMapper.create(creationChange(frontendTexture))); + simulateInitialization(frontendTexture, backendTexture); + + // WHEN + textureBackendNodeMapper.destroy(frontendTexture->id()); + + // THEN + QCOMPARE(texMgr->textureIdsToCleanup().size(), 1); + QCOMPARE(texMgr->textureIdsToCleanup().first(), frontendTexture->id()); + QVERIFY(texMgr->lookupResource(frontendTexture->id()) == nullptr); + + // WHEN + backendTexture = static_cast<Qt3DRender::Render::Texture *>(textureBackendNodeMapper.create(creationChange(frontendTexture))); + simulateInitialization(frontendTexture, backendTexture); + + // THEN + QVERIFY(backendTexture != nullptr); + QCOMPARE(texMgr->textureIdsToCleanup().size(), 0); + QCOMPARE(texMgr->lookupResource(frontendTexture->id()), backendTexture); + } }; QTEST_MAIN(tst_RenderTextures) |