summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-09-19 12:26:49 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-09-25 15:36:43 +0200
commit81ba7578c9fa9781f5996aa8bf249ff8abdd1f9f (patch)
tree6f1d80fadc702adb34a12bbefc2a5611a43000bf
parentcca7720e68a3bf64dbf549b06ba13547cb29181c (diff)
Update QAbstractTextureImage to use direct sync
Change-Id: Ide55f36fc7e1ac197313307a1c3e58c06ac690a1 Reviewed-by: Mike Krus <mike.krus@kdab.com>
-rw-r--r--src/render/frontend/qrenderaspect.cpp2
-rw-r--r--src/render/texture/qabstracttextureimage.cpp6
-rw-r--r--src/render/texture/qabstracttextureimage_p.h2
-rw-r--r--src/render/texture/textureimage.cpp53
-rw-r--r--src/render/texture/textureimage_p.h4
-rw-r--r--tests/auto/render/textures/tst_textures.cpp147
6 files changed, 113 insertions, 101 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index c83b5cb69..de27eb84f 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -277,7 +277,7 @@ void QRenderAspectPrivate::registerBackendTypes()
// Textures
q->registerBackendType<QAbstractTexture, true>(QSharedPointer<Render::TextureFunctor>::create(m_renderer, m_nodeManagers->textureManager()));
- q->registerBackendType<QAbstractTextureImage>(QSharedPointer<Render::TextureImageFunctor>::create(m_renderer,
+ q->registerBackendType<QAbstractTextureImage, true>(QSharedPointer<Render::TextureImageFunctor>::create(m_renderer,
m_nodeManagers->textureImageManager()));
// Material system
diff --git a/src/render/texture/qabstracttextureimage.cpp b/src/render/texture/qabstracttextureimage.cpp
index 42f8eb747..a5d342d83 100644
--- a/src/render/texture/qabstracttextureimage.cpp
+++ b/src/render/texture/qabstracttextureimage.cpp
@@ -94,6 +94,12 @@ QAbstractTextureImagePrivate::~QAbstractTextureImagePrivate()
{
}
+QTextureImageDataGeneratorPtr QAbstractTextureImagePrivate::dataGenerator() const
+{
+ Q_Q(const QAbstractTextureImage);
+ return q->dataGenerator();
+}
+
/*!
\qmltype AbstractTextureImage
\instantiates Qt3DRender::QAbstractTextureImage
diff --git a/src/render/texture/qabstracttextureimage_p.h b/src/render/texture/qabstracttextureimage_p.h
index a5299acd7..f93d0e3ca 100644
--- a/src/render/texture/qabstracttextureimage_p.h
+++ b/src/render/texture/qabstracttextureimage_p.h
@@ -54,6 +54,7 @@
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DRender/private/qt3drender_global_p.h>
#include <Qt3DRender/qabstracttexture.h>
+#include <Qt3DRender/qtextureimagedatagenerator.h>
QT_BEGIN_NAMESPACE
@@ -72,6 +73,7 @@ public:
int m_mipLevel;
int m_layer;
QAbstractTexture::CubeMapFace m_face;
+ QTextureImageDataGeneratorPtr dataGenerator() const;
};
struct QAbstractTextureImageData
diff --git a/src/render/texture/textureimage.cpp b/src/render/texture/textureimage.cpp
index 87cfdbca6..512949d91 100644
--- a/src/render/texture/textureimage.cpp
+++ b/src/render/texture/textureimage.cpp
@@ -72,36 +72,39 @@ void TextureImage::cleanup()
m_face = QAbstractTexture::CubeMapPositiveX;
}
-void TextureImage::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
+void TextureImage::syncFromFrontEnd(const QNode *frontEnd, bool firstTime)
{
- const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QAbstractTextureImageData>>(change);
- const auto &data = typedChange->data;
- m_mipLevel = data.mipLevel;
- m_layer = data.layer;
- m_face = data.face;
- m_generator = data.generator;
- m_dirty = true;
-}
+ const QAbstractTextureImage *node = qobject_cast<const QAbstractTextureImage *>(frontEnd);
+ if (!node)
+ return;
-void TextureImage::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
-{
- QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e);
-
- if (e->type() == PropertyUpdated) {
- if (propertyChange->propertyName() == QByteArrayLiteral("layer")) {
- m_layer = propertyChange->value().toInt();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("mipLevel")) {
- m_mipLevel = propertyChange->value().toInt();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("face")) {
- m_face = static_cast<QAbstractTexture::CubeMapFace>(propertyChange->value().toInt());
- } else if (propertyChange->propertyName() == QByteArrayLiteral("dataGenerator")) {
- m_generator = propertyChange->value().value<QTextureImageDataGeneratorPtr>();
- }
+ const bool oldEnabled = isEnabled();
+ BackendNode::syncFromFrontEnd(frontEnd, firstTime);
+ m_dirty |= (oldEnabled != isEnabled());
+
+ if (node->layer() != m_layer) {
+ m_layer = node->layer();
+ m_dirty = true;
+ }
+
+ if (node->mipLevel() != m_mipLevel) {
+ m_mipLevel = node->mipLevel();
+ m_dirty = true;
+ }
+
+ if (node->face() != m_face) {
+ m_face = node->face();
+ m_dirty = true;
+ }
+
+ const QAbstractTextureImagePrivate *d = static_cast<const QAbstractTextureImagePrivate *>(QNodePrivate::get(node));
+ if (d->dataGenerator() != m_generator) {
+ m_generator = d->dataGenerator();
m_dirty = true;
}
- markDirty(AbstractRenderer::AllDirty);
- BackendNode::sceneChangeEvent(e);
+ if (m_dirty)
+ markDirty(AbstractRenderer::AllDirty);
}
void TextureImage::unsetDirty()
diff --git a/src/render/texture/textureimage_p.h b/src/render/texture/textureimage_p.h
index 490fe4432..57bbdea75 100644
--- a/src/render/texture/textureimage_p.h
+++ b/src/render/texture/textureimage_p.h
@@ -77,7 +77,7 @@ public:
~TextureImage();
void cleanup();
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override;
+ void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override;
inline int layer() const { return m_layer; }
inline int mipLevel() const { return m_mipLevel; }
@@ -87,8 +87,6 @@ public:
void unsetDirty();
private:
- void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final;
-
bool m_dirty;
int m_layer;
int m_mipLevel;
diff --git a/tests/auto/render/textures/tst_textures.cpp b/tests/auto/render/textures/tst_textures.cpp
index 1cd11b153..725ddc269 100644
--- a/tests/auto/render/textures/tst_textures.cpp
+++ b/tests/auto/render/textures/tst_textures.cpp
@@ -141,6 +141,11 @@ public:
{
}
+ void updateGenerator()
+ {
+ Qt3DRender::QAbstractTextureImage::notifyDataGeneratorChanged();
+ }
+
Qt3DRender::QTextureImageDataGeneratorPtr dataGenerator() const
{
return Qt3DRender::QTextureImageDataGeneratorPtr(new TestImageDataGenerator(m_genId));
@@ -187,17 +192,20 @@ class tst_RenderTextures : public Qt3DCore::QBackendNodeTester
Qt3DRender::Render::Texture *createBackendTexture(Qt3DRender::QAbstractTexture *frontend,
Qt3DRender::Render::TextureManager *texMgr,
- Qt3DRender::Render::TextureImageManager *texImgMgr)
+ Qt3DRender::Render::TextureImageManager *texImgMgr,
+ Qt3DRender::Render::AbstractRenderer *renderer)
{
Qt3DRender::Render::Texture *backend = texMgr->getOrCreateResource(frontend->id());
- simulateInitialization(frontend, backend);
+ backend->setRenderer(renderer);
+ simulateInitializationSync(frontend, backend);
// create texture images
for (const auto texImgFrontend : frontend->textureImages()) {
// make sure TextureImageManager has backend node for this QTextureImage
if (!texImgMgr->contains(texImgFrontend->id())) {
Qt3DRender::Render::TextureImage *texImgBackend = texImgMgr->getOrCreateResource(texImgFrontend->id());
- simulateInitialization(texImgFrontend, texImgBackend);
+ texImgBackend->setRenderer(renderer);
+ simulateInitializationSync(texImgFrontend, texImgBackend);
}
backend->addTextureImage(texImgFrontend->id());
}
@@ -221,10 +229,12 @@ private Q_SLOTS:
// WHEN
Qt3DRender::Render::Texture *bt1a = createBackendTexture(tex1a,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
Qt3DRender::Render::Texture *bt1b = createBackendTexture(tex1b,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
renderer.updateTexture(bt1a);
renderer.updateTexture(bt1b);
@@ -254,7 +264,8 @@ private Q_SLOTS:
for (auto *t : textures) {
Qt3DRender::Render::Texture *backendTexture = createBackendTexture(t,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
backend.push_back(backendTexture);
renderer.updateTexture(backendTexture);
}
@@ -303,10 +314,12 @@ private Q_SLOTS:
// WHEN
Qt3DRender::Render::Texture *bt1 = createBackendTexture(tex1a,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
Qt3DRender::Render::Texture *bt2 = createBackendTexture(tex1b,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
// THEN
QCOMPARE(bt1->sharedTextureId(), 1);
QCOMPARE(bt2->sharedTextureId(), 1);
@@ -332,10 +345,12 @@ private Q_SLOTS:
// WHEN
Qt3DRender::Render::Texture *bt1 = createBackendTexture(tex1a,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
Qt3DRender::Render::Texture *bt2 = createBackendTexture(tex1b,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
// THEN
QCOMPARE(bt1->sharedTextureId(), 1);
QCOMPARE(bt2->sharedTextureId(), 2);
@@ -372,7 +387,8 @@ private Q_SLOTS:
for (auto *t : textures) {
Qt3DRender::Render::Texture *backendTexture = createBackendTexture(t,
mgrs->textureManager(),
- mgrs->textureImageManager());
+ mgrs->textureImageManager(),
+ &renderer);
backend.push_back(backendTexture);
renderer.updateTexture(backendTexture);
}
@@ -416,13 +432,15 @@ private Q_SLOTS:
void checkTextureImageCleanupState()
{
// GIVEN
+ Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
TestTextureImage img(1);
img.setLayer(2);
img.setMipLevel(3);
// WHEN
Qt3DRender::Render::TextureImage texImgBackend;
- simulateInitialization(&img, &texImgBackend);
+ texImgBackend.setRenderer(&renderer);
+ simulateInitializationSync(&img, &texImgBackend);
texImgBackend.cleanup();
// THEN
@@ -431,11 +449,14 @@ private Q_SLOTS:
QCOMPARE(texImgBackend.mipLevel(), 0);
QCOMPARE(texImgBackend.face(), Qt3DRender::QAbstractTexture::CubeMapPositiveX);
QVERIFY(texImgBackend.dataGenerator().isNull());
+
+ renderer.shutdown();
}
void checkTextureImageInitializeFromPeer()
{
// GIVEN
+ Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
TestTextureImage img(1);
{
@@ -444,7 +465,8 @@ private Q_SLOTS:
img.setMipLevel(3);
Qt3DRender::Render::TextureImage texImgBackend;
- simulateInitialization(&img, &texImgBackend);
+ texImgBackend.setRenderer(&renderer);
+ simulateInitializationSync(&img, &texImgBackend);
// THEN
QCOMPARE(texImgBackend.isEnabled(), true);
@@ -461,28 +483,31 @@ private Q_SLOTS:
img.setEnabled(false);
Qt3DRender::Render::TextureImage texImgBackend;
- simulateInitialization(&img, &texImgBackend);
+ texImgBackend.setRenderer(&renderer);
+ simulateInitializationSync(&img, &texImgBackend);
// THEN
QCOMPARE(texImgBackend.isEnabled(), false);
QCOMPARE(texImgBackend.peerId(), img.id());
}
+
+ renderer.shutdown();
}
void checkTextureImageSceneChangeEvents()
{
// GIVEN
Qt3DRender::Render::TextureImage backendImage;
+ TestTextureImage textureImage(1);
TestRenderer renderer;
backendImage.setRenderer(&renderer);
+ simulateInitializationSync(&textureImage, &backendImage);
{
// WHEN
const bool newValue = false;
- const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("enabled");
- change->setValue(newValue);
- backendImage.sceneChangeEvent(change);
+ textureImage.setEnabled(newValue);
+ backendImage.syncFromFrontEnd(&textureImage, false);
// THEN
QCOMPARE(backendImage.isEnabled(), newValue);
@@ -495,10 +520,8 @@ private Q_SLOTS:
{
// WHEN
const int newValue = 7;
- const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("layer");
- change->setValue(newValue);
- backendImage.sceneChangeEvent(change);
+ textureImage.setLayer(newValue);
+ backendImage.syncFromFrontEnd(&textureImage, false);
// THEN
QCOMPARE(backendImage.layer(), newValue);
@@ -511,10 +534,9 @@ private Q_SLOTS:
{
// WHEN
const int newValue = 3;
- const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("mipLevel");
- change->setValue(newValue);
- backendImage.sceneChangeEvent(change);
+ textureImage.setMipLevel(newValue);
+ backendImage.syncFromFrontEnd(&textureImage, false);
+
// THEN
QCOMPARE(backendImage.mipLevel(), newValue);
@@ -527,10 +549,8 @@ private Q_SLOTS:
{
// WHEN
const Qt3DRender::QAbstractTexture::CubeMapFace newValue = Qt3DRender::QAbstractTexture::CubeMapNegativeX;
- const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("face");
- change->setValue(newValue);
- backendImage.sceneChangeEvent(change);
+ textureImage.setFace(newValue);
+ backendImage.syncFromFrontEnd(&textureImage, false);
// THEN
QCOMPARE(backendImage.face(), newValue);
@@ -542,45 +562,24 @@ private Q_SLOTS:
{
// WHEN
- Qt3DRender::QTextureImageDataGeneratorPtr generator1(new TestImageDataGenerator(883));
- auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("dataGenerator");
- change->setValue(QVariant::fromValue(generator1));
- backendImage.sceneChangeEvent(change);
+ textureImage.updateGenerator();
+ backendImage.syncFromFrontEnd(&textureImage, false);
// THEN
- QCOMPARE(backendImage.dataGenerator(), generator1);
QVERIFY(backendImage.isDirty());
QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
backendImage.unsetDirty();
// WHEN
- Qt3DRender::QTextureImageDataGeneratorPtr generator2(new TestImageDataGenerator(1584));
- change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("dataGenerator");
- change->setValue(QVariant::fromValue(generator2));
- backendImage.sceneChangeEvent(change);
+ textureImage.updateGenerator();
+ backendImage.syncFromFrontEnd(&textureImage, false);
// THEN
QVERIFY(backendImage.isDirty());
QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
backendImage.unsetDirty();
-
- // WHEN
- Qt3DRender::QTextureImageDataGeneratorPtr generator3;
- change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("dataGenerator");
- change->setValue(QVariant::fromValue(generator3));
- backendImage.sceneChangeEvent(change);
-
- // THEN
- QVERIFY(backendImage.dataGenerator().isNull());
- QVERIFY(backendImage.isDirty());
- QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
- renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
- backendImage.unsetDirty();
}
renderer.shutdown();
@@ -598,7 +597,8 @@ private Q_SLOTS:
Qt3DRender::QAbstractTexture* frontendTexture = createQTexture(1, {1}, true);
Qt3DRender::Render::Texture *backendTexture = texMgr->getOrCreateResource(frontendTexture->id());
- simulateInitialization(frontendTexture, backendTexture);
+ backendTexture->setRenderer(&renderer);
+ simulateInitializationSync(frontendTexture, backendTexture);
// THEN
QCOMPARE(backendTexture->textureImageIds().size(), 1);
@@ -613,7 +613,8 @@ private Q_SLOTS:
// WHEN
Qt3DRender::Render::TextureImage *texImgBackend = texImgMgr->getOrCreateResource(texImgFrontend->id());
- simulateInitialization(texImgFrontend, texImgBackend);
+ texImgBackend->setRenderer(&renderer);
+ simulateInitializationSync(texImgFrontend, texImgBackend);
// THEN
qDebug() << frontendGenerator << texImgBackend->dataGenerator();
@@ -638,7 +639,8 @@ private Q_SLOTS:
Qt3DRender::QAbstractTexture* frontendTexture = createQTexture(1, {1}, true);
Qt3DRender::Render::Texture *backendTexture = static_cast<Qt3DRender::Render::Texture *>(textureBackendNodeMapper.create(creationChange(frontendTexture)));
- simulateInitialization(frontendTexture, backendTexture);
+ backendTexture->setRenderer(&renderer);
+ simulateInitializationSync(frontendTexture, backendTexture);
// THEN
QVERIFY(backendTexture != nullptr);
@@ -671,7 +673,8 @@ private Q_SLOTS:
Qt3DRender::QAbstractTexture* frontendTexture = createQTexture(1, {1}, true);
Qt3DRender::Render::Texture *backendTexture = static_cast<Qt3DRender::Render::Texture *>(textureBackendNodeMapper.create(creationChange(frontendTexture)));
- simulateInitialization(frontendTexture, backendTexture);
+ backendTexture->setRenderer(&renderer);
+ simulateInitializationSync(frontendTexture, backendTexture);
// WHEN
textureBackendNodeMapper.destroy(frontendTexture->id());
@@ -683,7 +686,8 @@ private Q_SLOTS:
// WHEN
backendTexture = static_cast<Qt3DRender::Render::Texture *>(textureBackendNodeMapper.create(creationChange(frontendTexture)));
- simulateInitialization(frontendTexture, backendTexture);
+ backendTexture->setRenderer(&renderer);
+ simulateInitializationSync(frontendTexture, backendTexture);
// THEN
QVERIFY(backendTexture != nullptr);
@@ -703,10 +707,10 @@ private Q_SLOTS:
renderer.setNodeManagers(mgrs.data());
Qt3DRender::QTexture2D *texture1 = new Qt3DRender::QTexture2D();
- Qt3DRender::QAbstractTextureImage *image1 = new EmptyTextureImage();
+ TestTextureImage *image1 = new TestTextureImage(1);
Qt3DRender::QTexture2D *texture2 = new Qt3DRender::QTexture2D();
- Qt3DRender::QAbstractTextureImage *image2 = new EmptyTextureImage();
+ TestTextureImage *image2 = new TestTextureImage(2);
Qt3DRender::QTexture2D *texture3 = new Qt3DRender::QTexture2D();
@@ -721,18 +725,17 @@ private Q_SLOTS:
Qt3DRender::Render::TextureImage *backendImage1 = texImgMgr->getOrCreateResource(image1->id());
Qt3DRender::Render::TextureImage *backendImage2 = texImgMgr->getOrCreateResource(image2->id());
- simulateInitialization(texture1, backendTexture1);
- simulateInitialization(texture2, backendTexture2);
- simulateInitialization(texture3, backendTexture3);
- simulateInitialization(image1, backendImage1);
- simulateInitialization(image2, backendImage2);
-
backendTexture1->setRenderer(&renderer);
backendTexture2->setRenderer(&renderer);
backendTexture3->setRenderer(&renderer);
backendImage1->setRenderer(&renderer);
backendImage2->setRenderer(&renderer);
+ simulateInitializationSync(texture1, backendTexture1);
+ simulateInitializationSync(texture2, backendTexture2);
+ simulateInitializationSync(texture3, backendTexture3);
+ simulateInitializationSync(image1, backendImage1);
+ simulateInitializationSync(image2, backendImage2);
// THEN
QCOMPARE(backendTexture1->textureImageIds().size(), 1);
@@ -765,9 +768,8 @@ private Q_SLOTS:
// WHEN
// Make Image1 dirty
- const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("dataGenerator");
- backendImage1->sceneChangeEvent(change);
+ image1->updateGenerator();
+ backendImage1->syncFromFrontEnd(image1, false);
// THEN
QVERIFY(backendImage1->isDirty());
@@ -788,7 +790,8 @@ private Q_SLOTS:
backendTexture3->unsetDirty();
// WHEN
- backendImage2->sceneChangeEvent(change);
+ image2->updateGenerator();
+ backendImage2->syncFromFrontEnd(image2, false);
// THEN
QVERIFY(backendImage2->isDirty());