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