| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <memory> |
| |
| #include "flutter/testing/testing.h" |
| #include "gtest/gtest.h" |
| #include "impeller/core/formats.h" |
| #include "impeller/entity/entity_pass_target.h" |
| #include "impeller/entity/entity_playground.h" |
| |
| namespace impeller { |
| namespace testing { |
| |
| using EntityPassTargetTest = EntityPlayground; |
| INSTANTIATE_PLAYGROUND_SUITE(EntityPassTargetTest); |
| |
| TEST_P(EntityPassTargetTest, SwapWithMSAATexture) { |
| if (GetContentContext() |
| ->GetDeviceCapabilities() |
| .SupportsImplicitResolvingMSAA()) { |
| GTEST_SKIP() << "Implicit MSAA is used on this device."; |
| } |
| auto content_context = GetContentContext(); |
| auto buffer = content_context->GetContext()->CreateCommandBuffer(); |
| auto render_target = RenderTarget::CreateOffscreenMSAA( |
| *content_context->GetContext(), |
| *GetContentContext()->GetRenderTargetCache(), {100, 100}, |
| /*mip_count=*/1); |
| |
| auto entity_pass_target = EntityPassTarget(render_target, false, false); |
| |
| auto color0 = entity_pass_target.GetRenderTarget() |
| .GetColorAttachments() |
| .find(0u) |
| ->second; |
| auto msaa_tex = color0.texture; |
| auto resolve_tex = color0.resolve_texture; |
| |
| entity_pass_target.Flip( |
| *content_context->GetContext()->GetResourceAllocator()); |
| |
| color0 = entity_pass_target.GetRenderTarget() |
| .GetColorAttachments() |
| .find(0u) |
| ->second; |
| |
| ASSERT_EQ(msaa_tex, color0.texture); |
| ASSERT_NE(resolve_tex, color0.resolve_texture); |
| } |
| |
| TEST_P(EntityPassTargetTest, SwapWithMSAAImplicitResolve) { |
| auto content_context = GetContentContext(); |
| auto buffer = content_context->GetContext()->CreateCommandBuffer(); |
| auto context = content_context->GetContext(); |
| auto& allocator = *context->GetResourceAllocator(); |
| |
| // Emulate implicit MSAA resolve by making color resolve and msaa texture the |
| // same. |
| RenderTarget render_target; |
| { |
| PixelFormat pixel_format = |
| context->GetCapabilities()->GetDefaultColorFormat(); |
| |
| // Create MSAA color texture. |
| |
| TextureDescriptor color0_tex_desc; |
| color0_tex_desc.storage_mode = StorageMode::kDevicePrivate; |
| color0_tex_desc.type = TextureType::kTexture2DMultisample; |
| color0_tex_desc.sample_count = SampleCount::kCount4; |
| color0_tex_desc.format = pixel_format; |
| color0_tex_desc.size = ISize{100, 100}; |
| color0_tex_desc.usage = static_cast<uint64_t>(TextureUsage::kRenderTarget); |
| |
| auto color0_msaa_tex = allocator.CreateTexture(color0_tex_desc); |
| |
| // Color attachment. |
| |
| ColorAttachment color0; |
| color0.load_action = LoadAction::kDontCare; |
| color0.store_action = StoreAction::kStoreAndMultisampleResolve; |
| color0.texture = color0_msaa_tex; |
| color0.resolve_texture = color0_msaa_tex; |
| |
| render_target.SetColorAttachment(color0, 0u); |
| render_target.SetStencilAttachment(std::nullopt); |
| } |
| |
| auto entity_pass_target = EntityPassTarget(render_target, false, true); |
| |
| auto color0 = entity_pass_target.GetRenderTarget() |
| .GetColorAttachments() |
| .find(0u) |
| ->second; |
| auto msaa_tex = color0.texture; |
| auto resolve_tex = color0.resolve_texture; |
| |
| ASSERT_EQ(msaa_tex, resolve_tex); |
| |
| entity_pass_target.Flip( |
| *content_context->GetContext()->GetResourceAllocator()); |
| |
| color0 = entity_pass_target.GetRenderTarget() |
| .GetColorAttachments() |
| .find(0u) |
| ->second; |
| |
| ASSERT_NE(msaa_tex, color0.texture); |
| ASSERT_NE(resolve_tex, color0.resolve_texture); |
| ASSERT_EQ(color0.texture, color0.resolve_texture); |
| } |
| |
| } // namespace testing |
| } // namespace impeller |