Flutter Impeller
impeller::RenderTargetCache Class Reference

An implementation of the [RenderTargetAllocator] that caches all allocated texture data for one frame. More...

#include <render_target_cache.h>

Inheritance diagram for impeller::RenderTargetCache:
impeller::RenderTargetAllocator

Public Member Functions

 RenderTargetCache (std::shared_ptr< Allocator > allocator, uint32_t keep_alive_frame_count=4)
 
 ~RenderTargetCache ()=default
 
void Start () override
 Mark the beginning of a frame workload. More...
 
void End () override
 Mark the end of a frame workload. More...
 
void DisableCache () override
 Disable any caching until the next call to EnabledCache. More...
 
void EnableCache () override
 Re-enable any caching if disabled. More...
 
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, std::optional< PixelFormat > target_pixel_format=std::nullopt) override
 
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, std::optional< PixelFormat > target_pixel_format=std::nullopt) override
 
size_t CachedTextureCount () const
 
std::vector< RenderTargetData >::const_iterator GetRenderTargetDataBegin () const
 Visible for testing. More...
 
std::vector< RenderTargetData >::const_iterator GetRenderTargetDataEnd () const
 Visible for testing. More...
 
- Public Member Functions inherited from impeller::RenderTargetAllocator
 RenderTargetAllocator (std::shared_ptr< Allocator > allocator)
 
virtual ~RenderTargetAllocator ()=default
 

Detailed Description

An implementation of the [RenderTargetAllocator] that caches all allocated texture data for one frame.

Any textures unused after a frame are immediately discarded.

Definition at line 18 of file render_target_cache.h.

Constructor & Destructor Documentation

◆ RenderTargetCache()

impeller::RenderTargetCache::RenderTargetCache ( std::shared_ptr< Allocator allocator,
uint32_t  keep_alive_frame_count = 4 
)
explicit

Definition at line 11 of file render_target_cache.cc.

13  : RenderTargetAllocator(std::move(allocator)),
14  keep_alive_frame_count_(keep_alive_frame_count) {}
RenderTargetAllocator(std::shared_ptr< Allocator > allocator)

◆ ~RenderTargetCache()

impeller::RenderTargetCache::~RenderTargetCache ( )
default

Member Function Documentation

◆ CachedTextureCount()

size_t impeller::RenderTargetCache::CachedTextureCount ( ) const

Definition at line 172 of file render_target_cache.cc.

172  {
173  return render_target_data_.size();
174 }

◆ CreateOffscreen()

RenderTarget impeller::RenderTargetCache::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,
std::optional< PixelFormat target_pixel_format = std::nullopt 
)
overridevirtual

Reimplemented from impeller::RenderTargetAllocator.

Definition at line 54 of file render_target_cache.cc.

63  {
64  if (size.IsEmpty()) {
65  return {};
66  }
67 
68  FML_DCHECK(existing_color_texture == nullptr &&
69  existing_depth_stencil_texture == nullptr);
70  auto config = RenderTargetConfig{
71  .size = size,
72  .mip_count = static_cast<size_t>(mip_count),
73  .has_msaa = false,
74  .has_depth_stencil = stencil_attachment_config.has_value(),
75  };
76 
77  if (CacheEnabled()) {
78  for (RenderTargetData& render_target_data : render_target_data_) {
79  const RenderTargetConfig other_config = render_target_data.config;
80  if (!render_target_data.used_this_frame && other_config == config) {
81  render_target_data.used_this_frame = true;
82  render_target_data.keep_alive_frame_count = keep_alive_frame_count_;
83  ColorAttachment color0 =
84  render_target_data.render_target.GetColorAttachment(0);
85  std::optional<DepthAttachment> depth =
86  render_target_data.render_target.GetDepthAttachment();
87  std::shared_ptr<Texture> depth_tex = depth ? depth->texture : nullptr;
89  context, size, mip_count, label, color_attachment_config,
90  stencil_attachment_config, color0.texture, depth_tex,
91  target_pixel_format);
92  }
93  }
94  }
95  RenderTarget created_target = RenderTargetAllocator::CreateOffscreen(
96  context, size, mip_count, label, color_attachment_config,
97  stencil_attachment_config, nullptr, nullptr, target_pixel_format);
98  if (!created_target.IsValid()) {
99  return created_target;
100  }
101  if (CacheEnabled()) {
102  render_target_data_.push_back(RenderTargetData{
103  .used_this_frame = true, //
104  .keep_alive_frame_count = keep_alive_frame_count_, //
105  .config = config, //
106  .render_target = created_target //
107  });
108  }
109  return created_target;
110 }
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, std::optional< PixelFormat > target_pixel_format=std::nullopt)

References impeller::RenderTargetAllocator::CreateOffscreen(), impeller::TSize< T >::IsEmpty(), impeller::RenderTarget::IsValid(), impeller::RenderTargetConfig::size, and impeller::Attachment::texture.

◆ CreateOffscreenMSAA()

RenderTarget impeller::RenderTargetCache::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,
std::optional< PixelFormat target_pixel_format = std::nullopt 
)
overridevirtual

