diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/rhi/qrhi.cpp | 13 | ||||
-rw-r--r-- | src/gui/rhi/qrhi_p_p.h | 1 |
2 files changed, 13 insertions, 1 deletions
diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index 6cc2b48922..f61fa6df59 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -4938,13 +4938,24 @@ void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex, int layer) QRhiResourceUpdateBatch *QRhi::nextResourceUpdateBatch() { auto nextFreeBatch = [this]() -> QRhiResourceUpdateBatch * { - for (int i = 0, ie = d->resUpdPoolMap.count(); i != ie; ++i) { + auto isFree = [this](int i) -> QRhiResourceUpdateBatch * { if (!d->resUpdPoolMap.testBit(i)) { d->resUpdPoolMap.setBit(i); QRhiResourceUpdateBatch *u = d->resUpdPool[i]; QRhiResourceUpdateBatchPrivate::get(u)->poolIndex = i; + d->lastResUpdIdx = i; return u; } + return nullptr; + }; + const int poolSize = d->resUpdPoolMap.count(); + for (int i = d->lastResUpdIdx + 1; i < poolSize; ++i) { + if (QRhiResourceUpdateBatch *u = isFree(i)) + return u; + } + for (int i = 0; i <= d->lastResUpdIdx; ++i) { + if (QRhiResourceUpdateBatch *u = isFree(i)) + return u; } return nullptr; }; diff --git a/src/gui/rhi/qrhi_p_p.h b/src/gui/rhi/qrhi_p_p.h index 1dbb2b9ab9..ef27be6d7d 100644 --- a/src/gui/rhi/qrhi_p_p.h +++ b/src/gui/rhi/qrhi_p_p.h @@ -227,6 +227,7 @@ private: QRhiProfiler profiler; QVarLengthArray<QRhiResourceUpdateBatch *, 4> resUpdPool; QBitArray resUpdPoolMap; + int lastResUpdIdx = -1; QSet<QRhiResource *> resources; QSet<QRhiResource *> pendingDeleteResources; QVarLengthArray<QRhi::CleanupCallback, 4> cleanupCallbacks; |