Fix DynamicUploader::Deallocate to not skip buffers when erasing
Previously, we would both .erase() from a vector, and increment
the index variable. It is not necessary to increment if a value
is erased, because `i` then points to the next value.
Change-Id: If6396fde403524e473aecaf94786fd7f77b49685
Fixed: dawn:2554
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/186480
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Shrek Shao <shrekshao@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Austin Eng <enga@google.com>
diff --git a/src/dawn/native/DynamicUploader.cpp b/src/dawn/native/DynamicUploader.cpp
index 88aeb69..0922df2 100644
--- a/src/dawn/native/DynamicUploader.cpp
+++ b/src/dawn/native/DynamicUploader.cpp
@@ -125,13 +125,16 @@
void DynamicUploader::Deallocate(ExecutionSerial lastCompletedSerial) {
// Reclaim memory within the ring buffers by ticking (or removing requests no longer
// in-flight).
- for (size_t i = 0; i < mRingBuffers.size(); ++i) {
+ size_t i = 0;
+ while (i < mRingBuffers.size()) {
mRingBuffers[i]->mAllocator.Deallocate(lastCompletedSerial);
// Never erase the last buffer as to prevent re-creating smaller buffers
// again. The last buffer is the largest.
if (mRingBuffers[i]->mAllocator.Empty() && i < mRingBuffers.size() - 1) {
mRingBuffers.erase(mRingBuffers.begin() + i);
+ } else {
+ i++;
}
}
mReleasedStagingBuffers.ClearUpTo(lastCompletedSerial);