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

Side by Side Diff: cc/surfaces/surface_manager_unittest.cc

Issue 2382873002: Replace usage of SurfaceId's client_id with FrameSinkId (Closed)
Patch Set: Rebased Created 4 years, 2 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
« no previous file with comments | « cc/surfaces/surface_manager.cc ('k') | cc/surfaces/surface_sequence.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include "cc/scheduler/begin_frame_source.h" 7 #include "cc/scheduler/begin_frame_source.h"
8 #include "cc/surfaces/surface_factory_client.h" 8 #include "cc/surfaces/surface_factory_client.h"
9 #include "cc/surfaces/surface_manager.h" 9 #include "cc/surfaces/surface_manager.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 11
12 namespace cc { 12 namespace cc {
13 13
14 class FakeSurfaceFactoryClient : public SurfaceFactoryClient { 14 class FakeSurfaceFactoryClient : public SurfaceFactoryClient {
15 public: 15 public:
16 explicit FakeSurfaceFactoryClient(int id_namespace) 16 explicit FakeSurfaceFactoryClient(const FrameSinkId& frame_sink_id)
17 : source_(nullptr), manager_(nullptr), id_namespace_(id_namespace) {} 17 : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) {}
18 FakeSurfaceFactoryClient(int id_namespace, SurfaceManager* manager) 18
19 : source_(nullptr), manager_(nullptr), id_namespace_(id_namespace) { 19 FakeSurfaceFactoryClient(const FrameSinkId& frame_sink_id,
20 SurfaceManager* manager)
21 : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) {
20 DCHECK(manager); 22 DCHECK(manager);
21 Register(manager); 23 Register(manager);
22 } 24 }
23 25
24 ~FakeSurfaceFactoryClient() override { 26 ~FakeSurfaceFactoryClient() override {
25 if (manager_) { 27 if (manager_) {
26 Unregister(); 28 Unregister();
27 } 29 }
28 EXPECT_EQ(source_, nullptr); 30 EXPECT_EQ(source_, nullptr);
29 } 31 }
30 32
31 BeginFrameSource* source() { return source_; } 33 BeginFrameSource* source() { return source_; }
32 uint32_t id_namespace() { return id_namespace_; } 34 const FrameSinkId& frame_sink_id() { return frame_sink_id_; }
33 35
34 void Register(SurfaceManager* manager) { 36 void Register(SurfaceManager* manager) {
35 EXPECT_EQ(manager_, nullptr); 37 EXPECT_EQ(manager_, nullptr);
36 manager_ = manager; 38 manager_ = manager;
37 manager_->RegisterSurfaceFactoryClient(id_namespace_, this); 39 manager_->RegisterSurfaceFactoryClient(frame_sink_id_, this);
38 } 40 }
39 41
40 void Unregister() { 42 void Unregister() {
41 EXPECT_NE(manager_, nullptr); 43 EXPECT_NE(manager_, nullptr);
42 manager_->UnregisterSurfaceFactoryClient(id_namespace_); 44 manager_->UnregisterSurfaceFactoryClient(frame_sink_id_);
43 manager_ = nullptr; 45 manager_ = nullptr;
44 } 46 }
45 47
46 // SurfaceFactoryClient implementation. 48 // SurfaceFactoryClient implementation.
47 void ReturnResources(const ReturnedResourceArray& resources) override {} 49 void ReturnResources(const ReturnedResourceArray& resources) override {}
48 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { 50 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {
49 DCHECK(!source_ || !begin_frame_source); 51 DCHECK(!source_ || !begin_frame_source);
50 source_ = begin_frame_source; 52 source_ = begin_frame_source;
51 }; 53 };
52 54
53 private: 55 private:
54 BeginFrameSource* source_; 56 BeginFrameSource* source_;
55 SurfaceManager* manager_; 57 SurfaceManager* manager_;
56 uint32_t id_namespace_; 58 FrameSinkId frame_sink_id_;
57 }; 59 };
58 60
59 class SurfaceManagerTest : public testing::Test { 61 class SurfaceManagerTest : public testing::Test {
60 public: 62 public:
61 // These tests don't care about namespace registration, so just preregister 63 // These tests don't care about namespace registration, so just preregister
62 // a set of namespaces that tests can use freely without worrying if they're 64 // a set of namespaces that tests can use freely without worrying if they're
63 // valid or not. 65 // valid or not.
64 enum { MAX_NAMESPACE = 10 }; 66 enum { MAX_FRAME_SINK = 10 };
65 67
66 SurfaceManagerTest() { 68 SurfaceManagerTest() {
67 for (size_t i = 0; i < MAX_NAMESPACE; ++i) 69 for (size_t i = 0; i < MAX_FRAME_SINK; ++i)
68 manager_.RegisterSurfaceClientId(i); 70 manager_.RegisterFrameSinkId(FrameSinkId(i, i));
69 } 71 }
70 72
71 ~SurfaceManagerTest() override { 73 ~SurfaceManagerTest() override {
72 for (size_t i = 0; i < MAX_NAMESPACE; ++i) 74 for (size_t i = 0; i < MAX_FRAME_SINK; ++i)
73 manager_.InvalidateSurfaceClientId(i); 75 manager_.InvalidateFrameSinkId(FrameSinkId(i, i));
74 } 76 }
75 77
76 protected: 78 protected:
77 SurfaceManager manager_; 79 SurfaceManager manager_;
78 }; 80 };
79 81
80 TEST_F(SurfaceManagerTest, SingleClients) { 82 TEST_F(SurfaceManagerTest, SingleClients) {
81 FakeSurfaceFactoryClient client(1); 83 FakeSurfaceFactoryClient client(FrameSinkId(1, 1));
82 FakeSurfaceFactoryClient other_client(2); 84 FakeSurfaceFactoryClient other_client(FrameSinkId(2, 2));
83 StubBeginFrameSource source; 85 StubBeginFrameSource source;
84 86
85 EXPECT_EQ(client.source(), nullptr); 87 EXPECT_EQ(client.source(), nullptr);
86 EXPECT_EQ(other_client.source(), nullptr); 88 EXPECT_EQ(other_client.source(), nullptr);
87 client.Register(&manager_); 89 client.Register(&manager_);
88 other_client.Register(&manager_); 90 other_client.Register(&manager_);
89 EXPECT_EQ(client.source(), nullptr); 91 EXPECT_EQ(client.source(), nullptr);
90 EXPECT_EQ(other_client.source(), nullptr); 92 EXPECT_EQ(other_client.source(), nullptr);
91 93
92 // Test setting unsetting BFS 94 // Test setting unsetting BFS
93 manager_.RegisterBeginFrameSource(&source, client.id_namespace()); 95 manager_.RegisterBeginFrameSource(&source, client.frame_sink_id());
94 EXPECT_EQ(client.source(), &source); 96 EXPECT_EQ(client.source(), &source);
95 EXPECT_EQ(other_client.source(), nullptr); 97 EXPECT_EQ(other_client.source(), nullptr);
96 manager_.UnregisterBeginFrameSource(&source); 98 manager_.UnregisterBeginFrameSource(&source);
97 EXPECT_EQ(client.source(), nullptr); 99 EXPECT_EQ(client.source(), nullptr);
98 EXPECT_EQ(other_client.source(), nullptr); 100 EXPECT_EQ(other_client.source(), nullptr);
99 101
100 // Set BFS for other namespace 102 // Set BFS for other namespace
101 manager_.RegisterBeginFrameSource(&source, other_client.id_namespace()); 103 manager_.RegisterBeginFrameSource(&source, other_client.frame_sink_id());
102 EXPECT_EQ(other_client.source(), &source); 104 EXPECT_EQ(other_client.source(), &source);
103 EXPECT_EQ(client.source(), nullptr); 105 EXPECT_EQ(client.source(), nullptr);
104 manager_.UnregisterBeginFrameSource(&source); 106 manager_.UnregisterBeginFrameSource(&source);
105 EXPECT_EQ(client.source(), nullptr); 107 EXPECT_EQ(client.source(), nullptr);
106 EXPECT_EQ(other_client.source(), nullptr); 108 EXPECT_EQ(other_client.source(), nullptr);
107 109
108 // Re-set BFS for original 110 // Re-set BFS for original
109 manager_.RegisterBeginFrameSource(&source, client.id_namespace()); 111 manager_.RegisterBeginFrameSource(&source, client.frame_sink_id());
110 EXPECT_EQ(client.source(), &source); 112 EXPECT_EQ(client.source(), &source);
111 manager_.UnregisterBeginFrameSource(&source); 113 manager_.UnregisterBeginFrameSource(&source);
112 EXPECT_EQ(client.source(), nullptr); 114 EXPECT_EQ(client.source(), nullptr);
113 } 115 }
114 116
115 TEST_F(SurfaceManagerTest, MultipleDisplays) { 117 TEST_F(SurfaceManagerTest, MultipleDisplays) {
116 StubBeginFrameSource root1_source; 118 StubBeginFrameSource root1_source;
117 StubBeginFrameSource root2_source; 119 StubBeginFrameSource root2_source;
118 120
119 // root1 -> A -> B 121 // root1 -> A -> B
120 // root2 -> C 122 // root2 -> C
121 FakeSurfaceFactoryClient root1(1, &manager_); 123 FakeSurfaceFactoryClient root1(FrameSinkId(1, 1), &manager_);
122 FakeSurfaceFactoryClient root2(2, &manager_); 124 FakeSurfaceFactoryClient root2(FrameSinkId(2, 2), &manager_);
123 FakeSurfaceFactoryClient client_a(3, &manager_); 125 FakeSurfaceFactoryClient client_a(FrameSinkId(3, 3), &manager_);
124 FakeSurfaceFactoryClient client_b(4, &manager_); 126 FakeSurfaceFactoryClient client_b(FrameSinkId(4, 4), &manager_);
125 FakeSurfaceFactoryClient client_c(5, &manager_); 127 FakeSurfaceFactoryClient client_c(FrameSinkId(5, 5), &manager_);
126 128
127 manager_.RegisterBeginFrameSource(&root1_source, root1.id_namespace()); 129 manager_.RegisterBeginFrameSource(&root1_source, root1.frame_sink_id());
128 manager_.RegisterBeginFrameSource(&root2_source, root2.id_namespace()); 130 manager_.RegisterBeginFrameSource(&root2_source, root2.frame_sink_id());
129 EXPECT_EQ(root1.source(), &root1_source); 131 EXPECT_EQ(root1.source(), &root1_source);
130 EXPECT_EQ(root2.source(), &root2_source); 132 EXPECT_EQ(root2.source(), &root2_source);
131 133
132 // Set up initial hierarchy. 134 // Set up initial hierarchy.
133 manager_.RegisterSurfaceNamespaceHierarchy(root1.id_namespace(), 135 manager_.RegisterFrameSinkHierarchy(root1.frame_sink_id(),
134 client_a.id_namespace()); 136 client_a.frame_sink_id());
135 EXPECT_EQ(client_a.source(), root1.source()); 137 EXPECT_EQ(client_a.source(), root1.source());
136 manager_.RegisterSurfaceNamespaceHierarchy(client_a.id_namespace(), 138 manager_.RegisterFrameSinkHierarchy(client_a.frame_sink_id(),
137 client_b.id_namespace()); 139 client_b.frame_sink_id());
138 EXPECT_EQ(client_b.source(), root1.source()); 140 EXPECT_EQ(client_b.source(), root1.source());
139 manager_.RegisterSurfaceNamespaceHierarchy(root2.id_namespace(), 141 manager_.RegisterFrameSinkHierarchy(root2.frame_sink_id(),
140 client_c.id_namespace()); 142 client_c.frame_sink_id());
141 EXPECT_EQ(client_c.source(), root2.source()); 143 EXPECT_EQ(client_c.source(), root2.source());
142 144
143 // Attach A into root2's subtree, like a window moving across displays. 145 // Attach A into root2's subtree, like a window moving across displays.
144 // root1 -> A -> B 146 // root1 -> A -> B
145 // root2 -> C -> A -> B 147 // root2 -> C -> A -> B
146 manager_.RegisterSurfaceNamespaceHierarchy(client_c.id_namespace(), 148 manager_.RegisterFrameSinkHierarchy(client_c.frame_sink_id(),
147 client_a.id_namespace()); 149 client_a.frame_sink_id());
148 // With the heuristic of just keeping existing BFS in the face of multiple, 150 // With the heuristic of just keeping existing BFS in the face of multiple,
149 // no client sources should change. 151 // no client sources should change.
150 EXPECT_EQ(client_a.source(), root1.source()); 152 EXPECT_EQ(client_a.source(), root1.source());
151 EXPECT_EQ(client_b.source(), root1.source()); 153 EXPECT_EQ(client_b.source(), root1.source());
152 EXPECT_EQ(client_c.source(), root2.source()); 154 EXPECT_EQ(client_c.source(), root2.source());
153 155
154 // Detach A from root1. A and B should now be updated to root2. 156 // Detach A from root1. A and B should now be updated to root2.
155 manager_.UnregisterSurfaceNamespaceHierarchy(root1.id_namespace(), 157 manager_.UnregisterFrameSinkHierarchy(root1.frame_sink_id(),
156 client_a.id_namespace()); 158 client_a.frame_sink_id());
157 EXPECT_EQ(client_a.source(), root2.source()); 159 EXPECT_EQ(client_a.source(), root2.source());
158 EXPECT_EQ(client_b.source(), root2.source()); 160 EXPECT_EQ(client_b.source(), root2.source());
159 EXPECT_EQ(client_c.source(), root2.source()); 161 EXPECT_EQ(client_c.source(), root2.source());
160 162
161 // Detach root1 from BFS. root1 should now have no source. 163 // Detach root1 from BFS. root1 should now have no source.
162 manager_.UnregisterBeginFrameSource(&root1_source); 164 manager_.UnregisterBeginFrameSource(&root1_source);
163 EXPECT_EQ(root1.source(), nullptr); 165 EXPECT_EQ(root1.source(), nullptr);
164 EXPECT_NE(root2.source(), nullptr); 166 EXPECT_NE(root2.source(), nullptr);
165 167
166 // Detatch root2 from BFS. 168 // Detatch root2 from BFS.
167 manager_.UnregisterBeginFrameSource(&root2_source); 169 manager_.UnregisterBeginFrameSource(&root2_source);
168 EXPECT_EQ(client_a.source(), nullptr); 170 EXPECT_EQ(client_a.source(), nullptr);
169 EXPECT_EQ(client_b.source(), nullptr); 171 EXPECT_EQ(client_b.source(), nullptr);
170 EXPECT_EQ(client_c.source(), nullptr); 172 EXPECT_EQ(client_c.source(), nullptr);
171 EXPECT_EQ(root2.source(), nullptr); 173 EXPECT_EQ(root2.source(), nullptr);
172 174
173 // Cleanup hierarchy. 175 // Cleanup hierarchy.
174 manager_.UnregisterSurfaceNamespaceHierarchy(root2.id_namespace(), 176 manager_.UnregisterFrameSinkHierarchy(root2.frame_sink_id(),
175 client_c.id_namespace()); 177 client_c.frame_sink_id());
176 manager_.UnregisterSurfaceNamespaceHierarchy(client_c.id_namespace(), 178 manager_.UnregisterFrameSinkHierarchy(client_c.frame_sink_id(),
177 client_a.id_namespace()); 179 client_a.frame_sink_id());
178 manager_.UnregisterSurfaceNamespaceHierarchy(client_a.id_namespace(), 180 manager_.UnregisterFrameSinkHierarchy(client_a.frame_sink_id(),
179 client_b.id_namespace()); 181 client_b.frame_sink_id());
180 } 182 }
181 183
182 // In practice, registering and unregistering both parent/child relationships 184 // In practice, registering and unregistering both parent/child relationships
183 // and SurfaceFactoryClients can happen in any ordering with respect to 185 // and SurfaceFactoryClients can happen in any ordering with respect to
184 // each other. These following tests verify that all the data structures 186 // each other. These following tests verify that all the data structures
185 // are properly set up and cleaned up under the four permutations of orderings 187 // are properly set up and cleaned up under the four permutations of orderings
186 // of this nesting. 188 // of this nesting.
187 189
188 class SurfaceManagerOrderingTest : public SurfaceManagerTest { 190 class SurfaceManagerOrderingTest : public SurfaceManagerTest {
189 public: 191 public:
190 SurfaceManagerOrderingTest() 192 SurfaceManagerOrderingTest()
191 : client_a_(1), 193 : client_a_(FrameSinkId(1, 1)),
192 client_b_(2), 194 client_b_(FrameSinkId(2, 2)),
193 client_c_(3), 195 client_c_(FrameSinkId(3, 3)),
194 hierarchy_registered_(false), 196 hierarchy_registered_(false),
195 clients_registered_(false), 197 clients_registered_(false),
196 bfs_registered_(false) { 198 bfs_registered_(false) {
197 AssertCorrectBFSState(); 199 AssertCorrectBFSState();
198 } 200 }
199 201
200 ~SurfaceManagerOrderingTest() override { 202 ~SurfaceManagerOrderingTest() override {
201 EXPECT_EQ(hierarchy_registered_, false); 203 EXPECT_EQ(hierarchy_registered_, false);
202 EXPECT_EQ(clients_registered_, false); 204 EXPECT_EQ(clients_registered_, false);
203 EXPECT_EQ(bfs_registered_, false); 205 EXPECT_EQ(bfs_registered_, false);
204 AssertCorrectBFSState(); 206 AssertCorrectBFSState();
205 } 207 }
206 208
207 void RegisterHierarchy() { 209 void RegisterHierarchy() {
208 DCHECK(!hierarchy_registered_); 210 DCHECK(!hierarchy_registered_);
209 hierarchy_registered_ = true; 211 hierarchy_registered_ = true;
210 manager_.RegisterSurfaceNamespaceHierarchy(client_a_.id_namespace(), 212 manager_.RegisterFrameSinkHierarchy(client_a_.frame_sink_id(),
211 client_b_.id_namespace()); 213 client_b_.frame_sink_id());
212 manager_.RegisterSurfaceNamespaceHierarchy(client_b_.id_namespace(), 214 manager_.RegisterFrameSinkHierarchy(client_b_.frame_sink_id(),
213 client_c_.id_namespace()); 215 client_c_.frame_sink_id());
214 AssertCorrectBFSState(); 216 AssertCorrectBFSState();
215 } 217 }
216 void UnregisterHierarchy() { 218 void UnregisterHierarchy() {
217 DCHECK(hierarchy_registered_); 219 DCHECK(hierarchy_registered_);
218 hierarchy_registered_ = false; 220 hierarchy_registered_ = false;
219 manager_.UnregisterSurfaceNamespaceHierarchy(client_a_.id_namespace(), 221 manager_.UnregisterFrameSinkHierarchy(client_a_.frame_sink_id(),
220 client_b_.id_namespace()); 222 client_b_.frame_sink_id());
221 manager_.UnregisterSurfaceNamespaceHierarchy(client_b_.id_namespace(), 223 manager_.UnregisterFrameSinkHierarchy(client_b_.frame_sink_id(),
222 client_c_.id_namespace()); 224 client_c_.frame_sink_id());
223 AssertCorrectBFSState(); 225 AssertCorrectBFSState();
224 } 226 }
225 227
226 void RegisterClients() { 228 void RegisterClients() {
227 DCHECK(!clients_registered_); 229 DCHECK(!clients_registered_);
228 clients_registered_ = true; 230 clients_registered_ = true;
229 client_a_.Register(&manager_); 231 client_a_.Register(&manager_);
230 client_b_.Register(&manager_); 232 client_b_.Register(&manager_);
231 client_c_.Register(&manager_); 233 client_c_.Register(&manager_);
232 AssertCorrectBFSState(); 234 AssertCorrectBFSState();
233 } 235 }
234 236
235 void UnregisterClients() { 237 void UnregisterClients() {
236 DCHECK(clients_registered_); 238 DCHECK(clients_registered_);
237 clients_registered_ = false; 239 clients_registered_ = false;
238 client_a_.Unregister(); 240 client_a_.Unregister();
239 client_b_.Unregister(); 241 client_b_.Unregister();
240 client_c_.Unregister(); 242 client_c_.Unregister();
241 AssertCorrectBFSState(); 243 AssertCorrectBFSState();
242 } 244 }
243 245
244 void RegisterBFS() { 246 void RegisterBFS() {
245 DCHECK(!bfs_registered_); 247 DCHECK(!bfs_registered_);
246 bfs_registered_ = true; 248 bfs_registered_ = true;
247 manager_.RegisterBeginFrameSource(&source_, client_a_.id_namespace()); 249 manager_.RegisterBeginFrameSource(&source_, client_a_.frame_sink_id());
248 AssertCorrectBFSState(); 250 AssertCorrectBFSState();
249 } 251 }
250 void UnregisterBFS() { 252 void UnregisterBFS() {
251 DCHECK(bfs_registered_); 253 DCHECK(bfs_registered_);
252 bfs_registered_ = false; 254 bfs_registered_ = false;
253 manager_.UnregisterBeginFrameSource(&source_); 255 manager_.UnregisterBeginFrameSource(&source_);
254 AssertCorrectBFSState(); 256 AssertCorrectBFSState();
255 } 257 }
256 258
257 void AssertEmptyBFS() { 259 void AssertEmptyBFS() {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 366 }
365 367
366 INSTANTIATE_TEST_CASE_P( 368 INSTANTIATE_TEST_CASE_P(
367 SurfaceManagerOrderingParamTestInstantiation, 369 SurfaceManagerOrderingParamTestInstantiation,
368 SurfaceManagerOrderingParamTest, 370 SurfaceManagerOrderingParamTest,
369 ::testing::Combine(::testing::ValuesIn(kRegisterOrderList), 371 ::testing::Combine(::testing::ValuesIn(kRegisterOrderList),
370 ::testing::ValuesIn(kUnregisterOrderList), 372 ::testing::ValuesIn(kUnregisterOrderList),
371 ::testing::ValuesIn(kBFSOrderList))); 373 ::testing::ValuesIn(kBFSOrderList)));
372 374
373 } // namespace cc 375 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/surface_manager.cc ('k') | cc/surfaces/surface_sequence.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698