mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-18 01:15:39 +00:00
Support multisampled rendering on Metal - Part I
This patch implements MSAA resolve on Metal backends with the store action MTLStoreActionStoreAndMultisampleResolve. Note that this store action is not supported on all Metal drivers. In the future we will emulate it by doing MSAA resolve in another render pass. The end2end tests ResolveIntoOneMipmapLevelOf2DTexture and ResolveInto2DArrayTexture are temporarily disabled on Intel and NVidia Metal drivers due to driver issues. BUG=dawn:56 TEST=dawn_end2end_tests Change-Id: I7e87aa344691c7d0a389aca80500c7b89a427ea3 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/5900 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
This commit is contained in:
committed by
Commit Bot service account
parent
cf52d711fb
commit
865cad89b9
@@ -370,8 +370,49 @@ TEST_P(MultisampledRenderingTest, ResolveIntoMultipleResolveTargets) {
|
||||
VerifyResolveTarget(kGreen, resolveTexture2);
|
||||
}
|
||||
|
||||
// Test doing MSAA resolve on one multisampled texture twice works correctly.
|
||||
TEST_P(MultisampledRenderingTest, ResolveOneMultisampledTextureTwice) {
|
||||
constexpr bool kTestDepth = false;
|
||||
dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
|
||||
dawn::RenderPipeline pipeline = CreateRenderPipelineWithOneOutputForTest(kTestDepth);
|
||||
|
||||
constexpr dawn::Color kGreen = {0.0f, 0.8f, 0.0f, 0.8f};
|
||||
constexpr uint32_t kSize = sizeof(kGreen);
|
||||
|
||||
dawn::Texture resolveTexture2 = CreateTextureForOutputAttachment(kColorFormat, 1);
|
||||
|
||||
// In first render pass we draw a green triangle and specify mResolveView as the resolve target.
|
||||
{
|
||||
utils::ComboRenderPassDescriptor renderPass = CreateComboRenderPassDescriptorForTest(
|
||||
{mMultisampledColorView}, {mResolveView}, dawn::LoadOp::Clear, dawn::LoadOp::Clear,
|
||||
kTestDepth);
|
||||
|
||||
EncodeRenderPassForTest(commandEncoder, renderPass, pipeline, &kGreen.r, kSize);
|
||||
}
|
||||
|
||||
// In second render pass we do MSAA resolve into resolveTexture2.
|
||||
{
|
||||
dawn::TextureView resolveView2 = resolveTexture2.CreateDefaultTextureView();
|
||||
utils::ComboRenderPassDescriptor renderPass = CreateComboRenderPassDescriptorForTest(
|
||||
{mMultisampledColorView}, {resolveView2}, dawn::LoadOp::Load, dawn::LoadOp::Load,
|
||||
kTestDepth);
|
||||
|
||||
dawn::RenderPassEncoder renderPassEncoder = commandEncoder.BeginRenderPass(&renderPass);
|
||||
renderPassEncoder.EndPass();
|
||||
}
|
||||
|
||||
dawn::CommandBuffer commandBuffer = commandEncoder.Finish();
|
||||
dawn::Queue queue = device.CreateQueue();
|
||||
queue.Submit(1, &commandBuffer);
|
||||
|
||||
VerifyResolveTarget(kGreen, mResolveTexture);
|
||||
VerifyResolveTarget(kGreen, resolveTexture2);
|
||||
}
|
||||
|
||||
// Test using a layer of a 2D texture as resolve target works correctly.
|
||||
TEST_P(MultisampledRenderingTest, ResolveIntoOneMipmapLevelOf2DTexture) {
|
||||
// TODO(jiawei.shao@intel.com): investigate why this case fails on Intel and Nvidia.
|
||||
DAWN_SKIP_TEST_IF(IsMetal() && (IsIntel() || IsNvidia()));
|
||||
constexpr uint32_t kBaseMipLevel = 2;
|
||||
|
||||
dawn::TextureViewDescriptor textureViewDescriptor;
|
||||
@@ -410,6 +451,8 @@ TEST_P(MultisampledRenderingTest, ResolveIntoOneMipmapLevelOf2DTexture) {
|
||||
|
||||
// Test using a level or a layer of a 2D array texture as resolve target works correctly.
|
||||
TEST_P(MultisampledRenderingTest, ResolveInto2DArrayTexture) {
|
||||
// TODO(jiawei.shao@intel.com): investigate why this case fails on Intel and Nvidia.
|
||||
DAWN_SKIP_TEST_IF(IsMetal() && (IsIntel() || IsNvidia()));
|
||||
dawn::TextureView multisampledColorView2 =
|
||||
CreateTextureForOutputAttachment(kColorFormat, kSampleCount).CreateDefaultTextureView();
|
||||
|
||||
@@ -468,5 +511,4 @@ TEST_P(MultisampledRenderingTest, ResolveInto2DArrayTexture) {
|
||||
VerifyResolveTarget(kGreen, resolveTexture2, kBaseMipLevel2, kBaseArrayLayer2);
|
||||
}
|
||||
|
||||
// TODO(jiawei.shao@intel.com): enable multisampled rendering on all Dawn backends.
|
||||
DAWN_INSTANTIATE_TEST(MultisampledRenderingTest, D3D12Backend, OpenGLBackend, VulkanBackend);
|
||||
DAWN_INSTANTIATE_TEST(MultisampledRenderingTest, D3D12Backend, OpenGLBackend, MetalBackend, VulkanBackend);
|
||||
|
||||
Reference in New Issue
Block a user