| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "impeller/entity/render_target_cache.h" |
| #include "impeller/renderer/render_target.h" |
| |
| namespace impeller { |
| |
| RenderTargetCache::RenderTargetCache(std::shared_ptr<Allocator> allocator) |
| : RenderTargetAllocator(std::move(allocator)) {} |
| |
| void RenderTargetCache::Start() { |
| for (auto& td : texture_data_) { |
| td.used_this_frame = false; |
| } |
| } |
| |
| void RenderTargetCache::End() { |
| std::vector<TextureData> retain; |
| |
| for (const auto& td : texture_data_) { |
| if (td.used_this_frame) { |
| retain.push_back(td); |
| } |
| } |
| texture_data_.swap(retain); |
| } |
| |
| size_t RenderTargetCache::CachedTextureCount() const { |
| return texture_data_.size(); |
| } |
| |
| std::shared_ptr<Texture> RenderTargetCache::CreateTexture( |
| const TextureDescriptor& desc) { |
| FML_DCHECK(desc.storage_mode != StorageMode::kHostVisible); |
| FML_DCHECK(desc.usage & |
| static_cast<TextureUsageMask>(TextureUsage::kRenderTarget)); |
| |
| for (auto& td : texture_data_) { |
| const auto other_desc = td.texture->GetTextureDescriptor(); |
| FML_DCHECK(td.texture != nullptr); |
| if (!td.used_this_frame && desc == other_desc) { |
| td.used_this_frame = true; |
| return td.texture; |
| } |
| } |
| auto result = RenderTargetAllocator::CreateTexture(desc); |
| if (result == nullptr) { |
| return result; |
| } |
| texture_data_.push_back( |
| TextureData{.used_this_frame = true, .texture = result}); |
| return result; |
| } |
| |
| } // namespace impeller |