diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-11-03 11:23:35 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-11-04 10:17:16 +0100 |
commit | dbf5da312ae3f406cc45a80c6ab2464b6e2d1e14 (patch) | |
tree | b629dd03abb2c19d659e075590923474a2f16cd7 /tests | |
parent | c7c84944d7111b837544e22fe5a0a4fe2a150aeb (diff) |
Fix GLTexture cleanup
The GLTexture class wasn't registered for cleanup on the manager.
This could result in it being reuse while not being reinitialized resulting
in incorrect rendering.
Change-Id: I85e6a5c3b5ca9d3cfa5ac5bcb1db3695dabfa576
Pick-to: 5.15
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'tests')
5 files changed, 163 insertions, 1 deletions
diff --git a/tests/auto/render/opengl/CMakeLists.txt b/tests/auto/render/opengl/CMakeLists.txt index b18ca11f1..21133f63f 100644 --- a/tests/auto/render/opengl/CMakeLists.txt +++ b/tests/auto/render/opengl/CMakeLists.txt @@ -14,6 +14,7 @@ if (NOT QT_BUILD_STANDALONE_TESTS) add_subdirectory(renderviewbuilder) add_subdirectory(qgraphicsutils) add_subdirectory(computecommand) + add_subdirectory(gltexturemanager) if(TARGET Qt::Quick) add_subdirectory(materialparametergathererjob) endif() diff --git a/tests/auto/render/opengl/gltexturemanager/CMakeLists.txt b/tests/auto/render/opengl/gltexturemanager/CMakeLists.txt new file mode 100644 index 000000000..2a0d251a9 --- /dev/null +++ b/tests/auto/render/opengl/gltexturemanager/CMakeLists.txt @@ -0,0 +1,30 @@ +# Generated from gltexturemanager.pro. + +##################################################################### +## tst_gltexturemanager Test: +##################################################################### + +qt_internal_add_test(tst_gltexturemanager + SOURCES + tst_gltexturemanager.cpp +) + +#### Keys ignored in scope 1:.:.:gltexturemanager.pro:<TRUE>: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +include(../../commons/commons.cmake) +qt3d_setup_common_render_test(tst_gltexturemanager USE_TEST_ASPECT) +include(${PROJECT_SOURCE_DIR}/src/plugins/renderers/opengl/opengl.cmake) +qt3d_setup_opengl_renderer_target(tst_gltexturemanager) + +qt_internal_extend_target(tst_gltexturemanager CONDITION gcov + COMPILE_OPTIONS + -fprofile-arcs + -ftest-coverage + LINK_OPTIONS + "-fprofile-arcs" + "-ftest-coverage" +) diff --git a/tests/auto/render/opengl/gltexturemanager/gltexturemanager.pro b/tests/auto/render/opengl/gltexturemanager/gltexturemanager.pro new file mode 100644 index 000000000..7784d8da7 --- /dev/null +++ b/tests/auto/render/opengl/gltexturemanager/gltexturemanager.pro @@ -0,0 +1,15 @@ +TEMPLATE = app + +TARGET = tst_gltexturemanager + +QT += core-private 3dcore 3dcore-private 3drender 3drender-private testlib + +CONFIG += testcase + +SOURCES += tst_gltexturemanager.cpp + +include(../../../core/common/common.pri) +include(../../commons/commons.pri) + +# Link Against OpenGL Renderer Plugin +include(../opengl_render_plugin.pri) diff --git a/tests/auto/render/opengl/gltexturemanager/tst_gltexturemanager.cpp b/tests/auto/render/opengl/gltexturemanager/tst_gltexturemanager.cpp new file mode 100644 index 000000000..676720369 --- /dev/null +++ b/tests/auto/render/opengl/gltexturemanager/tst_gltexturemanager.cpp @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QTest> +#include <Qt3DRender/QTextureImageDataGenerator> +#include <glresourcemanagers_p.h> +#include <glresourcemanagers_p.h> +#include <gltexture_p.h> +#include <Qt3DCore/qnodeid.h> +#include "qbackendnodetester.h" +#include "testrenderer.h" + +class TestImageDataGenerator : public Qt3DRender::QTextureImageDataGenerator +{ + int m_id; +public: + TestImageDataGenerator(int id) : m_id(id) {} + + Qt3DRender::QTextureImageDataPtr operator ()() override { + return Qt3DRender::QTextureImageDataPtr::create(); + } + + bool operator ==(const Qt3DRender::QTextureImageDataGenerator &other) const override { + const TestImageDataGenerator *otherFunctor = Qt3DCore::functor_cast<TestImageDataGenerator>(&other); + return (otherFunctor != nullptr && otherFunctor->m_id == m_id); + } + + QT3D_FUNCTOR(TestImageDataGenerator) +}; + +using ImageDataGeneratorPtr = QSharedPointer<TestImageDataGenerator>; + +class tst_GLTextureManager : public Qt3DCore::QBackendNodeTester +{ + Q_OBJECT + +private Q_SLOTS: + void checkInitialState() + { + // GIVEN + Qt3DRender::Render::OpenGL::GLTextureManager manager; + const Qt3DCore::QNodeId id = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::OpenGL::GLTexture *t = manager.getOrCreateResource(id); + + // THEN + QVERIFY(t != nullptr); + QVERIFY(!t->isDirty()); + QVERIFY(!t->hasTextureData()); + QVERIFY(!t->hasImagesData()); + QVERIFY(t->dataGenerator().isNull()); + QVERIFY(t->textureDataUpdates().empty()); + QCOMPARE(t->dirtyFlags(), Qt3DRender::Render::OpenGL::GLTexture::None); + QVERIFY(t->images().empty()); + + QCOMPARE(t, manager.getOrCreateResource(id)); + } + + void checkCleanup() + { + // GIVEN + Qt3DRender::Render::OpenGL::GLTextureManager manager; + const Qt3DCore::QNodeId id = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::OpenGL::GLTexture *t = manager.getOrCreateResource(id); + + // WHEN + Qt3DRender::Render::OpenGL::GLTexture::Image img = { + ImageDataGeneratorPtr::create(0), + 0, 0, + Qt3DRender::QAbstractTexture::AllFaces + }; + t->setImages({img}); + + // THEN + QCOMPARE(t->images().size(), 1); + QCOMPARE(t->dirtyFlags(), Qt3DRender::Render::OpenGL::GLTexture::TextureImageData); + + // WHEN + manager.releaseResource(id); + + // THEN -> Cleanup should have been called + Qt3DRender::Render::OpenGL::GLTexture *t2 = manager.getOrCreateResource(id); + QCOMPARE(t, t2); + QVERIFY(t->images().empty()); + QCOMPARE(t->dirtyFlags(), Qt3DRender::Render::OpenGL::GLTexture::None); + } +}; + +QTEST_APPLESS_MAIN(tst_GLTextureManager) + +#include "tst_gltexturemanager.moc" diff --git a/tests/auto/render/opengl/opengl.pro b/tests/auto/render/opengl/opengl.pro index fead9b5ff..2e99a970d 100644 --- a/tests/auto/render/opengl/opengl.pro +++ b/tests/auto/render/opengl/opengl.pro @@ -13,7 +13,8 @@ SUBDIRS += \ renderqueue \ renderviewbuilder \ qgraphicsutils \ - computecommand + computecommand \ + gltexturemanager qtHaveModule(quick) { SUBDIRS += \ |