| Flutter Impeller |

render_target_cache.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
5 #include "impeller/entity/render_target_cache.h"
6 #include "impeller/core/formats.h"
7 #include "impeller/renderer/render_target.h"
8
9 namespace impeller {
10
11 RenderTargetCache::RenderTargetCache(std::shared_ptr<Allocator> allocator,
12 uint32_t keep_alive_frame_count)
13 : RenderTargetAllocator(std::move(allocator)),
14 keep_alive_frame_count_(keep_alive_frame_count) {}
15
16 void RenderTargetCache::Start() {
17 for (auto& td : render_target_data_) {
18 td.used_this_frame = false;
19 }
20 }
21
22 void RenderTargetCache::End() {
23 std::vector<RenderTargetData> retain;
24
25 for (RenderTargetData& td : render_target_data_) {
26 if (td.used_this_frame) {
27 retain.push_back(td);
28 } else if (td.keep_alive_frame_count > 0) {
29 td.keep_alive_frame_count--;
30 retain.push_back(td);
31 }
32 }
33 render_target_data_.swap(retain);
34 }
35
36 RenderTarget RenderTargetCache::CreateOffscreen(
37 const Context& context,
38 ISize size,
39 int mip_count,
40 std::string_view label,
41 RenderTarget::AttachmentConfig color_attachment_config,
42 std::optional<RenderTarget::AttachmentConfig> stencil_attachment_config,
43 const std::shared_ptr<Texture>& existing_color_texture,
44 const std::shared_ptr<Texture>& existing_depth_stencil_texture) {
45 if (size.IsEmpty()) {
46 return {};
47 }
48
49 FML_DCHECK(existing_color_texture == nullptr &&
50 existing_depth_stencil_texture == nullptr);
51 auto config = RenderTargetConfig{
52 .size = size,
53 .mip_count = static_cast<size_t>(mip_count),
54 .has_msaa = false,
55 .has_depth_stencil = stencil_attachment_config.has_value(),
56 };
57 for (RenderTargetData& render_target_data : render_target_data_) {
58 const RenderTargetConfig other_config = render_target_data.config;
59 if (!render_target_data.used_this_frame && other_config == config) {
60 render_target_data.used_this_frame = true;
61 render_target_data.keep_alive_frame_count = keep_alive_frame_count_;
62 ColorAttachment color0 =
63 render_target_data.render_target.GetColorAttachment(0);
64 std::optional<DepthAttachment> depth =
65 render_target_data.render_target.GetDepthAttachment();
66 std::shared_ptr<Texture> depth_tex = depth ? depth->texture : nullptr;
67 return RenderTargetAllocator::CreateOffscreen(
68 context, size, mip_count, label, color_attachment_config,
69 stencil_attachment_config, color0.texture, depth_tex);
70 }
71 }
72 RenderTarget created_target = RenderTargetAllocator::CreateOffscreen(
73 context, size, mip_count, label, color_attachment_config,
74 stencil_attachment_config);
75 if (!created_target.IsValid()) {
76 return created_target;
77 }
78 render_target_data_.push_back(RenderTargetData{
79 .used_this_frame = true, //
80 .keep_alive_frame_count = keep_alive_frame_count_, //
81 .config = config, //
82 .render_target = created_target //
83 });
84 return created_target;
85 }
86
87 RenderTarget RenderTargetCache::CreateOffscreenMSAA(
88 const Context& context,
89 ISize size,
90 int mip_count,
91 std::string_view label,
92 RenderTarget::AttachmentConfigMSAA color_attachment_config,
93 std::optional<RenderTarget::AttachmentConfig> stencil_attachment_config,
94 const std::shared_ptr<Texture>& existing_color_msaa_texture,
95 const std::shared_ptr<Texture>& existing_color_resolve_texture,
96 const std::shared_ptr<Texture>& existing_depth_stencil_texture) {
97 if (size.IsEmpty()) {
98 return {};
99 }
100
101 FML_DCHECK(existing_color_msaa_texture == nullptr &&
102 existing_color_resolve_texture == nullptr &&
103 existing_depth_stencil_texture == nullptr);
104 auto config = RenderTargetConfig{
105 .size = size,
106 .mip_count = static_cast<size_t>(mip_count),
107 .has_msaa = true,
108 .has_depth_stencil = stencil_attachment_config.has_value(),
109 };
110 for (RenderTargetData& render_target_data : render_target_data_) {
111 const RenderTargetConfig other_config = render_target_data.config;
112 if (!render_target_data.used_this_frame && other_config == config) {
113 render_target_data.used_this_frame = true;
114 render_target_data.keep_alive_frame_count = keep_alive_frame_count_;
115 ColorAttachment color0 =
116 render_target_data.render_target.GetColorAttachment(0);
117 std::optional<DepthAttachment> depth =
118 render_target_data.render_target.GetDepthAttachment();
119 std::shared_ptr<Texture> depth_tex = depth ? depth->texture : nullptr;
120 return RenderTargetAllocator::CreateOffscreenMSAA(
121 context, size, mip_count, label, color_attachment_config,
122 stencil_attachment_config, color0.texture, color0.resolve_texture,
123 depth_tex);
124 }
125 }
126 RenderTarget created_target = RenderTargetAllocator::CreateOffscreenMSAA(
127 context, size, mip_count, label, color_attachment_config,
128 stencil_attachment_config);
129 if (!created_target.IsValid()) {
130 return created_target;
131 }
132 render_target_data_.push_back(RenderTargetData{
133 .used_this_frame = true, //
134 .keep_alive_frame_count = keep_alive_frame_count_, //
135 .config = config, //
136 .render_target = created_target //
137 });
138 return created_target;
139 }
140
141 size_t RenderTargetCache::CachedTextureCount() const {
142 return render_target_data_.size();
143 }
144
145 } // namespace impeller
impeller::RenderTargetCache::RenderTargetCache
RenderTargetCache(std::shared_ptr< Allocator > allocator, uint32_t keep_alive_frame_count=4)
Definition: render_target_cache.cc:11
impeller::ColorAttachment
Definition: formats.h:665
formats.h
impeller::RenderTargetCache::End
void End() override
Mark the end of a frame workload.
Definition: render_target_cache.cc:22
impeller::RenderTarget::AttachmentConfigMSAA
Definition: render_target.h:47
impeller::RenderTarget::AttachmentConfig
Definition: render_target.h:40
impeller::RenderTargetAllocator::CreateOffscreen
virtual RenderTarget CreateOffscreen(const Context &context, ISize size, int mip_count, std::string_view label="Offscreen", RenderTarget::AttachmentConfig color_attachment_config=RenderTarget::kDefaultColorAttachmentConfig, std::optional< RenderTarget::AttachmentConfig > stencil_attachment_config=RenderTarget::kDefaultStencilAttachmentConfig, const std::shared_ptr< Texture > &existing_color_texture=nullptr, const std::shared_ptr< Texture > &existing_depth_stencil_texture=nullptr)
Definition: render_target.cc:322
impeller::TSize
Definition: size.h:25
impeller::Attachment::texture
std::shared_ptr< Texture > texture
Definition: formats.h:657
impeller::RenderTargetCache::CreateOffscreenMSAA
RenderTarget CreateOffscreenMSAA(const Context &context, ISize size, int mip_count, std::string_view label="Offscreen MSAA", RenderTarget::AttachmentConfigMSAA color_attachment_config=RenderTarget::kDefaultColorAttachmentConfigMSAA, std::optional< RenderTarget::AttachmentConfig > stencil_attachment_config=RenderTarget::kDefaultStencilAttachmentConfig, const std::shared_ptr< Texture > &existing_color_msaa_texture=nullptr, const std::shared_ptr< Texture > &existing_color_resolve_texture=nullptr, const std::shared_ptr< Texture > &existing_depth_stencil_texture=nullptr) override
Definition: render_target_cache.cc:87
impeller::RenderTargetConfig::size
ISize size
Definition: render_target.h:22
impeller::RenderTarget
Definition: render_target.h:38
impeller::RenderTarget::IsValid
bool IsValid() const
Definition: render_target.cc:23
impeller::RenderTargetCache::CreateOffscreen
RenderTarget CreateOffscreen(const Context &context, ISize size, int mip_count, std::string_view label="Offscreen", RenderTarget::AttachmentConfig color_attachment_config=RenderTarget::kDefaultColorAttachmentConfig, std::optional< RenderTarget::AttachmentConfig > stencil_attachment_config=RenderTarget::kDefaultStencilAttachmentConfig, const std::shared_ptr< Texture > &existing_color_texture=nullptr, const std::shared_ptr< Texture > &existing_depth_stencil_texture=nullptr) override
Definition: render_target_cache.cc:36
impeller::RenderTargetAllocator
a wrapper around the impeller [Allocator] instance that can be used to provide caching of allocated r...
Definition: render_target.h:149
impeller::RenderTargetAllocator::CreateOffscreenMSAA
virtual RenderTarget CreateOffscreenMSAA(const Context &context, ISize size, int mip_count, std::string_view label="Offscreen MSAA", RenderTarget::AttachmentConfigMSAA color_attachment_config=RenderTarget::kDefaultColorAttachmentConfigMSAA, std::optional< RenderTarget::AttachmentConfig > stencil_attachment_config=RenderTarget::kDefaultStencilAttachmentConfig, const std::shared_ptr< Texture > &existing_color_msaa_texture=nullptr, const std::shared_ptr< Texture > &existing_color_resolve_texture=nullptr, const std::shared_ptr< Texture > &existing_depth_stencil_texture=nullptr)
Definition: render_target.cc:376
impeller::Attachment::resolve_texture
std::shared_ptr< Texture > resolve_texture
Definition: formats.h:658
impeller::Context
To do anything rendering related with Impeller, you need a context.
Definition: context.h:46
std
Definition: comparable.h:95
impeller::RenderTargetCache::Start
void Start() override
Mark the beginning of a frame workload.
Definition: render_target_cache.cc:16
impeller::RenderTargetConfig
Definition: render_target.h:21
impeller::TSize::IsEmpty
constexpr bool IsEmpty() const
Returns true if either of the width or height are 0, negative, or NaN.
Definition: size.h:123
render_target.h
render_target_cache.h
impeller
Definition: allocation.cc:12
impeller::RenderTargetCache::CachedTextureCount
size_t CachedTextureCount() const
Definition: render_target_cache.cc:141