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_