Index: cc/surfaces/surface_manager.cc |
diff --git a/cc/surfaces/surface_manager.cc b/cc/surfaces/surface_manager.cc |
index e34bb63a40970e6632440d6c40eede3b1f5e61b1..85c33f3c65885c8d4f8c3a4c10aca118d0c3dd5e 100644 |
--- a/cc/surfaces/surface_manager.cc |
+++ b/cc/surfaces/surface_manager.cc |
@@ -47,14 +47,16 @@ SurfaceManager::~SurfaceManager() { |
void SurfaceManager::RegisterSurface(Surface* surface) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(surface); |
- DCHECK(!surface_map_.count(surface->surface_id())); |
+ // We may submit a new CompositorFrame with the same surface ID |
+ // before the previous one has been garbage collected. |
surface_map_[surface->surface_id()] = surface; |
} |
void SurfaceManager::DeregisterSurface(const SurfaceId& surface_id) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
SurfaceMap::iterator it = surface_map_.find(surface_id); |
- DCHECK(it != surface_map_.end()); |
+ if (it == surface_map_.end()) |
+ return; |
surface_map_.erase(it); |
} |
@@ -77,16 +79,6 @@ void SurfaceManager::DidSatisfySequences(uint32_t client_id, |
GarbageCollectSurfaces(); |
} |
-void SurfaceManager::RegisterSurfaceClientId(uint32_t client_id) { |
- bool inserted = valid_surface_client_ids_.insert(client_id).second; |
- DCHECK(inserted); |
-} |
- |
-void SurfaceManager::InvalidateSurfaceClientId(uint32_t client_id) { |
- valid_surface_client_ids_.erase(client_id); |
- GarbageCollectSurfaces(); |
-} |
- |
void SurfaceManager::GarbageCollectSurfaces() { |
// Simple mark and sweep GC. |
// TODO(jbauman): Reduce the amount of work when nothing needs to be |
@@ -142,12 +134,12 @@ void SurfaceManager::GarbageCollectSurfaces() { |
to_destroy.clear(); |
} |
-void SurfaceManager::RegisterSurfaceFactoryClient( |
- uint32_t client_id, |
- SurfaceFactoryClient* client) { |
+void SurfaceManager::RegisterClient(uint32_t client_id, |
+ SurfaceFactoryClient* client) { |
DCHECK(client); |
+ bool inserted = valid_surface_client_ids_.insert(client_id).second; |
+ DCHECK(inserted); |
DCHECK(!namespace_client_map_[client_id].client); |
- DCHECK_EQ(valid_surface_client_ids_.count(client_id), 1u); |
auto iter = namespace_client_map_.find(client_id); |
if (iter == namespace_client_map_.end()) { |
@@ -163,7 +155,7 @@ void SurfaceManager::RegisterSurfaceFactoryClient( |
client->SetBeginFrameSource(iter->second.source); |
} |
-void SurfaceManager::UnregisterSurfaceFactoryClient(uint32_t client_id) { |
+void SurfaceManager::UnregisterClient(uint32_t client_id) { |
DCHECK_EQ(valid_surface_client_ids_.count(client_id), 1u); |
DCHECK_EQ(namespace_client_map_.count(client_id), 1u); |
@@ -177,6 +169,9 @@ void SurfaceManager::UnregisterSurfaceFactoryClient(uint32_t client_id) { |
// checked when removing either clients or relationships. |
if (iter->second.is_empty()) |
namespace_client_map_.erase(iter); |
+ |
+ valid_surface_client_ids_.erase(client_id); |
+ GarbageCollectSurfaces(); |
} |
void SurfaceManager::RegisterBeginFrameSource(BeginFrameSource* source, |