Chromium Code Reviews| Index: cc/surfaces/surface_manager.cc |
| diff --git a/cc/surfaces/surface_manager.cc b/cc/surfaces/surface_manager.cc |
| index b8b121142ff7f18f707f9dea142be0f0faa6c6ee..8144f4ad21c31eb3bc79a81f415823f864f453f9 100644 |
| --- a/cc/surfaces/surface_manager.cc |
| +++ b/cc/surfaces/surface_manager.cc |
| @@ -16,6 +16,51 @@ |
| namespace cc { |
| +namespace { |
| + |
| +class SurfaceRef final : public SurfaceRefWithSequence<SurfaceRef> { |
|
Saman Sami
2016/11/30 18:05:52
Move to a separate file and rename?
|
| + public: |
| + SurfaceRef(SurfaceManager* manager, |
| + const SurfaceId& surface_id, |
| + float scale, |
| + const gfx::Size& size); |
| + // SurfaceRef(const SurfaceRef&); |
| + |
| + protected: |
| + void SatisfySequence(const SurfaceSequence&) override; |
| + void RequireSequence(const SurfaceSequence&) override; |
| + |
| + private: |
| + SurfaceManager* manager_ = nullptr; |
| +}; |
| + |
| +SurfaceRef::SurfaceRef(SurfaceManager* manager, |
| + const SurfaceId& surface_id, |
| + float scale, |
| + const gfx::Size& size) |
| + : manager_(manager) { |
| + SetMetadata(surface_id, scale, size); |
|
Fady Samuel
2016/11/30 19:51:29
Call the base class' constructor instead?
|
| +} |
| + |
| +// SurfaceRef::SurfaceRef(const SurfaceRef& surface_ref) = default; |
| + |
| +void SurfaceRef::SatisfySequence(const SurfaceSequence& seq) { |
| + std::vector<uint32_t> sequences; |
| + sequences.push_back(seq.sequence); |
| + manager_->DidSatisfySequences(seq.frame_sink_id, &sequences); |
| +} |
| + |
| +void SurfaceRef::RequireSequence(const SurfaceSequence& seq) { |
| + auto surface = manager_->GetSurfaceForId(id()); |
| + if (!surface) { |
| + LOG(ERROR) << "Attempting to require callback on nonexistent surface"; |
| + return; |
| + } |
| + surface->AddDestructionDependency(seq); |
| +} |
| + |
| +} // namespace |
| + |
| SurfaceManager::FrameSinkSourceMapping::FrameSinkSourceMapping() |
| : client(nullptr), source(nullptr) {} |
| @@ -420,6 +465,12 @@ void SurfaceManager::UnregisterFrameSinkHierarchy( |
| RecursivelyAttachBeginFrameSource(source_iter.second, source_iter.first); |
| } |
| +SurfaceRefPtr SurfaceManager::NewSurfaceRef(const SurfaceId& surface_id, |
| + float scale, |
| + const gfx::Size& size) { |
| + return SurfaceRefPtr(new SurfaceRef(this, surface_id, scale, size)); |
| +} |
| + |
| Surface* SurfaceManager::GetSurfaceForId(const SurfaceId& surface_id) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| SurfaceMap::iterator it = surface_map_.find(surface_id); |