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);