diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-06-03 08:26:05 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-06-30 10:10:24 +0000 |
commit | 98667966a96d8dfb346a9d74f5cbb1f7ba95cedc (patch) | |
tree | 7fa1bc7ff30ecb1576a68c5bd10bb48ec53f5439 /src/render/texture/textureimage.cpp | |
parent | db534ab3d8beef4e05dd7318b444385455e8d4d6 (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.cpp | 26 |
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, |