From 5646acbd71d54ab8537e3ca760f628c739eec895 Mon Sep 17 00:00:00 2001 From: Loko Kung Date: Wed, 14 Dec 2022 03:06:10 +0000 Subject: [PATCH] Refactors RenderPassLoadOpTests to adhere to new limit. Bug: dawn:1522 Change-Id: I856bad3d2930d276f1b8b281a7692d38dc82cf21 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/113900 Reviewed-by: Austin Eng Commit-Queue: Loko Kung Kokoro: Kokoro --- .../tests/end2end/RenderPassLoadOpTests.cpp | 346 ++++++++---------- 1 file changed, 157 insertions(+), 189 deletions(-) diff --git a/src/dawn/tests/end2end/RenderPassLoadOpTests.cpp b/src/dawn/tests/end2end/RenderPassLoadOpTests.cpp index 2b16c34f07..ecc0fd4856 100644 --- a/src/dawn/tests/end2end/RenderPassLoadOpTests.cpp +++ b/src/dawn/tests/end2end/RenderPassLoadOpTests.cpp @@ -13,8 +13,11 @@ // limitations under the License. #include +#include #include #include +#include +#include #include "dawn/tests/DawnTest.h" @@ -464,109 +467,13 @@ TEST_P(RenderPassLoadOpTests, LoadOpClearNormalizedFormatsOutOfBound) { } } -// Test clearing multiple color attachments with different big integers can still work correctly. -// TODO(dawn:1522) Refactor and fix this test to avoid deprecation warnings. -TEST_P(RenderPassLoadOpTests, LoadOpClearWithBigInt32ValuesOnMultipleColorAttachments) { +// Test clearing multiple color attachments with different big signed and unsigned integers can +// still work correctly. +TEST_P(RenderPassLoadOpTests, LoadOpClearWithBig32BitIntegralValuesOnMultipleColorAttachments) { constexpr int32_t kMaxInt32RepresentableInFloat = 1 << std::numeric_limits::digits; constexpr int32_t kMinInt32RepresentableInFloat = -kMaxInt32RepresentableInFloat; - using TestCase = std::tuple>; - - constexpr std::array kTestCases = {{ - {wgpu::TextureFormat::R32Sint, - {kMaxInt32RepresentableInFloat, 0, 0, 0}, - {kMaxInt32RepresentableInFloat, 0, 0, 0}}, - {wgpu::TextureFormat::R32Sint, - {kMaxInt32RepresentableInFloat + 1, 0, 0, 0}, - {kMaxInt32RepresentableInFloat + 1, 0, 0, 0}}, - {wgpu::TextureFormat::R32Sint, - {kMinInt32RepresentableInFloat, 0, 0, 0}, - {kMinInt32RepresentableInFloat, 0, 0, 0}}, - {wgpu::TextureFormat::R32Sint, - {kMinInt32RepresentableInFloat - 1, 0, 0, 0}, - {kMinInt32RepresentableInFloat - 1, 0, 0, 0}}, - {wgpu::TextureFormat::RG32Sint, - {kMaxInt32RepresentableInFloat, kMaxInt32RepresentableInFloat + 1, 0, 0}, - {kMaxInt32RepresentableInFloat, kMaxInt32RepresentableInFloat + 1, 0, 0}}, - {wgpu::TextureFormat::RG32Sint, - {kMinInt32RepresentableInFloat, kMinInt32RepresentableInFloat - 1, 0, 0}, - {kMinInt32RepresentableInFloat, kMinInt32RepresentableInFloat - 1, 0, 0}}, - {wgpu::TextureFormat::RGBA32Sint, - {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, - kMaxInt32RepresentableInFloat + 1, kMinInt32RepresentableInFloat - 1}, - {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, - kMaxInt32RepresentableInFloat + 1, kMinInt32RepresentableInFloat - 1}}, - {wgpu::TextureFormat::RGBA32Sint, - {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, - kMaxInt32RepresentableInFloat - 1, kMinInt32RepresentableInFloat + 1}, - {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, - kMaxInt32RepresentableInFloat - 1, kMinInt32RepresentableInFloat + 1}}, - }}; - - std::array textures; - - wgpu::TextureDescriptor textureDescriptor = {}; - textureDescriptor.size = {1, 1, 1}; - textureDescriptor.usage = wgpu::TextureUsage::CopySrc | wgpu::TextureUsage::RenderAttachment; - - std::array colorAttachmentsInfo; - wgpu::CommandEncoder encoder = device.CreateCommandEncoder(); - for (uint32_t i = 0; i < kMaxColorAttachments; ++i) { - textureDescriptor.format = std::get<0>(kTestCases[i]); - textures[i] = device.CreateTexture(&textureDescriptor); - - colorAttachmentsInfo[i].view = textures[i].CreateView(); - colorAttachmentsInfo[i].loadOp = wgpu::LoadOp::Clear; - colorAttachmentsInfo[i].storeOp = wgpu::StoreOp::Store; - colorAttachmentsInfo[i].clearValue = std::get<1>(kTestCases[i]); - } - - wgpu::RenderPassDescriptor renderPassDescriptor = {}; - renderPassDescriptor.colorAttachmentCount = kMaxColorAttachments; - renderPassDescriptor.colorAttachments = colorAttachmentsInfo.data(); - wgpu::RenderPassEncoder renderPass; - if (HasToggleEnabled("apply_clear_big_integer_color_value_with_draw")) { - // When the toggle is enabled, an extra internal pipeline is created which will hit the same - // deprecation issue again, hence we need to check for 2 warnings instead of 1. - EXPECT_DEPRECATION_WARNINGS(renderPass = encoder.BeginRenderPass(&renderPassDescriptor), 2); - } else { - EXPECT_DEPRECATION_WARNING(renderPass = encoder.BeginRenderPass(&renderPassDescriptor)); - } - renderPass.End(); - - std::array outputBuffers; - for (uint32_t i = 0; i < kMaxColorAttachments; ++i) { - wgpu::BufferDescriptor bufferDescriptor = {}; - bufferDescriptor.size = sizeof(int32_t) * 4; - bufferDescriptor.usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst; - outputBuffers[i] = device.CreateBuffer(&bufferDescriptor); - - wgpu::ImageCopyTexture imageCopyTexture = - utils::CreateImageCopyTexture(textures[i], 0, {0, 0, 0}); - wgpu::ImageCopyBuffer imageCopyBuffer = - utils::CreateImageCopyBuffer(outputBuffers[i], 0, kTextureBytesPerRowAlignment); - encoder.CopyTextureToBuffer(&imageCopyTexture, &imageCopyBuffer, &textureDescriptor.size); - } - - wgpu::CommandBuffer commandBuffer = encoder.Finish(); - queue.Submit(1, &commandBuffer); - - for (uint32_t i = 0; i < kMaxColorAttachments; ++i) { - const uint8_t* expected = - reinterpret_cast(std::get<2>(kTestCases[i]).data()); - EXPECT_BUFFER_U8_RANGE_EQ(expected, outputBuffers[i], 0, - sizeof(std::get<2>(kTestCases[i]))); - } -} - -// Test clearing multiple color attachments with different big unsigned integers can still work -// correctly. -// TODO(dawn:1522) Refactor and fix this test to avoid deprecation warnings. -TEST_P(RenderPassLoadOpTests, LoadOpClearWithBigUInt32ValuesOnMultipleColorAttachments) { - constexpr int32_t kMaxUInt32RepresentableInFloat = 1 << std::numeric_limits::digits; - - using TestCase = std::tuple>; - + constexpr uint32_t kMaxUInt32RepresentableInFloat = 1 << std::numeric_limits::digits; std::array testColorForRGBA32Float = { kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat - 1, kMaxUInt32RepresentableInFloat - 2, kMaxUInt32RepresentableInFloat - 3}; @@ -575,105 +482,166 @@ TEST_P(RenderPassLoadOpTests, LoadOpClearWithBigUInt32ValuesOnMultipleColorAttac expectedDataForRGBA32Float[i] = *(reinterpret_cast(&testColorForRGBA32Float[i])); } - const std::array kTestCases = {{ - {wgpu::TextureFormat::R32Uint, - {kMaxUInt32RepresentableInFloat, 0, 0, 0}, - {kMaxUInt32RepresentableInFloat, 0, 0, 0}}, - {wgpu::TextureFormat::R32Uint, - {kMaxUInt32RepresentableInFloat + 1, 0, 0, 0}, - {kMaxUInt32RepresentableInFloat + 1, 0, 0, 0}}, - {wgpu::TextureFormat::RG32Uint, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat, 0, 0}, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat, 0, 0}}, - {wgpu::TextureFormat::RG32Uint, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, 0, 0}, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, 0, 0}}, - {wgpu::TextureFormat::RGBA32Uint, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, - kMaxUInt32RepresentableInFloat - 1, kMaxUInt32RepresentableInFloat - 2}, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, - kMaxUInt32RepresentableInFloat - 1, kMaxUInt32RepresentableInFloat - 2}}, - {wgpu::TextureFormat::RGBA32Sint, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat - 1, - kMaxUInt32RepresentableInFloat - 2, kMaxUInt32RepresentableInFloat - 3}, - {static_cast(kMaxUInt32RepresentableInFloat), - static_cast(kMaxUInt32RepresentableInFloat - 1), - static_cast(kMaxUInt32RepresentableInFloat - 2), - static_cast(kMaxUInt32RepresentableInFloat - 3)}}, - {wgpu::TextureFormat::RGBA32Float, - {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat - 1, - kMaxUInt32RepresentableInFloat - 2, kMaxUInt32RepresentableInFloat - 3}, - expectedDataForRGBA32Float}, - {wgpu::TextureFormat::Undefined, - {kMaxUInt32RepresentableInFloat + 1, kMaxUInt32RepresentableInFloat + 1, 0, 0}, - {0, 0, 0, 0}}, - }}; - - std::array textures; - - wgpu::TextureDescriptor textureDescriptor = {}; - textureDescriptor.size = {1, 1, 1}; - textureDescriptor.usage = wgpu::TextureUsage::CopySrc | wgpu::TextureUsage::RenderAttachment; - - std::array colorAttachmentsInfo; - wgpu::CommandEncoder encoder = device.CreateCommandEncoder(); - for (uint32_t i = 0; i < kMaxColorAttachments; ++i) { - wgpu::TextureFormat format = std::get<0>(kTestCases[i]); - if (format == wgpu::TextureFormat::Undefined) { - textures[i] = nullptr; - colorAttachmentsInfo[i].view = nullptr; - continue; + struct AttachmentCase { + static AttachmentCase Int(wgpu::TextureFormat format, + wgpu::Color clearValue, + const std::array expData) { + AttachmentCase attachmentCase; + static_assert(sizeof(int32_t) * expData.size() == sizeof(attachmentCase.mExpData)); + attachmentCase.mFormat = format; + attachmentCase.mClearValue = clearValue; + memcpy(attachmentCase.mExpData, reinterpret_cast(expData.data()), + sizeof(attachmentCase.mExpData)); + return attachmentCase; + } + static AttachmentCase Uint(wgpu::TextureFormat format, + wgpu::Color clearValue, + const std::array expData) { + AttachmentCase attachmentCase; + static_assert(sizeof(uint32_t) * expData.size() == sizeof(attachmentCase.mExpData)); + attachmentCase.mFormat = format; + attachmentCase.mClearValue = clearValue; + memcpy(attachmentCase.mExpData, reinterpret_cast(expData.data()), + sizeof(attachmentCase.mExpData)); + return attachmentCase; } - textureDescriptor.format = format; - textures[i] = device.CreateTexture(&textureDescriptor); + wgpu::TextureFormat mFormat; + wgpu::Color mClearValue; + uint8_t mExpData[16]; + }; + using TestCase = std::vector; + // Test cases are split so that the attachments in each case do not exceed the default + // maxColorAttachmentBytesPerSample. + static std::vector kTestCases = { + // Full 8 attachment case (Signed 1 and 2 components). + {AttachmentCase::Int(wgpu::TextureFormat::R32Sint, {kMaxInt32RepresentableInFloat, 0, 0, 0}, + {kMaxInt32RepresentableInFloat, 0, 0, 0}), + AttachmentCase::Int(wgpu::TextureFormat::R32Sint, + {kMaxInt32RepresentableInFloat + 1, 0, 0, 0}, + {kMaxInt32RepresentableInFloat + 1, 0, 0, 0}), + AttachmentCase::Int(wgpu::TextureFormat::R32Sint, {kMinInt32RepresentableInFloat, 0, 0, 0}, + {kMinInt32RepresentableInFloat, 0, 0, 0}), + AttachmentCase::Int(wgpu::TextureFormat::R32Sint, + {kMinInt32RepresentableInFloat - 1, 0, 0, 0}, + {kMinInt32RepresentableInFloat - 1, 0, 0, 0}), + AttachmentCase::Int( + wgpu::TextureFormat::RG32Sint, + {kMaxInt32RepresentableInFloat, kMaxInt32RepresentableInFloat + 1, 0, 0}, + {kMaxInt32RepresentableInFloat, kMaxInt32RepresentableInFloat + 1, 0, 0}), + AttachmentCase::Int( + wgpu::TextureFormat::RG32Sint, + {kMinInt32RepresentableInFloat, kMinInt32RepresentableInFloat - 1, 0, 0}, + {kMinInt32RepresentableInFloat, kMinInt32RepresentableInFloat - 1, 0, 0})}, - colorAttachmentsInfo[i].view = textures[i].CreateView(); - colorAttachmentsInfo[i].loadOp = wgpu::LoadOp::Clear; - colorAttachmentsInfo[i].storeOp = wgpu::StoreOp::Store; - colorAttachmentsInfo[i].clearValue = std::get<1>(kTestCases[i]); - } + // Signed 4 components. + {AttachmentCase::Int( + wgpu::TextureFormat::RGBA32Sint, + {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, + kMaxInt32RepresentableInFloat + 1, kMinInt32RepresentableInFloat - 1}, + {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, + kMaxInt32RepresentableInFloat + 1, kMinInt32RepresentableInFloat - 1}), + AttachmentCase::Int( + wgpu::TextureFormat::RGBA32Sint, + {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, + kMaxInt32RepresentableInFloat - 1, kMinInt32RepresentableInFloat + 1}, + {kMaxInt32RepresentableInFloat, kMinInt32RepresentableInFloat, + kMaxInt32RepresentableInFloat - 1, kMinInt32RepresentableInFloat + 1})}, - wgpu::RenderPassDescriptor renderPassDescriptor = {}; - renderPassDescriptor.colorAttachmentCount = kMaxColorAttachments; - renderPassDescriptor.colorAttachments = colorAttachmentsInfo.data(); - wgpu::RenderPassEncoder renderPass; - if (HasToggleEnabled("apply_clear_big_integer_color_value_with_draw")) { - // When the toggle is enabled, an extra internal pipeline is created which will hit the same - // deprecation issue again, hence we need to check for 2 warnings instead of 1. - EXPECT_DEPRECATION_WARNINGS(renderPass = encoder.BeginRenderPass(&renderPassDescriptor), 2); - } else { - EXPECT_DEPRECATION_WARNING(renderPass = encoder.BeginRenderPass(&renderPassDescriptor)); - } - renderPass.End(); + // Unsigned 1 components. + {AttachmentCase::Uint(wgpu::TextureFormat::R32Uint, + {kMaxUInt32RepresentableInFloat, 0, 0, 0}, + {kMaxUInt32RepresentableInFloat, 0, 0, 0}), + AttachmentCase::Uint(wgpu::TextureFormat::R32Uint, + {kMaxUInt32RepresentableInFloat + 1, 0, 0, 0}, + {kMaxUInt32RepresentableInFloat + 1, 0, 0, 0})}, - std::array outputBuffers; - for (uint32_t i = 0; i < kMaxColorAttachments; ++i) { - wgpu::TextureFormat format = std::get<0>(kTestCases[i]); - if (format == wgpu::TextureFormat::Undefined) { - continue; + // Unsigned 2 components. + {AttachmentCase::Uint( + wgpu::TextureFormat::RG32Uint, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat, 0, 0}, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat, 0, 0}), + AttachmentCase::Uint( + wgpu::TextureFormat::RG32Uint, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, 0, 0}, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, 0, 0})}, + + // Unsigned 4 component expectations (with use of signed inputs). + {AttachmentCase::Uint( + wgpu::TextureFormat::RGBA32Uint, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, + kMaxUInt32RepresentableInFloat - 1, kMaxUInt32RepresentableInFloat - 2}, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat + 1, + kMaxUInt32RepresentableInFloat - 1, kMaxUInt32RepresentableInFloat - 2}), + AttachmentCase::Uint( + wgpu::TextureFormat::RGBA32Sint, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat - 1, + kMaxUInt32RepresentableInFloat - 2, kMaxUInt32RepresentableInFloat - 3}, + {static_cast(kMaxUInt32RepresentableInFloat), + static_cast(kMaxUInt32RepresentableInFloat - 1), + static_cast(kMaxUInt32RepresentableInFloat - 2), + static_cast(kMaxUInt32RepresentableInFloat - 3)})}, + + // Unsigned 4 component expectations from float. + {AttachmentCase::Uint( + wgpu::TextureFormat::RGBA32Float, + {kMaxUInt32RepresentableInFloat, kMaxUInt32RepresentableInFloat - 1, + kMaxUInt32RepresentableInFloat - 2, kMaxUInt32RepresentableInFloat - 3}, + expectedDataForRGBA32Float)}}; + + for (const TestCase& testCase : kTestCases) { + std::vector textures; + std::vector colorAttachmentsInfo; + std::vector outputBuffers; + + // Initialize the default values for the textures. + wgpu::TextureDescriptor textureDescriptor = {}; + textureDescriptor.size = {1, 1, 1}; + textureDescriptor.usage = + wgpu::TextureUsage::CopySrc | wgpu::TextureUsage::RenderAttachment; + + wgpu::CommandEncoder encoder = device.CreateCommandEncoder(); + for (const AttachmentCase& attachmentCase : testCase) { + textureDescriptor.format = attachmentCase.mFormat; + textures.push_back(device.CreateTexture(&textureDescriptor)); + + wgpu::RenderPassColorAttachment colorAttachmentInfo = {}; + colorAttachmentInfo.view = textures.back().CreateView(); + colorAttachmentInfo.loadOp = wgpu::LoadOp::Clear; + colorAttachmentInfo.storeOp = wgpu::StoreOp::Store; + colorAttachmentInfo.clearValue = attachmentCase.mClearValue; + colorAttachmentsInfo.push_back(colorAttachmentInfo); + + // Create the output buffer to compare values against. + wgpu::BufferDescriptor bufferDescriptor = {}; + bufferDescriptor.size = sizeof(attachmentCase.mExpData); + bufferDescriptor.usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst; + outputBuffers.push_back(device.CreateBuffer(&bufferDescriptor)); } - wgpu::BufferDescriptor bufferDescriptor = {}; - bufferDescriptor.size = sizeof(int32_t) * 4; - bufferDescriptor.usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst; - outputBuffers[i] = device.CreateBuffer(&bufferDescriptor); + wgpu::RenderPassDescriptor renderPassDescriptor = {}; + renderPassDescriptor.colorAttachmentCount = colorAttachmentsInfo.size(); + renderPassDescriptor.colorAttachments = colorAttachmentsInfo.data(); + wgpu::RenderPassEncoder renderPass; + renderPass = encoder.BeginRenderPass(&renderPassDescriptor); + renderPass.End(); - wgpu::ImageCopyTexture imageCopyTexture = - utils::CreateImageCopyTexture(textures[i], 0, {0, 0, 0}); - wgpu::ImageCopyBuffer imageCopyBuffer = - utils::CreateImageCopyBuffer(outputBuffers[i], 0, kTextureBytesPerRowAlignment); - encoder.CopyTextureToBuffer(&imageCopyTexture, &imageCopyBuffer, &textureDescriptor.size); - } + for (uint32_t i = 0; i < testCase.size(); ++i) { + wgpu::ImageCopyTexture imageCopyTexture = + utils::CreateImageCopyTexture(textures[i], 0, {0, 0, 0}); + wgpu::ImageCopyBuffer imageCopyBuffer = + utils::CreateImageCopyBuffer(outputBuffers[i], 0, kTextureBytesPerRowAlignment); + encoder.CopyTextureToBuffer(&imageCopyTexture, &imageCopyBuffer, + &textureDescriptor.size); + } - wgpu::CommandBuffer commandBuffer = encoder.Finish(); - queue.Submit(1, &commandBuffer); + wgpu::CommandBuffer commandBuffer = encoder.Finish(); + queue.Submit(1, &commandBuffer); - for (uint32_t i = 0; i < kMaxColorAttachments - 1; ++i) { - const uint8_t* expected = - reinterpret_cast(std::get<2>(kTestCases[i]).data()); - EXPECT_BUFFER_U8_RANGE_EQ(expected, outputBuffers[i], 0, - sizeof(std::get<2>(kTestCases[i]))); + for (uint32_t i = 0; i < testCase.size(); ++i) { + EXPECT_BUFFER_U8_RANGE_EQ(testCase.at(i).mExpData, outputBuffers[i], 0, + sizeof(testCase.at(i).mExpData)); + } } }