Reimplemented from impeller::RenderTargetAllocator.

Definition at line 112 of file render_target_cache.cc.

122  {
123  if (size.IsEmpty()) {
124  return {};
125  }
126 
127  FML_DCHECK(existing_color_msaa_texture == nullptr &&
128  existing_color_resolve_texture == nullptr &&
129  existing_depth_stencil_texture == nullptr);
130  auto config = RenderTargetConfig{
131  .size = size,
132  .mip_count = static_cast<size_t>(mip_count),
133  .has_msaa = true,
134  .has_depth_stencil = stencil_attachment_config.has_value(),
135  };
136  if (CacheEnabled()) {
137  for (RenderTargetData& render_target_data : render_target_data_) {
138  const RenderTargetConfig other_config = render_target_data.config;
139  if (!render_target_data.used_this_frame && other_config == config) {
140  render_target_data.used_this_frame = true;
141  render_target_data.keep_alive_frame_count = keep_alive_frame_count_;
142  ColorAttachment color0 =
143  render_target_data.render_target.GetColorAttachment(0);
144  std::optional<DepthAttachment> depth =
145  render_target_data.render_target.GetDepthAttachment();
146  std::shared_ptr<Texture> depth_tex = depth ? depth->texture : nullptr;
148  context, size, mip_count, label, color_attachment_config,
149  stencil_attachment_config, color0.texture, color0.resolve_texture,
150  depth_tex, target_pixel_format);
151  }
152  }
153  }
154  RenderTarget created_target = RenderTargetAllocator::CreateOffscreenMSAA(
155  context, size, mip_count, label, color_attachment_config,
156  stencil_attachment_config, nullptr, nullptr, nullptr,
157  target_pixel_format);
158  if (!created_target.IsValid()) {
159  return created_target;
160  }
161  if (CacheEnabled()) {
162  render_target_data_.push_back(RenderTargetData{
163  .used_this_frame = true, //
164  .keep_alive_frame_count = keep_alive_frame_count_, //
165  .config = config, //
166  .render_target = created_target //
167  });
168  }
169  return created_target;
170 }
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, std::optional< PixelFormat > target_pixel_format=std::nullopt)

References impeller::RenderTargetAllocator::CreateOffscreenMSAA(), impeller::TSize< T >::IsEmpty(), impeller::RenderTarget::IsValid(), impeller::Attachment::resolve_texture, impeller::RenderTargetConfig::size, and impeller::Attachment::texture.

◆ DisableCache()

void impeller::RenderTargetCache::DisableCache ( )
overridevirtual

Disable any caching until the next call to EnabledCache.

Reimplemented from impeller::RenderTargetAllocator.

Definition at line 38 of file render_target_cache.cc.

38  {
39  cache_disabled_count_++;
40 }

◆ EnableCache()

void impeller::RenderTargetCache::EnableCache ( )
overridevirtual

Re-enable any caching if disabled.

Reimplemented from impeller::RenderTargetAllocator.

Definition at line 46 of file render_target_cache.cc.

46  {
47  FML_DCHECK(cache_disabled_count_ > 0);
48  if (cache_disabled_count_ == 0) {
49  return;
50  }
51  cache_disabled_count_--;
52 }

◆ End()

void impeller::RenderTargetCache::End ( )
overridevirtual

Mark the end of a frame workload.

   This may be used to deallocate any unused textures. 

Reimplemented from impeller::RenderTargetAllocator.

Definition at line 23 of file render_target_cache.cc.

23  {
24  cache_disabled_count_ = 0;
25  std::vector<RenderTargetData> retain;
26 
27  for (RenderTargetData& td : render_target_data_) {
28  if (td.used_this_frame) {
29  retain.push_back(td);
30  } else if (td.keep_alive_frame_count > 0) {
31  td.keep_alive_frame_count--;
32  retain.push_back(td);
33  }
34  }
35  render_target_data_.swap(retain);
36 }

◆ GetRenderTargetDataBegin()

std::vector<RenderTargetData>::const_iterator impeller::RenderTargetCache::GetRenderTargetDataBegin ( ) const
inline

Visible for testing.

Definition at line 87 of file render_target_cache.h.

88  {
89  return render_target_data_.begin();
90  }

◆ GetRenderTargetDataEnd()

std::vector<RenderTargetData>::const_iterator impeller::RenderTargetCache::GetRenderTargetDataEnd ( ) const
inline

Visible for testing.

Definition at line 93 of file render_target_cache.h.

93  {
94  return render_target_data_.end();
95  }

◆ Start()

void impeller::RenderTargetCache::Start ( )
overridevirtual

Mark the beginning of a frame workload.

  This may be used to reset any tracking state on whether or not a
  particular texture instance is still in use. 

Reimplemented from impeller::RenderTargetAllocator.

Definition at line 16 of file render_target_cache.cc.

16  {
17  cache_disabled_count_ = 0;
18  for (auto& td : render_target_data_) {
19  td.used_this_frame = false;
20  }
21 }

The documentation for this class was generated from the following files: