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 
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 
17  for (auto& td : render_target_data_) {
18  td.used_this_frame = false;
19  }
20 }
21 
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 
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;
68  context, size, mip_count, label, color_attachment_config,
69  stencil_attachment_config, color0.texture, depth_tex);
70  }
71  }
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 
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;
121  context, size, mip_count, label, color_attachment_config,
122  stencil_attachment_config, color0.texture, color0.resolve_texture,
123  depth_tex);
124  }
125  }
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 
142  return render_target_data_.size();
143 }
144 
145 } // namespace impeller
To do anything rendering related with Impeller, you need a context.
Definition: context.h:46
a wrapper around the impeller [Allocator] instance that can be used to provide caching of allocated r...
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)
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)
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
RenderTargetCache(std::shared_ptr< Allocator > allocator, uint32_t keep_alive_frame_count=4)
void End() override
Mark the end of a frame workload.
void Start() override
Mark the beginning of a frame workload.
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: comparable.h:95
std::shared_ptr< Texture > resolve_texture
Definition: formats.h:658
std::shared_ptr< Texture > texture
Definition: formats.h:657
constexpr bool IsEmpty() const
Returns true if either of the width or height are 0, negative, or NaN.
Definition: size.h:123