| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/surfaces/surface_manager.h" | 5 #include "cc/surfaces/surface_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <queue> | 10 #include <queue> |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 // Remove all temporary references on shutdown. | 49 // Remove all temporary references on shutdown. |
| 50 temporary_references_.clear(); | 50 temporary_references_.clear(); |
| 51 temporary_reference_ranges_.clear(); | 51 temporary_reference_ranges_.clear(); |
| 52 | 52 |
| 53 GarbageCollectSurfaces(); | 53 GarbageCollectSurfaces(); |
| 54 } | 54 } |
| 55 | 55 |
| 56 for (SurfaceDestroyList::iterator it = surfaces_to_destroy_.begin(); | 56 for (SurfaceDestroyList::iterator it = surfaces_to_destroy_.begin(); |
| 57 it != surfaces_to_destroy_.end(); | 57 it != surfaces_to_destroy_.end(); |
| 58 ++it) { | 58 ++it) { |
| 59 DeregisterSurface((*it)->surface_id()); | 59 UnregisterSurface((*it)->surface_id()); |
| 60 } | 60 } |
| 61 surfaces_to_destroy_.clear(); | 61 surfaces_to_destroy_.clear(); |
| 62 | 62 |
| 63 // All surface factory clients should be unregistered prior to SurfaceManager | 63 // All surface factory clients should be unregistered prior to SurfaceManager |
| 64 // destruction. | 64 // destruction. |
| 65 DCHECK_EQ(clients_.size(), 0u); | 65 DCHECK_EQ(clients_.size(), 0u); |
| 66 DCHECK_EQ(registered_sources_.size(), 0u); | 66 DCHECK_EQ(registered_sources_.size(), 0u); |
| 67 } | 67 } |
| 68 | 68 |
| 69 #if DCHECK_IS_ON() | 69 #if DCHECK_IS_ON() |
| (...skipping 11 matching lines...) Expand all Loading... |
| 81 void SurfaceManager::SetDependencyTracker( | 81 void SurfaceManager::SetDependencyTracker( |
| 82 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker) { | 82 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker) { |
| 83 dependency_tracker_ = std::move(dependency_tracker); | 83 dependency_tracker_ = std::move(dependency_tracker); |
| 84 } | 84 } |
| 85 | 85 |
| 86 void SurfaceManager::RequestSurfaceResolution(Surface* pending_surface) { | 86 void SurfaceManager::RequestSurfaceResolution(Surface* pending_surface) { |
| 87 if (dependency_tracker_) | 87 if (dependency_tracker_) |
| 88 dependency_tracker_->RequestSurfaceResolution(pending_surface); | 88 dependency_tracker_->RequestSurfaceResolution(pending_surface); |
| 89 } | 89 } |
| 90 | 90 |
| 91 void SurfaceManager::RegisterSurface(Surface* surface) { | 91 std::unique_ptr<Surface> SurfaceManager::CreateSurface( |
| 92 base::WeakPtr<SurfaceFactory> surface_factory, |
| 93 const LocalSurfaceId& local_surface_id) { |
| 92 DCHECK(thread_checker_.CalledOnValidThread()); | 94 DCHECK(thread_checker_.CalledOnValidThread()); |
| 93 DCHECK(surface); | 95 DCHECK(local_surface_id.is_valid() && surface_factory); |
| 94 DCHECK(!surface_map_.count(surface->surface_id())); | 96 |
| 95 surface_map_[surface->surface_id()] = surface; | 97 SurfaceId surface_id(surface_factory->frame_sink_id(), local_surface_id); |
| 98 |
| 99 // If no surface with this SurfaceId exists, simply create the surface and |
| 100 // return. |
| 101 auto surface_iter = surface_map_.find(surface_id); |
| 102 if (surface_iter == surface_map_.end()) { |
| 103 auto surface = base::MakeUnique<Surface>(surface_id, surface_factory); |
| 104 surface_map_[surface->surface_id()] = surface.get(); |
| 105 return surface; |
| 106 } |
| 107 |
| 108 // If a surface with this SurfaceId exists and it's not marked as destroyed, |
| 109 // we should not receive a request to create a new surface with the same |
| 110 // SurfaceId. |
| 111 DCHECK(surface_iter->second->destroyed()); |
| 112 |
| 113 // If a surface with this SurfaceId exists and it's marked as destroyed, |
| 114 // it means it's in the garbage collector's queue. We simply take it out of |
| 115 // the queue and reuse it. |
| 116 auto it = |
| 117 std::find_if(surfaces_to_destroy_.begin(), surfaces_to_destroy_.end(), |
| 118 [&surface_id](const std::unique_ptr<Surface>& surface) { |
| 119 return surface->surface_id() == surface_id; |
| 120 }); |
| 121 DCHECK(it != surfaces_to_destroy_.end()); |
| 122 std::unique_ptr<Surface> surface = std::move(*it); |
| 123 surfaces_to_destroy_.erase(it); |
| 124 surface->set_destroyed(false); |
| 125 DCHECK_EQ(surface_factory.get(), surface->factory().get()); |
| 126 return surface; |
| 96 } | 127 } |
| 97 | 128 |
| 98 void SurfaceManager::DeregisterSurface(const SurfaceId& surface_id) { | 129 void SurfaceManager::DestroySurface(std::unique_ptr<Surface> surface) { |
| 99 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 100 SurfaceMap::iterator it = surface_map_.find(surface_id); | |
| 101 DCHECK(it != surface_map_.end()); | |
| 102 surface_map_.erase(it); | |
| 103 RemoveAllSurfaceReferences(surface_id); | |
| 104 } | |
| 105 | |
| 106 void SurfaceManager::Destroy(std::unique_ptr<Surface> surface) { | |
| 107 DCHECK(thread_checker_.CalledOnValidThread()); | 130 DCHECK(thread_checker_.CalledOnValidThread()); |
| 108 surface->set_destroyed(true); | 131 surface->set_destroyed(true); |
| 109 surfaces_to_destroy_.push_back(std::move(surface)); | 132 surfaces_to_destroy_.push_back(std::move(surface)); |
| 110 GarbageCollectSurfaces(); | 133 GarbageCollectSurfaces(); |
| 111 } | 134 } |
| 112 | 135 |
| 113 void SurfaceManager::RequireSequence(const SurfaceId& surface_id, | 136 void SurfaceManager::RequireSequence(const SurfaceId& surface_id, |
| 114 const SurfaceSequence& sequence) { | 137 const SurfaceSequence& sequence) { |
| 115 auto* surface = GetSurfaceForId(surface_id); | 138 auto* surface = GetSurfaceForId(surface_id); |
| 116 if (!surface) { | 139 if (!surface) { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 ? GetLiveSurfacesForReferences() | 227 ? GetLiveSurfacesForReferences() |
| 205 : GetLiveSurfacesForSequences(); | 228 : GetLiveSurfacesForSequences(); |
| 206 | 229 |
| 207 std::vector<std::unique_ptr<Surface>> surfaces_to_delete; | 230 std::vector<std::unique_ptr<Surface>> surfaces_to_delete; |
| 208 | 231 |
| 209 // Delete all destroyed and unreachable surfaces. | 232 // Delete all destroyed and unreachable surfaces. |
| 210 for (auto iter = surfaces_to_destroy_.begin(); | 233 for (auto iter = surfaces_to_destroy_.begin(); |
| 211 iter != surfaces_to_destroy_.end();) { | 234 iter != surfaces_to_destroy_.end();) { |
| 212 SurfaceId surface_id = (*iter)->surface_id(); | 235 SurfaceId surface_id = (*iter)->surface_id(); |
| 213 if (reachable_surfaces.count(surface_id) == 0) { | 236 if (reachable_surfaces.count(surface_id) == 0) { |
| 214 DeregisterSurface(surface_id); | 237 UnregisterSurface(surface_id); |
| 215 surfaces_to_delete.push_back(std::move(*iter)); | 238 surfaces_to_delete.push_back(std::move(*iter)); |
| 216 iter = surfaces_to_destroy_.erase(iter); | 239 iter = surfaces_to_destroy_.erase(iter); |
| 217 } else { | 240 } else { |
| 218 ++iter; | 241 ++iter; |
| 219 } | 242 } |
| 220 } | 243 } |
| 221 | 244 |
| 222 // ~Surface() draw callback could modify |surfaces_to_destroy_|. | 245 // ~Surface() draw callback could modify |surfaces_to_destroy_|. |
| 223 surfaces_to_delete.clear(); | 246 surfaces_to_delete.clear(); |
| 224 } | 247 } |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 bool has_real_reference = | 632 bool has_real_reference = |
| 610 it != child_to_parent_refs_.end() && !it->second.empty(); | 633 it != child_to_parent_refs_.end() && !it->second.empty(); |
| 611 if (!has_real_reference) | 634 if (!has_real_reference) |
| 612 AddTemporaryReference(surface_info.id()); | 635 AddTemporaryReference(surface_info.id()); |
| 613 } | 636 } |
| 614 | 637 |
| 615 for (auto& observer : observer_list_) | 638 for (auto& observer : observer_list_) |
| 616 observer.OnSurfaceCreated(surface_info); | 639 observer.OnSurfaceCreated(surface_info); |
| 617 } | 640 } |
| 618 | 641 |
| 642 void SurfaceManager::UnregisterSurface(const SurfaceId& surface_id) { |
| 643 DCHECK(thread_checker_.CalledOnValidThread()); |
| 644 SurfaceMap::iterator it = surface_map_.find(surface_id); |
| 645 DCHECK(it != surface_map_.end()); |
| 646 surface_map_.erase(it); |
| 647 RemoveAllSurfaceReferences(surface_id); |
| 648 } |
| 649 |
| 619 #if DCHECK_IS_ON() | 650 #if DCHECK_IS_ON() |
| 620 void SurfaceManager::SurfaceReferencesToStringImpl(const SurfaceId& surface_id, | 651 void SurfaceManager::SurfaceReferencesToStringImpl(const SurfaceId& surface_id, |
| 621 std::string indent, | 652 std::string indent, |
| 622 std::stringstream* str) { | 653 std::stringstream* str) { |
| 623 *str << indent; | 654 *str << indent; |
| 624 | 655 |
| 625 // Print the current line for |surface_id|. | 656 // Print the current line for |surface_id|. |
| 626 Surface* surface = GetSurfaceForId(surface_id); | 657 Surface* surface = GetSurfaceForId(surface_id); |
| 627 if (surface) { | 658 if (surface) { |
| 628 *str << surface->surface_id().ToString(); | 659 *str << surface->surface_id().ToString(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 657 std::vector<SurfaceId> children(iter->second.begin(), iter->second.end()); | 688 std::vector<SurfaceId> children(iter->second.begin(), iter->second.end()); |
| 658 std::sort(children.begin(), children.end()); | 689 std::sort(children.begin(), children.end()); |
| 659 | 690 |
| 660 for (const SurfaceId& child_id : children) | 691 for (const SurfaceId& child_id : children) |
| 661 SurfaceReferencesToStringImpl(child_id, indent + " ", str); | 692 SurfaceReferencesToStringImpl(child_id, indent + " ", str); |
| 662 } | 693 } |
| 663 } | 694 } |
| 664 #endif // DCHECK_IS_ON() | 695 #endif // DCHECK_IS_ON() |
| 665 | 696 |
| 666 } // namespace cc | 697 } // namespace cc |
| OLD | NEW |