12 uint32_t keep_alive_frame_count)
14 keep_alive_frame_count_(keep_alive_frame_count) {}
17 cache_disabled_count_ = 0;
18 for (
auto& td : render_target_data_) {
19 td.used_this_frame =
false;
24 cache_disabled_count_ = 0;
25 std::vector<RenderTargetData> retain;
27 for (RenderTargetData& td : render_target_data_) {
28 if (td.used_this_frame) {
30 }
else if (td.keep_alive_frame_count > 0) {
31 td.keep_alive_frame_count--;
35 render_target_data_.swap(retain);
39 cache_disabled_count_++;
42bool RenderTargetCache::CacheEnabled()
const {
43 return cache_disabled_count_ == 0;
48 if (cache_disabled_count_ == 0) {
51 cache_disabled_count_--;
58 std::string_view label,
60 std::optional<RenderTarget::AttachmentConfig> stencil_attachment_config,
61 const std::shared_ptr<Texture>& existing_color_texture,
62 const std::shared_ptr<Texture>& existing_depth_stencil_texture,
63 std::optional<PixelFormat> target_pixel_format) {
68 FML_DCHECK(existing_color_texture ==
nullptr &&
69 existing_depth_stencil_texture ==
nullptr);
72 .mip_count =
static_cast<size_t>(mip_count),
74 .has_depth_stencil = stencil_attachment_config.has_value(),
78 for (RenderTargetData& render_target_data : render_target_data_) {
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_;
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,
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;
101 if (CacheEnabled()) {
102 render_target_data_.push_back(RenderTargetData{
103 .used_this_frame =
true,
104 .keep_alive_frame_count = keep_alive_frame_count_,
106 .render_target = created_target
109 return created_target;
116 std::string_view label,
118 std::optional<RenderTarget::AttachmentConfig> stencil_attachment_config,
119 const std::shared_ptr<Texture>& existing_color_msaa_texture,
120 const std::shared_ptr<Texture>& existing_color_resolve_texture,
121 const std::shared_ptr<Texture>& existing_depth_stencil_texture,
122 std::optional<PixelFormat> target_pixel_format) {
123 if (size.IsEmpty()) {
127 FML_DCHECK(existing_color_msaa_texture ==
nullptr &&
128 existing_color_resolve_texture ==
nullptr &&
129 existing_depth_stencil_texture ==
nullptr);
132 .mip_count =
static_cast<size_t>(mip_count),
134 .has_depth_stencil = stencil_attachment_config.has_value(),
136 if (CacheEnabled()) {
137 for (RenderTargetData& render_target_data : render_target_data_) {
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_;
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,
150 depth_tex, target_pixel_format);
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;
161 if (CacheEnabled()) {
162 render_target_data_.push_back(RenderTargetData{
163 .used_this_frame =
true,
164 .keep_alive_frame_count = keep_alive_frame_count_,
166 .render_target = created_target
169 return created_target;
173 return render_target_data_.size();
To do anything rendering related with Impeller, you need a context.
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, std::optional< PixelFormat > target_pixel_format=std::nullopt)
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)
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
size_t CachedTextureCount() const
void DisableCache() override
Disable any caching until the next call to EnabledCache.
void EnableCache() override
Re-enable any caching if disabled.
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
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.
#define FML_DCHECK(condition)
std::shared_ptr< ImpellerAllocator > allocator
std::shared_ptr< Texture > resolve_texture
std::shared_ptr< Texture > texture