summaryrefslogtreecommitdiffstats
path: root/src/render/texture/textureimage.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-06-03 08:26:05 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-06-30 10:10:24 +0000
commit98667966a96d8dfb346a9d74f5cbb1f7ba95cedc (patch)
tree7fa1bc7ff30ecb1576a68c5bd10bb48ec53f5439 /src/render/texture/textureimage.cpp
parentdb534ab3d8beef4e05dd7318b444385455e8d4d6 (diff)
Texture loading improvement
- use texture image data for hash generation - use std::move for pending texture clearing in TextureDataManager - do not add the texture to be loaded again when the status changes Change-Id: Ia0a2670211c890307eebaec6a125a5b4e928a1f8 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/texture/textureimage.cpp')
-rw-r--r--src/render/texture/textureimage.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/render/texture/textureimage.cpp b/src/render/texture/textureimage.cpp
index b2fd1357f..7e2ac6277 100644
--- a/src/render/texture/textureimage.cpp
+++ b/src/render/texture/textureimage.cpp
@@ -105,6 +105,7 @@ void TextureImage::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e);
+ const bool wasDirty = m_dirty;
if (e->type() == PropertyUpdated) {
if (propertyChange->propertyName() == QByteArrayLiteral("layer")) {
m_layer = propertyChange->value().toInt();
@@ -120,7 +121,7 @@ void TextureImage::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
m_dirty = true;
}
}
- if (m_dirty) {// Notify the Texture that we were updated and request it to schedule an update job
+ if (!wasDirty && wasDirty != m_dirty) { // 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->addToPendingTextureJobs();
@@ -153,7 +154,6 @@ void TextureImage::unsetDirty()
void TextureImage::setTextureDataHandle(HTextureData handle)
{
m_textureDataHandle = handle;
- updateDNA();
}
void TextureImage::setStatus(QTextureImage::Status status)
@@ -166,12 +166,24 @@ void TextureImage::setStatus(QTextureImage::Status status)
notifyObservers(e);
}
-void TextureImage::updateDNA()
+union DNABuilder {
+ quint64 dna;
+ quint32 dataHash;
+ quint16 layer;
+ quint8 face;
+ quint8 mipLevel;
+};
+
+void TextureImage::updateDNA(quint32 dataHash)
{
- m_dna = ::qHash(m_layer
- + (m_mipLevel << 4)
- + (static_cast<int>(m_face) << 8)
- + (m_textureDataHandle.handle() << 12));
+ // 64 bits [ 32 bits data ] [ 16 bits layer ] [ 8 bits mip level ] [ 8 bits face ]
+ DNABuilder builder;
+ builder.dataHash = dataHash;
+ builder.layer = m_layer;
+ builder.face = m_face;
+ builder.mipLevel = m_mipLevel;
+
+ m_dna = builder.dna;
}
TextureImageFunctor::TextureImageFunctor(AbstractRenderer *renderer, TextureManager *textureManager,