Have Queue timeline tasks resolve in order
Use QueueBase to track fences in flight and map requests so that they
can be resolved in the order they were added. Before these tasks were
separately tracked in FenceSignalTracker and MapRequestTracker, so tasks
would be resolving out of order.
Bug: dawn:404
Change-Id: I8b58fb72c99f43bc4593f56e08920d48ac506157
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/29441
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Natasha Lee <natlee@microsoft.com>
diff --git a/src/dawn_native/Buffer.cpp b/src/dawn_native/Buffer.cpp
index 519b0e7..b4605dc 100644
--- a/src/dawn_native/Buffer.cpp
+++ b/src/dawn_native/Buffer.cpp
@@ -19,7 +19,6 @@
#include "dawn_native/Device.h"
#include "dawn_native/DynamicUploader.h"
#include "dawn_native/ErrorData.h"
-#include "dawn_native/MapRequestTracker.h"
#include "dawn_native/Queue.h"
#include "dawn_native/ValidationUtils_autogen.h"
@@ -30,6 +29,19 @@
namespace dawn_native {
namespace {
+ struct MapRequestTask : QueueBase::TaskInFlight {
+ MapRequestTask(Ref<BufferBase> buffer, MapRequestID id)
+ : buffer(std::move(buffer)), id(id) {
+ }
+ void Finish() override {
+ buffer->OnMapRequestCompleted(id);
+ }
+ ~MapRequestTask() override = default;
+
+ private:
+ Ref<BufferBase> buffer;
+ MapRequestID id;
+ };
class ErrorBuffer final : public BufferBase {
public:
@@ -261,9 +273,10 @@
CallMapCallback(mLastMapID, WGPUBufferMapAsyncStatus_DeviceLost);
return;
}
-
- MapRequestTracker* tracker = GetDevice()->GetMapRequestTracker();
- tracker->Track(this, mLastMapID);
+ std::unique_ptr<MapRequestTask> request =
+ std::make_unique<MapRequestTask>(this, mLastMapID);
+ GetDevice()->GetDefaultQueue()->TrackTask(std::move(request),
+ GetDevice()->GetPendingCommandSerial());
}
void* BufferBase::GetMappedRange(size_t offset, size_t size) {