Validate submitted command buffers are unique
Previously validation would miss if the same command buffer was included
more than once in a single Submit call. This now checks that each
Command Buffer in the Submit array is unique and fails validation if
it's not.
Bug: dawn:2537
Change-Id: Iaf60f4c8f2b5159b9133a3fe699ddc2d44e16374
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/185442
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Brandon Jones <bajones@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/native/Queue.cpp b/src/dawn/native/Queue.cpp
index d2539ca..8109c1f 100644
--- a/src/dawn/native/Queue.cpp
+++ b/src/dawn/native/Queue.cpp
@@ -29,6 +29,7 @@
#include <algorithm>
#include <cstring>
+#include <set>
#include <string>
#include <utility>
#include <vector>
@@ -562,9 +563,15 @@
TRACE_EVENT0(GetDevice()->GetPlatform(), Validation, "Queue::ValidateSubmit");
DAWN_TRY(GetDevice()->ValidateObject(this));
+ std::set<CommandBufferBase*> uniqueCommandBuffers;
+
for (uint32_t i = 0; i < commandCount; ++i) {
DAWN_TRY(GetDevice()->ValidateObject(commands[i]));
DAWN_TRY(commands[i]->ValidateCanUseInSubmitNow());
+
+ auto insertResult = uniqueCommandBuffers.insert(commands[i]);
+ DAWN_INVALID_IF(!insertResult.second, "Submit contains duplicates of %s.", commands[i]);
+
const CommandBufferResourceUsage& usages = commands[i]->GetResourceUsages();
for (const BufferBase* buffer : usages.topLevelBuffers) {