mirror of
https://github.com/lubosz/overte.git
synced 2025-08-08 05:08:25 +02:00
Fix download retries
This commit is contained in:
parent
31d2592e7d
commit
57e8d8e1fd
2 changed files with 135 additions and 146 deletions
|
@ -13,7 +13,7 @@
|
|||
|
||||
#include <mutex>
|
||||
|
||||
#include <QtConcurrent\QtConcurrentRun>
|
||||
#include <QtConcurrent/QtConcurrentRun>
|
||||
|
||||
#include <QCryptographicHash>
|
||||
#include <QImageReader>
|
||||
|
@ -382,8 +382,7 @@ void NetworkTexture::makeRequest() {
|
|||
|
||||
emit loading();
|
||||
|
||||
connect(_ktxHeaderRequest, &ResourceRequest::progress, this, &NetworkTexture::ktxHeaderRequestProgress);
|
||||
connect(_ktxHeaderRequest, &ResourceRequest::finished, this, &NetworkTexture::ktxHeaderRequestFinished);
|
||||
connect(_ktxHeaderRequest, &ResourceRequest::finished, this, &NetworkTexture::ktxInitialDataRequestFinished);
|
||||
|
||||
_bytesReceived = _bytesTotal = _bytes = 0;
|
||||
|
||||
|
@ -455,6 +454,8 @@ void NetworkTexture::startMipRangeRequest(uint16_t low, uint16_t high) {
|
|||
ByteRange range;
|
||||
range.fromInclusive = -HIGH_MIP_MAX_SIZE;
|
||||
_ktxMipRequest->setByteRange(range);
|
||||
|
||||
connect(_ktxMipRequest, &ResourceRequest::finished, this, &NetworkTexture::ktxInitialDataRequestFinished);
|
||||
} else {
|
||||
ByteRange range;
|
||||
range.fromInclusive = ktx::KTX_HEADER_SIZE + _originalKtxDescriptor->header.bytesOfKeyValueData
|
||||
|
@ -462,16 +463,15 @@ void NetworkTexture::startMipRangeRequest(uint16_t low, uint16_t high) {
|
|||
range.toExclusive = ktx::KTX_HEADER_SIZE + _originalKtxDescriptor->header.bytesOfKeyValueData
|
||||
+ _originalKtxDescriptor->images[high + 1]._imageOffset;
|
||||
_ktxMipRequest->setByteRange(range);
|
||||
}
|
||||
|
||||
connect(_ktxMipRequest, &ResourceRequest::progress, this, &NetworkTexture::ktxMipRequestProgress);
|
||||
connect(_ktxMipRequest, &ResourceRequest::finished, this, &NetworkTexture::ktxMipRequestFinished);
|
||||
}
|
||||
|
||||
_ktxMipRequest->send();
|
||||
}
|
||||
|
||||
|
||||
void NetworkTexture::ktxHeaderRequestFinished() {
|
||||
void NetworkTexture::ktxInitialDataRequestFinished() {
|
||||
if (!_ktxHeaderRequest || _ktxHeaderRequest->getState() != ResourceRequest::Finished ||
|
||||
!_ktxMipRequest || _ktxMipRequest->getState() != ResourceRequest::Finished) {
|
||||
// Wait for both request to be finished
|
||||
|
@ -479,9 +479,8 @@ void NetworkTexture::ktxHeaderRequestFinished() {
|
|||
}
|
||||
PROFILE_RANGE(app, __FUNCTION__);
|
||||
|
||||
Q_ASSERT_X(_ktxHeaderRequest, __FUNCTION__, "Request should not be null while in handleReplyFinished");
|
||||
Q_ASSERT_X(_ktxMipRequest, __FUNCTION__, "Request should not be null while in handleReplyFinished");
|
||||
Q_ASSERT(_ktxResourceState == LOADING_INITIAL_DATA);
|
||||
Q_ASSERT_X(_ktxHeaderRequest && _ktxMipRequest, __FUNCTION__, "Request should not be null while in ktxInitialDataRequestFinished");
|
||||
|
||||
PROFILE_ASYNC_END(resource, "Resource:" + getType(), QString::number(_requestID), {
|
||||
{ "from_cache", _ktxHeaderRequest->loadedFromCache() },
|
||||
|
@ -503,7 +502,7 @@ void NetworkTexture::ktxHeaderRequestFinished() {
|
|||
|
||||
_ktxHeaderData = _ktxHeaderRequest->getData();
|
||||
_ktxHighMipData = _ktxMipRequest->getData();
|
||||
maybeHandleFinishedInitialLoad();
|
||||
handleFinishedInitialLoad();
|
||||
} else {
|
||||
if (handleFailedRequest(result)) {
|
||||
_ktxResourceState = PENDING_INITIAL_LOAD;
|
||||
|
@ -521,15 +520,9 @@ void NetworkTexture::ktxHeaderRequestFinished() {
|
|||
}
|
||||
|
||||
void NetworkTexture::ktxMipRequestFinished() {
|
||||
// If this is the high mips request, redirect it to ktxHeaderRequestFinished
|
||||
if (_ktxResourceState == LOADING_INITIAL_DATA) {
|
||||
ktxHeaderRequestFinished();
|
||||
return;
|
||||
}
|
||||
|
||||
PROFILE_RANGE(app, __FUNCTION__);
|
||||
|
||||
Q_ASSERT_X(_ktxMipRequest, "Resource::handleReplyFinished", "Request should not be null while in handleReplyFinished");
|
||||
Q_ASSERT_X(_ktxMipRequest, __FUNCTION__, "Request should not be null while in ktxMipRequestFinished");
|
||||
Q_ASSERT(_ktxResourceState == REQUESTING_MIP);
|
||||
|
||||
PROFILE_ASYNC_END(resource, "Resource:" + getType(), QString::number(_requestID), {
|
||||
|
@ -541,7 +534,7 @@ void NetworkTexture::ktxMipRequestFinished() {
|
|||
|
||||
if (!_ktxMipRequest || _ktxMipRequest != sender()) {
|
||||
// This can happen in the edge case that a request is timed out, but a `finished` signal is emitted before it is deleted.
|
||||
qWarning(networking) << "Received signal NetworkTexture::ktxHeaderRequestFinished from ResourceRequest that is not the current"
|
||||
qWarning(networking) << "Received signal NetworkTexture::ktxMipRequestFinished from ResourceRequest that is not the current"
|
||||
<< " request: " << sender() << ", " << _ktxMipRequest;
|
||||
return;
|
||||
}
|
||||
|
@ -608,12 +601,12 @@ void NetworkTexture::ktxMipRequestFinished() {
|
|||
}
|
||||
|
||||
// This is called when the header or top mips have been loaded
|
||||
void NetworkTexture::maybeHandleFinishedInitialLoad() {
|
||||
void NetworkTexture::handleFinishedInitialLoad() {
|
||||
Q_ASSERT(_ktxResourceState == LOADING_INITIAL_DATA);
|
||||
Q_ASSERT(!_ktxHeaderData.isEmpty() && !_ktxHighMipData.isEmpty());
|
||||
|
||||
PROFILE_RANGE(app, __FUNCTION__);
|
||||
|
||||
if (!_ktxHeaderData.isEmpty() && !_ktxHighMipData.isEmpty()) {
|
||||
// create ktx...
|
||||
auto ktxHeaderData = _ktxHeaderData;
|
||||
auto ktxHighMipData = _ktxHighMipData;
|
||||
|
@ -761,7 +754,6 @@ void NetworkTexture::maybeHandleFinishedInitialLoad() {
|
|||
Q_ARG(int, texture->getHeight()));
|
||||
QMetaObject::invokeMethod(this, "startRequestForNextMipLevel");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkTexture::downloadFinished(const QByteArray& data) {
|
||||
|
|
|
@ -62,10 +62,7 @@ signals:
|
|||
void networkTextureCreated(const QWeakPointer<NetworkTexture>& self);
|
||||
|
||||
public slots:
|
||||
void ktxHeaderRequestProgress(uint64_t bytesReceived, uint64_t bytesTotal) { }
|
||||
void ktxHeaderRequestFinished();
|
||||
|
||||
void ktxMipRequestProgress(uint64_t bytesReceived, uint64_t bytesTotal) { }
|
||||
void ktxInitialDataRequestFinished();
|
||||
void ktxMipRequestFinished();
|
||||
|
||||
protected:
|
||||
|
@ -81,7 +78,7 @@ protected:
|
|||
Q_INVOKABLE void startRequestForNextMipLevel();
|
||||
|
||||
void startMipRangeRequest(uint16_t low, uint16_t high);
|
||||
void maybeHandleFinishedInitialLoad();
|
||||
void handleFinishedInitialLoad();
|
||||
|
||||
private:
|
||||
friend class KTXReader;
|
||||
|
|
Loading…
Reference in a new issue