Merge pull request from huffman/fix/ktx-crash

Fix for resource downloads getting capped
This commit is contained in:
Stephen Birarda 2017-05-03 11:25:51 -07:00 committed by GitHub
commit 5d1abe4499
5 changed files with 35 additions and 16 deletions
libraries
gpu/src/gpu
model-networking/src/model-networking
networking/src

View file

@ -324,11 +324,11 @@ public:
void reset() override { }
protected:
std::shared_ptr<storage::FileStorage> maybeOpenFile();
std::shared_ptr<storage::FileStorage> maybeOpenFile() const;
std::mutex _cacheFileCreateMutex;
std::mutex _cacheFileWriteMutex;
std::weak_ptr<storage::FileStorage> _cacheFile;
mutable std::mutex _cacheFileCreateMutex;
mutable std::mutex _cacheFileWriteMutex;
mutable std::weak_ptr<storage::FileStorage> _cacheFile;
std::string _filename;
std::atomic<uint8_t> _minMipLevelAvailable;

View file

@ -128,7 +128,7 @@ KtxStorage::KtxStorage(const std::string& filename) : _filename(filename) {
}
}
std::shared_ptr<storage::FileStorage> KtxStorage::maybeOpenFile() {
std::shared_ptr<storage::FileStorage> KtxStorage::maybeOpenFile() const {
std::shared_ptr<storage::FileStorage> file = _cacheFile.lock();
if (file) {
return file;
@ -154,7 +154,8 @@ PixelsPointer KtxStorage::getMipFace(uint16 level, uint8 face) const {
auto faceOffset = _ktxDescriptor->getMipFaceTexelsOffset(level, face);
auto faceSize = _ktxDescriptor->getMipFaceTexelsSize(level, face);
if (faceSize != 0 && faceOffset != 0) {
result = std::make_shared<storage::FileStorage>(_filename.c_str())->createView(faceSize, faceOffset)->toMemoryStorage();
auto file = maybeOpenFile();
result = file->createView(faceSize, faceOffset)->toMemoryStorage();
}
return result;
}

View file

@ -334,6 +334,22 @@ private:
int _maxNumPixels;
};
NetworkTexture::~NetworkTexture() {
if (_ktxHeaderRequest || _ktxMipRequest) {
if (_ktxHeaderRequest) {
_ktxHeaderRequest->disconnect(this);
_ktxHeaderRequest->deleteLater();
_ktxHeaderRequest = nullptr;
}
if (_ktxMipRequest) {
_ktxMipRequest->disconnect(this);
_ktxMipRequest->deleteLater();
_ktxMipRequest = nullptr;
}
TextureCache::requestCompleted(_self);
}
}
const uint16_t NetworkTexture::NULL_MIP_LEVEL = std::numeric_limits<uint16_t>::max();
void NetworkTexture::makeRequest() {
if (!_sourceIsKTX) {
@ -398,13 +414,18 @@ void NetworkTexture::startRequestForNextMipLevel() {
}
if (_ktxResourceState == WAITING_FOR_MIP_REQUEST) {
auto self = _self.lock();
if (!self) {
return;
}
_ktxResourceState = PENDING_MIP_REQUEST;
init();
float priority = -(float)_originalKtxDescriptor->header.numberOfMipmapLevels + (float)_lowestKnownPopulatedMip;
setLoadPriority(this, priority);
_url.setFragment(QString::number(_lowestKnownPopulatedMip - 1));
TextureCache::attemptRequest(_self);
TextureCache::attemptRequest(self);
}
}
@ -473,19 +494,16 @@ void NetworkTexture::ktxMipRequestFinished() {
texture->assignStoredMip(_ktxMipLevelRangeInFlight.first,
_ktxMipRequest->getData().size(), reinterpret_cast<uint8_t*>(_ktxMipRequest->getData().data()));
_lowestKnownPopulatedMip = _textureSource->getGPUTexture()->minAvailableMipLevel();
}
else {
} else {
qWarning(networking) << "Trying to update mips but texture is null";
}
finishedLoading(true);
_ktxResourceState = WAITING_FOR_MIP_REQUEST;
}
else {
} else {
finishedLoading(false);
if (handleFailedRequest(_ktxMipRequest->getResult())) {
_ktxResourceState = PENDING_MIP_REQUEST;
}
else {
} else {
qWarning(networking) << "Failed to load mip: " << _url;
_ktxResourceState = FAILED_TO_LOAD;
}
@ -497,8 +515,7 @@ void NetworkTexture::ktxMipRequestFinished() {
if (_ktxResourceState == WAITING_FOR_MIP_REQUEST && _lowestRequestedMipLevel < _lowestKnownPopulatedMip) {
startRequestForNextMipLevel();
}
}
else {
} else {
qWarning() << "Mip request finished in an unexpected state: " << _ktxResourceState;
}
}

View file

@ -46,6 +46,7 @@ class NetworkTexture : public Resource, public Texture {
public:
NetworkTexture(const QUrl& url, image::TextureUsage::Type type, const QByteArray& content, int maxNumPixels);
~NetworkTexture() override;
QString getType() const override { return "NetworkTexture"; }

View file

@ -344,7 +344,7 @@ class Resource : public QObject {
public:
Resource(const QUrl& url);
~Resource();
virtual ~Resource();
virtual QString getType() const { return "Resource"; }