mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 08:27:05 +00:00
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:
committed by
Commit Bot service account
parent
216c10d270
commit
2ae84e9461
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user