From 0263021c0c5ad88026e1df9e865f2abcd0905085 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 3 May 2017 10:26:51 -0700 Subject: [PATCH 1/5] Fix loaded being reset to false for KTX resources --- .../src/model-networking/TextureCache.cpp | 2 +- libraries/networking/src/ResourceCache.cpp | 12 +++++++----- libraries/networking/src/ResourceCache.h | 7 ++++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 7745766177..7c1ec74eb8 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -421,7 +421,7 @@ void NetworkTexture::startRequestForNextMipLevel() { _ktxResourceState = PENDING_MIP_REQUEST; - init(); + init(false); float priority = -(float)_originalKtxDescriptor->header.numberOfMipmapLevels + (float)_lowestKnownPopulatedMip; setLoadPriority(this, priority); _url.setFragment(QString::number(_lowestKnownPopulatedMip - 1)); diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 8d4edab2d5..88ea68780b 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -533,13 +533,13 @@ void Resource::ensureLoading() { } void Resource::setLoadPriority(const QPointer& owner, float priority) { - if (!(_failedToLoad || _loaded)) { + if (!(_failedToLoad)) { _loadPriorities.insert(owner, priority); } } void Resource::setLoadPriorities(const QHash, float>& priorities) { - if (_failedToLoad || _loaded) { + if (_failedToLoad) { return; } for (QHash, float>::const_iterator it = priorities.constBegin(); @@ -549,7 +549,7 @@ void Resource::setLoadPriorities(const QHash, float>& prioriti } void Resource::clearLoadPriority(const QPointer& owner) { - if (!(_failedToLoad || _loaded)) { + if (!(_failedToLoad)) { _loadPriorities.remove(owner); } } @@ -612,10 +612,12 @@ void Resource::allReferencesCleared() { } } -void Resource::init() { +void Resource::init(bool resetLoaded) { _startedLoading = false; _failedToLoad = false; - _loaded = false; + if (resetLoaded) { + _loaded = false; + } _attempts = 0; _activeUrl = _url; diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 51c8d8554a..a908e11bcc 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -425,7 +425,7 @@ protected slots: void attemptRequest(); protected: - virtual void init(); + virtual void init(bool resetLoaded = true); /// Called by ResourceCache to begin loading this Resource. /// This method can be overriden to provide custom request functionality. If this is done, @@ -454,9 +454,14 @@ protected: QUrl _url; QUrl _activeUrl; ByteRange _requestByteRange; + + // _loaded == true means we are in a loaded and usable state. It is possible that there may still be + // active requests/loading while in this state. Example: Progressive KTX downloads, where higher resolution + // mips are being download. bool _startedLoading = false; bool _failedToLoad = false; bool _loaded = false; + QHash, float> _loadPriorities; QWeakPointer _self; QPointer _cache; From 2c19c5f04526326108ad9b4e7ab42a5a604be5a6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 3 May 2017 10:27:20 -0700 Subject: [PATCH 2/5] Fix KTX creation not handling invalid storage --- libraries/ktx/src/ktx/Reader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ktx/src/ktx/Reader.cpp b/libraries/ktx/src/ktx/Reader.cpp index b22f262e85..440e2f048c 100644 --- a/libraries/ktx/src/ktx/Reader.cpp +++ b/libraries/ktx/src/ktx/Reader.cpp @@ -174,7 +174,7 @@ namespace ktx { } std::unique_ptr KTX::create(const StoragePointer& src) { - if (!src) { + if (!src || !(*src)) { return nullptr; } From 7999ed6f605b29d5082d408be779a0a8b82122b2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 3 May 2017 10:28:00 -0700 Subject: [PATCH 3/5] Fix Resource::refresh for NetworkTexture --- .../src/model-networking/TextureCache.cpp | 21 +++++++++++++++++++ .../src/model-networking/TextureCache.h | 2 ++ libraries/networking/src/ResourceCache.h | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 7c1ec74eb8..969058c240 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -682,6 +682,27 @@ void NetworkTexture::loadContent(const QByteArray& content) { QThreadPool::globalInstance()->start(new ImageReader(_self, _url, content, _maxNumPixels)); } +void NetworkTexture::refresh() { + if ((_ktxHeaderRequest || _ktxMipRequest) && !loaded && !_failedToLoad) { + return; + } + if (_ktxHeaderRequest || _ktxMipRequest) { + if (_ktxHeaderRequest) { + _ktxHeaderRequest->disconnect(this); + _ktxHeaderRequest->deleteLater(); + _ktxHeaderRequest = nullptr; + } + if (_ktxMipRequest) { + _ktxMipRequest->disconnect(this); + _ktxMipRequest->deleteLater(); + _ktxMipRequest = nullptr; + } + ResourceCache::requestCompleted(_self); + } + + Resource::refresh(); +} + ImageReader::ImageReader(const QWeakPointer& resource, const QUrl& url, const QByteArray& data, int maxNumPixels) : _resource(resource), _url(url), diff --git a/libraries/model-networking/src/model-networking/TextureCache.h b/libraries/model-networking/src/model-networking/TextureCache.h index c7a7799216..aabc7fcb85 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.h +++ b/libraries/model-networking/src/model-networking/TextureCache.h @@ -58,6 +58,8 @@ public: gpu::TexturePointer getFallbackTexture() const; + void refresh() override; + signals: void networkTextureCreated(const QWeakPointer& self); diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index a908e11bcc..f94e1e26d2 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -385,7 +385,7 @@ public: float getProgress() const { return (_bytesTotal <= 0) ? 0.0f : (float)_bytesReceived / _bytesTotal; } /// Refreshes the resource. - void refresh(); + virtual void refresh(); void setSelf(const QWeakPointer& self) { _self = self; } From a886963e20699192cfa0effccb312a0840f1fc97 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 3 May 2017 11:12:11 -0700 Subject: [PATCH 4/5] Fix refresh crash with ktx textures --- .../src/model-networking/TextureCache.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 969058c240..06ff891cb9 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -472,6 +472,10 @@ void NetworkTexture::startMipRangeRequest(uint16_t low, uint16_t high) { void NetworkTexture::ktxHeaderRequestFinished() { Q_ASSERT(_ktxResourceState == LOADING_INITIAL_DATA); + if (!_ktxHeaderRequest) { + return; + } + _ktxHeaderRequestFinished = true; maybeHandleFinishedInitialLoad(); } @@ -479,6 +483,10 @@ void NetworkTexture::ktxHeaderRequestFinished() { void NetworkTexture::ktxMipRequestFinished() { Q_ASSERT(_ktxResourceState == LOADING_INITIAL_DATA || _ktxResourceState == REQUESTING_MIP); + if (!_ktxMipRequest) { + return; + } + if (_ktxResourceState == LOADING_INITIAL_DATA) { _ktxHighMipRequestFinished = true; maybeHandleFinishedInitialLoad(); @@ -683,7 +691,7 @@ void NetworkTexture::loadContent(const QByteArray& content) { } void NetworkTexture::refresh() { - if ((_ktxHeaderRequest || _ktxMipRequest) && !loaded && !_failedToLoad) { + if ((_ktxHeaderRequest || _ktxMipRequest) && !_loaded && !_failedToLoad) { return; } if (_ktxHeaderRequest || _ktxMipRequest) { From 87a685c4f9302ba15bc9b02237eacb2d2982fe68 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 4 May 2017 13:41:20 -0700 Subject: [PATCH 5/5] Fix OSX warning in TextureCache --- .../model-networking/src/model-networking/TextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model-networking/src/model-networking/TextureCache.cpp b/libraries/model-networking/src/model-networking/TextureCache.cpp index 06ff891cb9..9653cde7d8 100644 --- a/libraries/model-networking/src/model-networking/TextureCache.cpp +++ b/libraries/model-networking/src/model-networking/TextureCache.cpp @@ -705,7 +705,7 @@ void NetworkTexture::refresh() { _ktxMipRequest->deleteLater(); _ktxMipRequest = nullptr; } - ResourceCache::requestCompleted(_self); + TextureCache::requestCompleted(_self); } Resource::refresh();