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); |