Index: cc/surfaces/surface_manager.cc |
diff --git a/cc/surfaces/surface_manager.cc b/cc/surfaces/surface_manager.cc |
index 1e3699d30a5c82afe399c92c5288247ff56f943c..920f464cdd03595b76c260b287d41a560fa6b9a4 100644 |
--- a/cc/surfaces/surface_manager.cc |
+++ b/cc/surfaces/surface_manager.cc |
@@ -6,6 +6,7 @@ |
#include "base/logging.h" |
#include "cc/surfaces/surface.h" |
+#include "cc/surfaces/surface_id_allocator.h" |
namespace cc { |
@@ -15,6 +16,12 @@ SurfaceManager::SurfaceManager() { |
SurfaceManager::~SurfaceManager() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ for (SurfaceDestroyList::iterator it = surfaces_to_destroy_.begin(); |
+ it != surfaces_to_destroy_.end(); |
+ ++it) { |
+ DeregisterSurface(it->first->surface_id()); |
+ delete it->first; |
+ } |
} |
void SurfaceManager::RegisterSurface(Surface* surface) { |
@@ -31,6 +38,51 @@ void SurfaceManager::DeregisterSurface(SurfaceId surface_id) { |
surface_map_.erase(it); |
} |
+void SurfaceManager::DestroyOnSequence( |
+ scoped_ptr<Surface> surface, |
+ const std::set<SurfaceSequence>& dependency_set) { |
+ surfaces_to_destroy_.push_back(make_pair(surface.release(), dependency_set)); |
+ SearchForSatisfaction(); |
+} |
+ |
+void SurfaceManager::DidSatisfySequences(SurfaceId id, |
+ std::vector<uint32_t>* sequence) { |
+ for (std::vector<uint32_t>::iterator it = sequence->begin(); |
+ it != sequence->end(); |
+ ++it) { |
+ satisfied_sequences_.insert( |
+ SurfaceSequence(SurfaceIdAllocator::NamespaceForId(id), *it)); |
+ } |
+ sequence->clear(); |
+ SearchForSatisfaction(); |
+} |
+ |
+void SurfaceManager::SearchForSatisfaction() { |
+ for (SurfaceDestroyList::iterator dest_it = surfaces_to_destroy_.begin(); |
+ dest_it != surfaces_to_destroy_.end();) { |
+ std::set<SurfaceSequence>& dependency_set = dest_it->second; |
+ |
+ for (std::set<SurfaceSequence>::iterator it = dependency_set.begin(); |
+ it != dependency_set.end();) { |
+ if (satisfied_sequences_.count(*it) > 0) { |
+ satisfied_sequences_.erase(*it); |
+ std::set<SurfaceSequence>::iterator old_it = it; |
+ ++it; |
+ dependency_set.erase(old_it); |
+ } else { |
+ ++it; |
+ } |
+ } |
+ if (dependency_set.empty()) { |
+ scoped_ptr<Surface> surf(dest_it->first); |
+ DeregisterSurface(surf->surface_id()); |
+ dest_it = surfaces_to_destroy_.erase(dest_it); |
+ } else { |
+ ++dest_it; |
+ } |
+ } |
+} |
+ |
Surface* SurfaceManager::GetSurfaceForId(SurfaceId surface_id) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
SurfaceMap::iterator it = surface_map_.find(surface_id); |