diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-02-12 16:20:20 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-02-13 06:39:16 +0100 |
commit | fed75194371573cb1af24710deb2936f5f8024d1 (patch) | |
tree | 5cfcf470b987f4e89008ed6ea060701d771cca71 /tests | |
parent | 26df8a284b745002f067cbde6da40fcdb921c19c (diff) |
Shader fixes
- Make sure that shaders marked for destruction are un marked from
destruction if recreated before having been destroyed.
- When loading shaders, make sure the shader wasn't already loaded
when loading it. This can happen is a shader is abandoned and then
re adopted.
Change-Id: I04597479d782bc6d31e4c7f78425c02c31217c7e
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/render/shader/tst_shader.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/auto/render/shader/tst_shader.cpp b/tests/auto/render/shader/tst_shader.cpp index a1f837010..212fdff4d 100644 --- a/tests/auto/render/shader/tst_shader.cpp +++ b/tests/auto/render/shader/tst_shader.cpp @@ -29,6 +29,7 @@ #include <QtTest/QTest> #include <qbackendnodetester.h> #include <Qt3DRender/private/shader_p.h> +#include <Qt3DRender/private/managers_p.h> #include <Qt3DRender/qshaderprogram.h> #include "testrenderer.h" @@ -46,6 +47,7 @@ private slots: void checkSetRendererDirtyOnInitialization(); void allowToChangeShaderCode_data(); void allowToChangeShaderCode(); + void checkShaderManager(); }; @@ -278,6 +280,48 @@ void tst_RenderShader::allowToChangeShaderCode() renderer.resetDirty(); } +void tst_RenderShader::checkShaderManager() +{ + // GIVEN + Qt3DRender::QShaderProgram shader; + TestRenderer renderer; + Qt3DRender::Render::ShaderManager manager; + Qt3DRender::Render::ShaderFunctor creationFunctor(&renderer, &manager); + + // THEN + QVERIFY(manager.shaderIdsToCleanup().isEmpty()); + + // WHEN + Qt3DCore::QNodeCreatedChangeBase changeObj(&shader); + Qt3DCore::QNodeCreatedChangeBasePtr changePtr(&changeObj, [](Qt3DCore::QNodeCreatedChangeBase *) {}); + auto backend = creationFunctor.create(changePtr); + + // THEN + QVERIFY(backend != nullptr); + QVERIFY(manager.shaderIdsToCleanup().isEmpty()); + + { + // WHEN + auto sameBackend = creationFunctor.get(shader.id()); + // THEN + QCOMPARE(backend, sameBackend); + } + + // WHEN + creationFunctor.destroy(shader.id()); + + // THEN -> Should be in list of ids to remove and return null on get + QVERIFY(manager.hasShaderIdToCleanup(shader.id())); + QVERIFY(creationFunctor.get(shader.id()) == nullptr); + + // WHEN -> Should be removed from list of ids to remove + creationFunctor.create(changePtr); + + // THEN + QVERIFY(manager.shaderIdsToCleanup().isEmpty()); + QCOMPARE(creationFunctor.get(shader.id()), backend); +} + QTEST_APPLESS_MAIN(tst_RenderShader) #include "tst_shader.moc" |