// Copyright 2014 The Chromium 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 "cc/surfaces/surface_manager.h" #include "base/logging.h" #include "cc/surfaces/surface.h" #include "cc/surfaces/surface_id_allocator.h" namespace cc { SurfaceManager::SurfaceManager() { thread_checker_.DetachFromThread(); } SurfaceManager::~SurfaceManager() { DCHECK(thread_checker_.CalledOnValidThread()); for (SurfaceDestroyList::iterator it = surfaces_to_destroy_.begin(); it != surfaces_to_destroy_.end(); ++it) { DeregisterSurface((*it)->surface_id()); delete *it; } } void SurfaceManager::RegisterSurface(Surface* surface) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(surface); DCHECK(!surface_map_.count(surface->surface_id())); surface_map_[surface->surface_id()] = surface; } void SurfaceManager::DeregisterSurface(SurfaceId surface_id) { DCHECK(thread_checker_.CalledOnValidThread()); SurfaceMap::iterator it = surface_map_.find(surface_id); DCHECK(it != surface_map_.end()); surface_map_.erase(it); } void SurfaceManager::Destroy(scoped_ptr surface) { DCHECK(thread_checker_.CalledOnValidThread()); surfaces_to_destroy_.push_back(surface.release()); SearchForSatisfaction(); } void SurfaceManager::DidSatisfySequences(uint32_t id_namespace, std::vector* sequence) { DCHECK(thread_checker_.CalledOnValidThread()); for (std::vector::iterator it = sequence->begin(); it != sequence->end(); ++it) { satisfied_sequences_.insert(SurfaceSequence(id_namespace, *it)); } sequence->clear(); SearchForSatisfaction(); } void SurfaceManager::SearchForSatisfaction() { for (SurfaceDestroyList::iterator dest_it = surfaces_to_destroy_.begin(); dest_it != surfaces_to_destroy_.end();) { (*dest_it)->SatisfyDestructionDependencies(&satisfied_sequences_); if (!(*dest_it)->GetDestructionDependencyCount()) { scoped_ptr surf(*dest_it); 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); if (it == surface_map_.end()) return NULL; return it->second; } bool SurfaceManager::SurfaceModified(SurfaceId surface_id) { DCHECK(thread_checker_.CalledOnValidThread()); bool changed = false; FOR_EACH_OBSERVER(SurfaceDamageObserver, observer_list_, OnSurfaceDamaged(surface_id, &changed)); return changed; } } // namespace cc