Add "MSAA resolve to mip lvl 1" multithread test.

Bug: dawn:1662
Bug: dawn:462
Change-Id: I13743fcd6f66c515c43b380b00b9235a24fa5a65
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/127080
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Le Hoang Quyen 2023-04-25 16:19:30 +00:00 committed by Dawn LUCI CQ
parent 654416e15b
commit 648db6cfb2
1 changed files with 54 additions and 1 deletions

View File

@ -546,6 +546,56 @@ TEST_P(MultithreadEncodingTests, RenderPassEncodersInParallel) {
}
}
// Test that encoding render passes that resolve to a mip level in parallel should work
TEST_P(MultithreadEncodingTests, RenderPassEncoders_ResolveToMipLevelOne_InParallel) {
// TODO(dawn:462): Issue in the D3D12 validation layers.
DAWN_SUPPRESS_TEST_IF(IsD3D12() && IsBackendValidationEnabled());
constexpr uint32_t kRTSize = 16;
constexpr uint32_t kNumThreads = 10;
wgpu::Texture msaaRenderTarget =
CreateTexture(kRTSize, kRTSize, wgpu::TextureFormat::RGBA8Unorm,
wgpu::TextureUsage::RenderAttachment | wgpu::TextureUsage::CopySrc,
/*mipLevelCount=*/1, /*sampleCount=*/4);
wgpu::TextureView msaaRenderTargetView = msaaRenderTarget.CreateView();
// Resolve to mip level = 1 to force render pass workarounds (there shouldn't be any deadlock
// happening).
wgpu::Texture resolveTarget =
CreateTexture(kRTSize * 2, kRTSize * 2, wgpu::TextureFormat::RGBA8Unorm,
wgpu::TextureUsage::RenderAttachment | wgpu::TextureUsage::CopySrc,
/*mipLevelCount=*/2, /*sampleCount=*/1);
wgpu::TextureViewDescriptor resolveTargetViewDesc;
resolveTargetViewDesc.baseMipLevel = 1;
resolveTargetViewDesc.mipLevelCount = 1;
wgpu::TextureView resolveTargetView = resolveTarget.CreateView(&resolveTargetViewDesc);
std::vector<wgpu::CommandBuffer> commandBuffers(kNumThreads);
utils::RunInParallel(kNumThreads, [=, &commandBuffers](uint32_t index) {
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
// Clear the renderTarget to red.
utils::ComboRenderPassDescriptor renderPass({msaaRenderTargetView});
renderPass.cColorAttachments[0].resolveTarget = resolveTargetView;
renderPass.cColorAttachments[0].clearValue = {1.0f, 0.0f, 0.0f, 1.0f};
wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass);
pass.End();
commandBuffers[index] = encoder.Finish();
});
// Verify that the command buffers executed correctly.
for (auto& commandBuffer : commandBuffers) {
queue.Submit(1, &commandBuffer);
EXPECT_TEXTURE_EQ(utils::RGBA8::kRed, resolveTarget, {0, 0}, 1);
EXPECT_TEXTURE_EQ(utils::RGBA8::kRed, resolveTarget, {kRTSize - 1, kRTSize - 1}, 1);
}
}
// Test that encoding compute passes in parallel should work
TEST_P(MultithreadEncodingTests, ComputePassEncodersInParallel) {
constexpr uint32_t kNumThreads = 10;
@ -1303,10 +1353,13 @@ DAWN_INSTANTIATE_TEST(MultithreadCachingTests,
DAWN_INSTANTIATE_TEST(MultithreadEncodingTests,
D3D12Backend(),
D3D12Backend({"always_resolve_into_zero_level_and_layer"}),
MetalBackend(),
MetalBackend({"always_resolve_into_zero_level_and_layer"}),
OpenGLBackend(),
OpenGLESBackend(),
VulkanBackend());
VulkanBackend(),
VulkanBackend({"always_resolve_into_zero_level_and_layer"}));
DAWN_INSTANTIATE_TEST(
MultithreadTextureCopyTests,