summaryrefslogtreecommitdiffstats
path: root/src/render/texture/textureimage.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2018-02-23 09:09:03 +0100
committerPaul Lemire <paul.lemire@kdab.com>2018-02-28 10:46:24 +0000
commit6ea64e9ba9c17302c50648e4c3836a7563679f6a (patch)
treea2e5979fb59e2c49c0e90fb14b04784c71b9e449 /src/render/texture/textureimage.cpp
parent3dff7c204da1d834629544b54b9f6efaafe165e2 (diff)
Load textures in a single frame
Because of texture sharing, Qt3D compares functor before executing them. Instead of blindly loading a TextureImage functor which could turn out to not be used, Qt3D required 2 frames to fully update a texture. This behavior has been removed, now when a texture image functor is updated, it updates the texture in one frame. It is assumed that the user is responsible for declaring only TextureImage that he is actually going to use. Any scene that uses OnDemand rendering and frequently changes a texture image functor can be used to test this. (ex-painted-cube is a good example for KDAB) or paintedtexture-cpp in manual tests Change-Id: I8c2f13876244a862633e10e472e2b49cbd6e126b Task-number: QTBUG-63561 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/texture/textureimage.cpp')
-rw-r--r--src/render/texture/textureimage.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/render/texture/textureimage.cpp b/src/render/texture/textureimage.cpp
index b732be2d9..b718f237b 100644
--- a/src/render/texture/textureimage.cpp
+++ b/src/render/texture/textureimage.cpp
@@ -42,6 +42,7 @@
#include <Qt3DRender/qtextureimage.h>
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/qabstracttextureimage_p.h>
+#include <Qt3DRender/private/texturedatamanager_p.h>
QT_BEGIN_NAMESPACE
@@ -56,6 +57,7 @@ TextureImage::TextureImage()
, m_mipLevel(0)
, m_face(QAbstractTexture::CubeMapPositiveX)
, m_textureManager(nullptr)
+ , m_textureImageDataManager(nullptr)
{
}
@@ -65,6 +67,13 @@ TextureImage::~TextureImage()
void TextureImage::cleanup()
{
+ if (m_generator) {
+ m_textureImageDataManager->releaseData(m_generator, peerId());
+ m_generator.reset();
+ }
+ m_layer = 0;
+ m_mipLevel = 0;
+ m_face = QAbstractTexture::CubeMapPositiveX;
}
void TextureImage::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
@@ -85,7 +94,11 @@ void TextureImage::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr
Q_ASSERT(texture);
// Notify the Texture that it has a new TextureImage and needs an update
texture->addTextureImage(peerId());
+
}
+ // Request functor upload
+ if (m_generator)
+ m_textureImageDataManager->requestData(m_generator, peerId());
}
void TextureImage::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
@@ -100,30 +113,35 @@ void TextureImage::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
} else if (propertyChange->propertyName() == QByteArrayLiteral("face")) {
m_face = static_cast<QAbstractTexture::CubeMapFace>(propertyChange->value().toInt());
} else if (propertyChange->propertyName() == QByteArrayLiteral("dataGenerator")) {
+ // Release ref to generator
+ if (m_generator)
+ m_textureImageDataManager->releaseData(m_generator, peerId());
m_generator = propertyChange->value().value<QTextureImageDataGeneratorPtr>();
+ // Request functor upload
+ if (m_generator)
+ m_textureImageDataManager->requestData(m_generator, peerId());
}
// Notify the Texture that we were updated and request it to schedule an update job
Texture *txt = m_textureManager->data(m_textureProvider);
if (txt != nullptr)
txt->addDirtyFlag(Texture::DirtyImageGenerators);
+
}
markDirty(AbstractRenderer::AllDirty);
BackendNode::sceneChangeEvent(e);
}
-void TextureImage::setTextureManager(TextureManager *manager)
-{
- m_textureManager = manager;
-}
TextureImageFunctor::TextureImageFunctor(AbstractRenderer *renderer,
TextureManager *textureManager,
- TextureImageManager *textureImageManager)
+ TextureImageManager *textureImageManager,
+ TextureImageDataManager *textureImageDataManager)
: m_renderer(renderer)
, m_textureManager(textureManager)
, m_textureImageManager(textureImageManager)
+ , m_textureImageDataManager(textureImageDataManager)
{
}
@@ -131,6 +149,7 @@ Qt3DCore::QBackendNode *TextureImageFunctor::create(const Qt3DCore::QNodeCreated
{
TextureImage *backend = m_textureImageManager->getOrCreateResource(change->subjectId());
backend->setTextureManager(m_textureManager);
+ backend->setTextureImageDataManager(m_textureImageDataManager);
backend->setRenderer(m_renderer);
return backend;
}