Add 3D Texture T2T copy tests on non-zero mip levels

After adding some e2e tests for 3D texture T2T copy on non-zero mip
levels, it turns out that there is a bug in the e2e test itself.
The 3D texture copy splitter works well.

Bug: dawn:547

Change-Id: I51aef7aaca4caf9c86bfb0590eb0288d17731ba5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/55144
Commit-Queue: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
This commit is contained in:
Yunchao He 2021-06-21 20:09:37 +00:00 committed by Dawn LUCI CQ
parent 3a1a0397d3
commit 987fbed32c
1 changed files with 47 additions and 14 deletions

View File

@ -364,13 +364,15 @@ class CopyTests_T2T : public CopyTests {
dstTexture = device.CreateTexture(&dstDescriptor);
}
// Create an upload buffer and use it to populate the current slice of the texture in
// `level` mip level
// Create an upload buffer and use it to completely populate the subresources of the src
// texture that will be copied from at the given mip level.
const utils::TextureDataCopyLayout srcDataCopyLayout =
utils::GetTextureDataCopyLayoutForTextureAtLevel(
format,
{srcSpec.textureSize.width, srcSpec.textureSize.height,
copySize.depthOrArrayLayers},
srcDimension == wgpu::TextureDimension::e3D
? srcSpec.textureSize.depthOrArrayLayers
: copySize.depthOrArrayLayers},
srcSpec.copyLevel, srcDimension);
// Initialize the source texture
@ -394,13 +396,15 @@ class CopyTests_T2T : public CopyTests {
utils::CreateImageCopyTexture(dstTexture, dstSpec.copyLevel, dstSpec.copyOrigin);
encoder.CopyTextureToTexture(&srcImageCopyTexture, &dstImageCopyTexture, &copySize);
// Copy the data from the srcSpec.copyOrigin.z-th layer to (srcSpec.copyOrigin.z +
// copySize.depthOrArrayLayers)-th layer of dstTexture to outputBuffer
// Create an output buffer and use it to completely populate the subresources of the dst
// texture that will be copied to at the given mip level.
const utils::TextureDataCopyLayout dstDataCopyLayout =
utils::GetTextureDataCopyLayoutForTextureAtLevel(
format,
{dstSpec.textureSize.width, dstSpec.textureSize.height,
copySize.depthOrArrayLayers},
dstDimension == wgpu::TextureDimension::e3D
? dstSpec.textureSize.depthOrArrayLayers
: copySize.depthOrArrayLayers},
dstSpec.copyLevel, dstDimension);
wgpu::BufferDescriptor outputBufferDescriptor;
outputBufferDescriptor.size = dstDataCopyLayout.byteLength;
@ -1193,9 +1197,6 @@ TEST_P(CopyTests_T2B, Texture3DMipUnaligned) {
}
}
// TODO(yunchao.he@intel.com): add T2B tests for 3D textures, like RowPitch,
// RowsPerImage, buffer offset, partial depth range, non-zero level, etc.
DAWN_INSTANTIATE_TEST(CopyTests_T2B,
D3D12Backend(),
MetalBackend(),
@ -1804,9 +1805,6 @@ TEST_P(CopyTests_B2T, Texture3DMipUnaligned) {
}
}
// TODO(yunchao.he@intel.com): add more tests like RowPitch, RowsPerImage, buffer offset, partial
// depth range, non-zero level, etc.
DAWN_INSTANTIATE_TEST(CopyTests_B2T,
D3D12Backend(),
MetalBackend(),
@ -2201,8 +2199,43 @@ TEST_P(CopyTests_T2T, Texture2DArrayTo3DSubRegion) {
wgpu::TextureDimension::e2D, wgpu::TextureDimension::e3D);
}
// TODO(yunchao.he@intel.com): add T2T tests for 3D textures, like RowPitch,
// RowsPerImage, buffer offset, partial depth range, non-zero level, etc.
// Test that copying texture 3D array mips in one texture-to-texture-copy works
TEST_P(CopyTests_T2T, Texture3DMipAligned) {
constexpr uint32_t kWidth = 256;
constexpr uint32_t kHeight = 128;
constexpr uint32_t kDepth = 64u;
TextureSpec defaultTextureSpec;
defaultTextureSpec.textureSize = {kWidth, kHeight, kDepth};
for (unsigned int i = 1; i < 6; ++i) {
TextureSpec textureSpec = defaultTextureSpec;
textureSpec.copyLevel = i;
textureSpec.levelCount = i + 1;
DoTest(textureSpec, textureSpec, {kWidth >> i, kHeight >> i, kDepth >> i},
wgpu::TextureDimension::e3D, wgpu::TextureDimension::e3D);
}
}
// Test that copying texture 3D array mips in one texture-to-texture-copy works
TEST_P(CopyTests_T2T, Texture3DMipUnaligned) {
constexpr uint32_t kWidth = 261;
constexpr uint32_t kHeight = 123;
constexpr uint32_t kDepth = 69u;
TextureSpec defaultTextureSpec;
defaultTextureSpec.textureSize = {kWidth, kHeight, kDepth};
for (unsigned int i = 1; i < 6; ++i) {
TextureSpec textureSpec = defaultTextureSpec;
textureSpec.copyLevel = i;
textureSpec.levelCount = i + 1;
DoTest(textureSpec, textureSpec, {kWidth >> i, kHeight >> i, kDepth >> i},
wgpu::TextureDimension::e3D, wgpu::TextureDimension::e3D);
}
}
DAWN_INSTANTIATE_TEST(
CopyTests_T2T,