Flutter Engine
The Flutter Engine
surface_vk.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
10
11namespace impeller {
12
13std::unique_ptr<SurfaceVK> SurfaceVK::WrapSwapchainImage(
14 const std::shared_ptr<SwapchainTransientsVK>& transients,
15 const std::shared_ptr<TextureSourceVK>& swapchain_image,
16 SwapCallback swap_callback) {
17 if (!transients || !swapchain_image || !swap_callback) {
18 return nullptr;
19 }
20
21 auto context = transients->GetContext().lock();
22 if (!context) {
23 return nullptr;
24 }
25
26 const auto enable_msaa = transients->IsMSAAEnabled();
27
28 const auto swapchain_tex_desc = swapchain_image->GetTextureDescriptor();
29
30 TextureDescriptor resolve_tex_desc;
31 resolve_tex_desc.type = TextureType::kTexture2D;
32 resolve_tex_desc.format = swapchain_tex_desc.format;
33 resolve_tex_desc.size = swapchain_tex_desc.size;
34 resolve_tex_desc.usage = TextureUsage::kRenderTarget;
35 resolve_tex_desc.sample_count = SampleCount::kCount1;
37
38 std::shared_ptr<Texture> resolve_tex =
39 std::make_shared<TextureVK>(context, //
40 swapchain_image //
41 );
42
43 if (!resolve_tex) {
44 return nullptr;
45 }
46 resolve_tex->SetLabel("ImpellerOnscreenResolve");
47
48 ColorAttachment color0;
51 if (enable_msaa) {
52 color0.texture = transients->GetMSAATexture();
54 color0.resolve_texture = resolve_tex;
55 } else {
56 color0.texture = resolve_tex;
58 }
59
60 RenderTarget render_target_desc;
61 render_target_desc.SetColorAttachment(color0, 0u);
62 render_target_desc.SetupDepthStencilAttachments(
63 /*context=*/*context, //
64 /*allocator=*/*context->GetResourceAllocator(), //
65 /*size=*/swapchain_tex_desc.size, //
66 /*msaa=*/enable_msaa, //
67 /*label=*/"Onscreen", //
68 /*stencil_attachment_config=*/
70 /*depth_stencil_texture=*/transients->GetDepthStencilTexture() //
71 );
72
73 // The constructor is private. So make_unique may not be used.
74 return std::unique_ptr<SurfaceVK>(
75 new SurfaceVK(render_target_desc, std::move(swap_callback)));
76}
77
78SurfaceVK::SurfaceVK(const RenderTarget& target, SwapCallback swap_callback)
79 : Surface(target), swap_callback_(std::move(swap_callback)) {}
80
81SurfaceVK::~SurfaceVK() = default;
82
83bool SurfaceVK::Present() const {
84 return swap_callback_ ? swap_callback_() : false;
85}
86
87} // namespace impeller
RenderTarget & SetColorAttachment(const ColorAttachment &attachment, size_t index)
void SetupDepthStencilAttachments(const Context &context, Allocator &allocator, ISize size, bool msaa, const std::string &label="Offscreen", RenderTarget::AttachmentConfig stencil_attachment_config=RenderTarget::kDefaultStencilAttachmentConfig, const std::shared_ptr< Texture > &depth_stencil_texture=nullptr)
static constexpr AttachmentConfig kDefaultStencilAttachmentConfig
Definition: render_target.h:68
~SurfaceVK() override
static std::unique_ptr< SurfaceVK > WrapSwapchainImage(const std::shared_ptr< SwapchainTransientsVK > &transients, const std::shared_ptr< TextureSourceVK > &swapchain_image, SwapCallback swap_callback)
Wrap the swapchain image in a Surface, which provides the additional configuration required for usage...
Definition: surface_vk.cc:13
std::function< bool(void)> SwapCallback
Definition: surface_vk.h:19
uint32_t * target
Definition: ref_ptr.h:256
std::shared_ptr< Texture > resolve_texture
Definition: formats.h:652
LoadAction load_action
Definition: formats.h:653
std::shared_ptr< Texture > texture
Definition: formats.h:651
StoreAction store_action
Definition: formats.h:654
static constexpr Color DarkSlateGray()
Definition: color.h:420
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...