summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-11-03 11:23:35 +0100
committerPaul Lemire <paul.lemire@kdab.com>2020-11-04 10:17:16 +0100
commitdbf5da312ae3f406cc45a80c6ab2464b6e2d1e14 (patch)
treeb629dd03abb2c19d659e075590923474a2f16cd7 /tests
parentc7c84944d7111b837544e22fe5a0a4fe2a150aeb (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')
-rw-r--r--tests/auto/render/opengl/CMakeLists.txt1
-rw-r--r--tests/auto/render/opengl/gltexturemanager/CMakeLists.txt30
-rw-r--r--tests/auto/render/opengl/gltexturemanager/gltexturemanager.pro15
-rw-r--r--tests/auto/render/opengl/gltexturemanager/tst_gltexturemanager.cpp115
-rw-r--r--tests/auto/render/opengl/opengl.pro3
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 += \