Disallow the copies within the same buffer

This patch adds the validation that forbids the buffer-to-buffer copies
when the source and destination buffer are the same one as in D3D12 the
Source and Destination resource cannot be the same when doing a
CopyBufferRegion.

BUG=dawn:17, dawn:420
TEST=dawn_unittests

Change-Id: Ie3e0c5361919ff369240a65d6e7fbae05b8332b0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21780
Reviewed-by: Bryan Bernhart <bryan.bernhart@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
This commit is contained in:
Jiawei Shao
2020-05-19 00:11:11 +00:00
committed by Commit Bot service account
parent 216c10d270
commit 2ae84e9461
3 changed files with 12 additions and 83 deletions

View File

@@ -266,14 +266,13 @@ TEST_F(CopyCommandTest_B2B, BuffersInErrorState) {
}
}
// Test B2B copies within same buffer.
// Test it is not allowed to do B2B copies within same buffer.
TEST_F(CopyCommandTest_B2B, CopyWithinSameBuffer) {
constexpr uint32_t kBufferSize = 16u;
wgpu::Buffer buffer =
CreateBuffer(kBufferSize, wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst);
// When srcOffset < dstOffset, and srcOffset + copySize > dstOffset, it is not allowed because
// the copy regions are overlapping.
// srcOffset < dstOffset, and srcOffset + copySize > dstOffset (overlapping)
{
constexpr uint32_t kSrcOffset = 0u;
constexpr uint32_t kDstOffset = 4u;
@@ -285,19 +284,17 @@ TEST_F(CopyCommandTest_B2B, CopyWithinSameBuffer) {
ASSERT_DEVICE_ERROR(encoder.Finish());
}
// When srcOffset < dstOffset, and srcOffset + copySize == dstOffset, it is allowed
// because the copy regions are not overlapping.
// srcOffset < dstOffset, and srcOffset + copySize == dstOffset (not overlapping)
{
constexpr uint32_t kSrcOffset = 0u;
constexpr uint32_t kDstOffset = 8u;
constexpr uint32_t kCopySize = kDstOffset - kSrcOffset;
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
encoder.CopyBufferToBuffer(buffer, kSrcOffset, buffer, kDstOffset, kCopySize);
encoder.Finish();
ASSERT_DEVICE_ERROR(encoder.Finish());
}
// When srcOffset > dstOffset, and srcOffset < dstOffset + copySize, it is not allowed because
// the copy regions are overlapping.
// srcOffset > dstOffset, and srcOffset < dstOffset + copySize (overlapping)
{
constexpr uint32_t kSrcOffset = 4u;
constexpr uint32_t kDstOffset = 0u;
@@ -309,15 +306,14 @@ TEST_F(CopyCommandTest_B2B, CopyWithinSameBuffer) {
ASSERT_DEVICE_ERROR(encoder.Finish());
}
// When srcOffset > dstOffset, and srcOffset + copySize == dstOffset, it is allowed
// because the copy regions are not overlapping.
// srcOffset > dstOffset, and srcOffset + copySize == dstOffset (not overlapping)
{
constexpr uint32_t kSrcOffset = 8u;
constexpr uint32_t kDstOffset = 0u;
constexpr uint32_t kCopySize = kSrcOffset - kDstOffset;
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
encoder.CopyBufferToBuffer(buffer, kSrcOffset, buffer, kDstOffset, kCopySize);
encoder.Finish();
ASSERT_DEVICE_ERROR(encoder.Finish());
}
}