| // Copyright 2017 The Fuchsia 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 "src/ui/lib/escher/resources/resource_recycler.h" |
| |
| #include "src/ui/lib/escher/escher.h" |
| |
| namespace escher { |
| |
| ResourceRecycler::ResourceRecycler(EscherWeakPtr escher) |
| : ResourceManager(std::move(escher)), weak_factory_(this) { |
| // Register ourselves for sequence number updates. Register() is defined in |
| // our superclass CommandBufferSequenceListener. |
| this->escher()->command_buffer_sequencer()->AddListener(this); |
| } |
| |
| ResourceRecycler::~ResourceRecycler() { |
| FX_DCHECK(unused_resources_.empty()); |
| // Unregister ourselves. Unregister() is defined in our superclass |
| // CommandBufferSequenceListener. |
| escher()->command_buffer_sequencer()->RemoveListener(this); |
| } |
| |
| void ResourceRecycler::OnReceiveOwnable(std::unique_ptr<Resource> resource) { |
| if (resource->sequence_number() <= last_finished_sequence_number_) { |
| // Recycle immediately. |
| RecycleResource(std::move(resource)); |
| } else { |
| // Defer recycling. |
| unused_resources_[resource.get()] = std::move(resource); |
| } |
| } |
| |
| void ResourceRecycler::OnCommandBufferFinished(uint64_t sequence_number) { |
| FX_DCHECK(sequence_number > last_finished_sequence_number_); |
| last_finished_sequence_number_ = sequence_number; |
| |
| // The sequence number allows us to find all unused resources that are no |
| // longer referenced by a pending command-buffer; destroy these. |
| auto it = unused_resources_.begin(); |
| while (it != unused_resources_.end()) { |
| if (it->second->sequence_number() <= last_finished_sequence_number_) { |
| RecycleResource(std::move(it->second)); |
| it = unused_resources_.erase(it); |
| } else { |
| ++it; |
| } |
| } |
| } |
| |
| } // namespace escher |