D3D12: Upload data from `mStagingBuffer` with `CopyResource()`

This patch uses `CopyResource()` in the code that uploads data from
staging buffer to the destination buffer when handling
`mappedAtCreation`.

Bug: chromium:42242066
Test: dawn_end2end_tests
Change-Id: I60b845507792c682ab2cf33da9ed368f52700143
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/213001
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
diff --git a/src/dawn/native/d3d12/CommandBufferD3D12.cpp b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
index b422f40..2e0f32c 100644
--- a/src/dawn/native/d3d12/CommandBufferD3D12.cpp
+++ b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
@@ -104,12 +104,6 @@
            copySize.depthOrArrayLayers == srcSize.depthOrArrayLayers;
 }
 
-bool CanUseCopyResource(CopyBufferToBufferCmd* copy) {
-    return copy->sourceOffset == 0 && copy->destinationOffset == 0 &&
-           copy->size == copy->source->GetSize() && copy->size == copy->destination->GetSize() &&
-           copy->source->GetAllocatedSize() == copy->destination->GetAllocatedSize();
-}
-
 void RecordWriteTimestampCmd(ID3D12GraphicsCommandList* commandList,
                              QuerySetBase* querySet,
                              uint32_t queryIndex) {
@@ -862,7 +856,8 @@
                 srcBuffer->TrackUsageAndTransitionNow(commandContext, wgpu::BufferUsage::CopySrc);
                 dstBuffer->TrackUsageAndTransitionNow(commandContext, wgpu::BufferUsage::CopyDst);
 
-                if (CanUseCopyResource(copy)) {
+                if (CanCopyBufferToBufferWithCopyResource(srcBuffer, copy->sourceOffset, dstBuffer,
+                                                          copy->destinationOffset, copy->size)) {
                     commandList->CopyResource(dstBuffer->GetD3D12Resource(),
                                               srcBuffer->GetD3D12Resource());
                 } else {
diff --git a/src/dawn/native/d3d12/DeviceD3D12.cpp b/src/dawn/native/d3d12/DeviceD3D12.cpp
index 7929842..789f6d7 100644
--- a/src/dawn/native/d3d12/DeviceD3D12.cpp
+++ b/src/dawn/native/d3d12/DeviceD3D12.cpp
@@ -517,9 +517,15 @@
     Buffer* srcBuffer = ToBackend(source);
     dstBuffer->TrackUsageAndTransitionNow(commandContext, wgpu::BufferUsage::CopyDst);
 
-    commandContext->GetCommandList()->CopyBufferRegion(
-        dstBuffer->GetD3D12Resource(), destinationOffset, srcBuffer->GetD3D12Resource(),
-        sourceOffset, size);
+    if (CanCopyBufferToBufferWithCopyResource(srcBuffer, sourceOffset, dstBuffer, destinationOffset,
+                                              size)) {
+        commandContext->GetCommandList()->CopyResource(dstBuffer->GetD3D12Resource(),
+                                                       srcBuffer->GetD3D12Resource());
+    } else {
+        commandContext->GetCommandList()->CopyBufferRegion(
+            dstBuffer->GetD3D12Resource(), destinationOffset, srcBuffer->GetD3D12Resource(),
+            sourceOffset, size);
+    }
 }
 
 MaybeError Device::CopyFromStagingToTextureImpl(const BufferBase* source,
diff --git a/src/dawn/native/d3d12/UtilsD3D12.cpp b/src/dawn/native/d3d12/UtilsD3D12.cpp
index f2b55c5..6b14e58 100644
--- a/src/dawn/native/d3d12/UtilsD3D12.cpp
+++ b/src/dawn/native/d3d12/UtilsD3D12.cpp
@@ -344,4 +344,14 @@
     object->SetPrivateData(WKPDID_D3DDebugObjectName, objectName.length(), objectName.c_str());
 }
 
+bool CanCopyBufferToBufferWithCopyResource(Buffer* sourceBuffer,
+                                           uint64_t sourceOffset,
+                                           Buffer* destinationBuffer,
+                                           uint64_t destinationOffset,
+                                           uint64_t copySize) {
+    return sourceOffset == 0 && destinationOffset == 0 && sourceBuffer->GetSize() == copySize &&
+           destinationBuffer->GetSize() == copySize &&
+           sourceBuffer->GetAllocatedSize() == destinationBuffer->GetAllocatedSize();
+}
+
 }  // namespace dawn::native::d3d12
diff --git a/src/dawn/native/d3d12/UtilsD3D12.h b/src/dawn/native/d3d12/UtilsD3D12.h
index ec0b7c8..10b902a 100644
--- a/src/dawn/native/d3d12/UtilsD3D12.h
+++ b/src/dawn/native/d3d12/UtilsD3D12.h
@@ -72,6 +72,12 @@
 
 void SetDebugName(Device* device, ID3D12Object* object, const char* prefix, std::string label = "");
 
+bool CanCopyBufferToBufferWithCopyResource(Buffer* sourceBuffer,
+                                           uint64_t sourceOffset,
+                                           Buffer* destinationBuffer,
+                                           uint64_t destinationOffset,
+                                           uint64_t copySize);
+
 }  // namespace dawn::native::d3d12
 
 #endif  // SRC_DAWN_NATIVE_D3D12_UTILSD3D12_H_