Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: cc/surfaces/surface_manager.h

Issue 2684933003: Move frame_sink_id management to framesink_manager.cc/h from (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #ifndef CC_SURFACES_SURFACE_MANAGER_H_ 5 #ifndef CC_SURFACES_SURFACE_MANAGER_H_
6 #define CC_SURFACES_SURFACE_MANAGER_H_ 6 #define CC_SURFACES_SURFACE_MANAGER_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <list> 10 #include <list>
(...skipping 14 matching lines...) Expand all
25 #include "cc/surfaces/surface_reference_factory.h" 25 #include "cc/surfaces/surface_reference_factory.h"
26 #include "cc/surfaces/surface_sequence.h" 26 #include "cc/surfaces/surface_sequence.h"
27 #include "cc/surfaces/surfaces_export.h" 27 #include "cc/surfaces/surfaces_export.h"
28 28
29 #if DCHECK_IS_ON() 29 #if DCHECK_IS_ON()
30 #include <iosfwd> 30 #include <iosfwd>
31 #include <string> 31 #include <string>
32 #endif 32 #endif
33 33
34 namespace cc { 34 namespace cc {
35 class BeginFrameSource;
36 class CompositorFrame;
37 class Surface; 35 class Surface;
38 class SurfaceFactoryClient;
39 36
40 class CC_SURFACES_EXPORT SurfaceManager { 37 class CC_SURFACES_EXPORT SurfaceManager {
41 public: 38 public:
42 enum class LifetimeType { 39 enum class LifetimeType {
43 REFERENCES, 40 REFERENCES,
44 SEQUENCES, 41 SEQUENCES,
45 }; 42 };
46 43
47 explicit SurfaceManager(LifetimeType lifetime_type = LifetimeType::SEQUENCES); 44 explicit SurfaceManager(LifetimeType lifetime_type = LifetimeType::SEQUENCES);
48 ~SurfaceManager(); 45 ~SurfaceManager();
(...skipping 25 matching lines...) Expand all
74 71
75 // Require that the given sequence number must be satisfied (using 72 // Require that the given sequence number must be satisfied (using
76 // SatisfySequence) before the given surface can be destroyed. 73 // SatisfySequence) before the given surface can be destroyed.
77 void RequireSequence(const SurfaceId& surface_id, 74 void RequireSequence(const SurfaceId& surface_id,
78 const SurfaceSequence& sequence); 75 const SurfaceSequence& sequence);
79 76
80 // Satisfies the given sequence number. Once all sequence numbers that 77 // Satisfies the given sequence number. Once all sequence numbers that
81 // a surface depends on are satisfied, the surface can be destroyed. 78 // a surface depends on are satisfied, the surface can be destroyed.
82 void SatisfySequence(const SurfaceSequence& sequence); 79 void SatisfySequence(const SurfaceSequence& sequence);
83 80
84 void RegisterFrameSinkId(const FrameSinkId& frame_sink_id); 81 void RegisterFrameSinkId(const FrameSinkId& frame_sink_id);
Fady Samuel 2017/02/12 19:04:08 It seems strange to leave this here. What about mo
k.devara 2017/02/13 06:52:00 Yes- sorry I think the dfn still stayed back in su
85 82
86 // Invalidate a frame_sink_id that might still have associated sequences,
87 // possibly because a renderer process has crashed.
88 void InvalidateFrameSinkId(const FrameSinkId& frame_sink_id);
89
90 // SurfaceFactoryClient, hierarchy, and BeginFrameSource can be registered
91 // and unregistered in any order with respect to each other.
92 //
93 // This happens in practice, e.g. the relationship to between ui::Compositor /
94 // DelegatedFrameHost is known before ui::Compositor has a surface/client).
95 // However, DelegatedFrameHost can register itself as a client before its
96 // relationship with the ui::Compositor is known.
97
98 // Associates a SurfaceFactoryClient with the surface id frame_sink_id it
99 // uses.
100 // SurfaceFactoryClient and surface namespaces/allocators have a 1:1 mapping.
101 // Caller guarantees the client is alive between register/unregister.
102 // Reregistering the same namespace when a previous client is active is not
103 // valid.
104 void RegisterSurfaceFactoryClient(const FrameSinkId& frame_sink_id,
105 SurfaceFactoryClient* client);
106 void UnregisterSurfaceFactoryClient(const FrameSinkId& frame_sink_id);
107
108 // Associates a |source| with a particular namespace. That namespace and
109 // any children of that namespace with valid clients can potentially use
110 // that |source|.
111 void RegisterBeginFrameSource(BeginFrameSource* source,
112 const FrameSinkId& frame_sink_id);
113 void UnregisterBeginFrameSource(BeginFrameSource* source);
114
115 // Register a relationship between two namespaces. This relationship means
116 // that surfaces from the child namespace will be displayed in the parent.
117 // Children are allowed to use any begin frame source that their parent can
118 // use.
119 void RegisterFrameSinkHierarchy(const FrameSinkId& parent_frame_sink_id,
120 const FrameSinkId& child_frame_sink_id);
121 void UnregisterFrameSinkHierarchy(const FrameSinkId& parent_frame_sink_id,
122 const FrameSinkId& child_frame_sink_id);
123
124 // Returns the top level root SurfaceId. Surfaces that are not reachable 83 // Returns the top level root SurfaceId. Surfaces that are not reachable
125 // from the top level root may be garbage collected. It will not be a valid 84 // from the top level root may be garbage collected. It will not be a valid
126 // SurfaceId and will never correspond to a surface. 85 // SurfaceId and will never correspond to a surface.
127 const SurfaceId& GetRootSurfaceId() const; 86 const SurfaceId& GetRootSurfaceId() const;
128 87
129 // Adds a reference from |parent_id| to |child_id|. If there is a temporary 88 // Adds a reference from |parent_id| to |child_id|. If there is a temporary
130 // references for |child_id| then it will be removed. 89 // references for |child_id| then it will be removed.
131 void AddSurfaceReference(const SurfaceId& parent_id, 90 void AddSurfaceReference(const SurfaceId& parent_id,
132 const SurfaceId& child_id); 91 const SurfaceId& child_id);
133 92
(...skipping 11 matching lines...) Expand all
145 104
146 scoped_refptr<SurfaceReferenceFactory> reference_factory() { 105 scoped_refptr<SurfaceReferenceFactory> reference_factory() {
147 return reference_factory_; 106 return reference_factory_;
148 } 107 }
149 108
150 private: 109 private:
151 friend class SurfaceManagerRefTest; 110 friend class SurfaceManagerRefTest;
152 111
153 using SurfaceIdSet = std::unordered_set<SurfaceId, SurfaceIdHash>; 112 using SurfaceIdSet = std::unordered_set<SurfaceId, SurfaceIdHash>;
154 113
155 void RecursivelyAttachBeginFrameSource(const FrameSinkId& frame_sink_id,
156 BeginFrameSource* source);
157 void RecursivelyDetachBeginFrameSource(const FrameSinkId& frame_sink_id,
158 BeginFrameSource* source);
159
160 // Returns true if |child namespace| is or has |search_frame_sink_id| as a
161 // child.
162 bool ChildContains(const FrameSinkId& child_frame_sink_id,
163 const FrameSinkId& search_frame_sink_id) const;
164
165 // Garbage collects all destroyed surfaces that aren't live. 114 // Garbage collects all destroyed surfaces that aren't live.
166 void GarbageCollectSurfaces(); 115 void GarbageCollectSurfaces();
167 116
168 // Returns set of live surfaces for |lifetime_manager_| is REFERENCES. 117 // Returns set of live surfaces for |lifetime_manager_| is REFERENCES.
169 SurfaceIdSet GetLiveSurfacesForReferences(); 118 SurfaceIdSet GetLiveSurfacesForReferences();
170 119
171 // Returns set of live surfaces for |lifetime_manager_| is SEQUENCES. 120 // Returns set of live surfaces for |lifetime_manager_| is SEQUENCES.
172 SurfaceIdSet GetLiveSurfacesForSequences(); 121 SurfaceIdSet GetLiveSurfacesForSequences();
173 122
174 // Adds a reference from |parent_id| to |child_id| without dealing with 123 // Adds a reference from |parent_id| to |child_id| without dealing with
(...skipping 26 matching lines...) Expand all
201 150
202 // List of surfaces to be destroyed, along with what sequences they're still 151 // List of surfaces to be destroyed, along with what sequences they're still
203 // waiting on. 152 // waiting on.
204 using SurfaceDestroyList = std::list<std::unique_ptr<Surface>>; 153 using SurfaceDestroyList = std::list<std::unique_ptr<Surface>>;
205 SurfaceDestroyList surfaces_to_destroy_; 154 SurfaceDestroyList surfaces_to_destroy_;
206 155
207 // Set of SurfaceSequences that have been satisfied by a frame but not yet 156 // Set of SurfaceSequences that have been satisfied by a frame but not yet
208 // waited on. 157 // waited on.
209 std::unordered_set<SurfaceSequence, SurfaceSequenceHash> satisfied_sequences_; 158 std::unordered_set<SurfaceSequence, SurfaceSequenceHash> satisfied_sequences_;
210 159
211 // Set of valid surface ID namespaces. When a namespace is removed from
212 // this set, any remaining sequences with that namespace are considered
213 // satisfied.
214 std::unordered_set<FrameSinkId, FrameSinkIdHash> valid_frame_sink_ids_;
215
216 // Begin frame source routing. Both BeginFrameSource and SurfaceFactoryClient
217 // pointers guaranteed alive by callers until unregistered.
218 struct FrameSinkSourceMapping {
219 FrameSinkSourceMapping();
220 FrameSinkSourceMapping(const FrameSinkSourceMapping& other);
221 ~FrameSinkSourceMapping();
222 bool is_empty() const { return !client && children.empty(); }
223 // The client that's responsible for creating this namespace. Never null.
224 SurfaceFactoryClient* client;
225 // The currently assigned begin frame source for this client.
226 BeginFrameSource* source;
227 // This represents a dag of parent -> children mapping.
228 std::vector<FrameSinkId> children;
229 };
230 std::unordered_map<FrameSinkId, FrameSinkSourceMapping, FrameSinkIdHash>
231 frame_sink_source_map_;
232
233 // Tracks references from the child surface to parent surface. If there are 160 // Tracks references from the child surface to parent surface. If there are
234 // zero entries in the set for a SurfaceId then nothing is referencing the 161 // zero entries in the set for a SurfaceId then nothing is referencing the
235 // surface and it can be garbage collected. 162 // surface and it can be garbage collected.
236 std::unordered_map<SurfaceId, SurfaceIdSet, SurfaceIdHash> 163 std::unordered_map<SurfaceId, SurfaceIdSet, SurfaceIdHash>
237 child_to_parent_refs_; 164 child_to_parent_refs_;
238 // Tracks references from the parent surface to child surface. Is the inverse 165 // Tracks references from the parent surface to child surface. Is the inverse
239 // of |child_to_parent_refs_|. 166 // of |child_to_parent_refs_|.
240 std::unordered_map<SurfaceId, SurfaceIdSet, SurfaceIdHash> 167 std::unordered_map<SurfaceId, SurfaceIdSet, SurfaceIdHash>
241 parent_to_child_refs_; 168 parent_to_child_refs_;
242 169
243 // Set of which sources are registered to which namespace. Any child
244 // that is implicitly using this namespace must be reachable by the
245 // parent in the dag.
246 std::unordered_map<BeginFrameSource*, FrameSinkId> registered_sources_;
247
248 // Root SurfaceId that references display root surfaces. There is no Surface 170 // Root SurfaceId that references display root surfaces. There is no Surface
249 // with this id, it's for bookkeeping purposes only. 171 // with this id, it's for bookkeeping purposes only.
250 const SurfaceId root_surface_id_; 172 const SurfaceId root_surface_id_;
251 173
252 // The DirectSurfaceReferenceFactory that uses this manager to create surface 174 // The DirectSurfaceReferenceFactory that uses this manager to create surface
253 // references. 175 // references.
254 scoped_refptr<SurfaceReferenceFactory> reference_factory_; 176 scoped_refptr<SurfaceReferenceFactory> reference_factory_;
255 177
256 // SurfaceIds that have temporary references from top level root so they 178 // SurfaceIds that have temporary references from top level root so they
257 // aren't GC'd before a real reference is added. This is basically a 179 // aren't GC'd before a real reference is added. This is basically a
258 // collection of surface ids, for example: 180 // collection of surface ids, for example:
259 // SurfaceId surface_id(key, value[index]); 181 // SurfaceId surface_id(key, value[index]);
260 // The LocalSurfaceIds are stored in the order the surfaces are created in. 182 // The LocalSurfaceIds are stored in the order the surfaces are created in.
261 std::unordered_map<FrameSinkId, std::vector<LocalSurfaceId>, FrameSinkIdHash> 183 std::unordered_map<FrameSinkId, std::vector<LocalSurfaceId>, FrameSinkIdHash>
262 temp_references_; 184 temp_references_;
263 185
264 base::WeakPtrFactory<SurfaceManager> weak_factory_; 186 base::WeakPtrFactory<SurfaceManager> weak_factory_;
265 187
266 DISALLOW_COPY_AND_ASSIGN(SurfaceManager); 188 DISALLOW_COPY_AND_ASSIGN(SurfaceManager);
267 }; 189 };
268 190
269 } // namespace cc 191 } // namespace cc
270 192
271 #endif // CC_SURFACES_SURFACE_MANAGER_H_ 193 #endif // CC_SURFACES_SURFACE_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698