OLD | NEW |
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/frame_sink_manager_client.h" |
| 9 #include "cc/surfaces/surface_aggregator_client.h" |
8 #include "cc/surfaces/surface_factory_client.h" | 10 #include "cc/surfaces/surface_factory_client.h" |
9 #include "cc/surfaces/surface_manager.h" | 11 #include "cc/surfaces/surface_manager.h" |
| 12 #include "cc/surfaces/surface_resource_holder_client.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
11 | 14 |
12 namespace cc { | 15 namespace cc { |
13 | 16 |
14 class FakeSurfaceFactoryClient : public SurfaceFactoryClient { | 17 class FakeFrameSinkManagerClient : public FrameSinkManagerClient { |
15 public: | 18 public: |
16 explicit FakeSurfaceFactoryClient(const FrameSinkId& frame_sink_id) | 19 explicit FakeFrameSinkManagerClient(const FrameSinkId& frame_sink_id) |
17 : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) {} | 20 : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) {} |
18 | 21 |
19 FakeSurfaceFactoryClient(const FrameSinkId& frame_sink_id, | 22 FakeFrameSinkManagerClient(const FrameSinkId& frame_sink_id, |
20 SurfaceManager* manager) | 23 SurfaceManager* manager) |
21 : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) { | 24 : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) { |
22 DCHECK(manager); | 25 DCHECK(manager); |
23 Register(manager); | 26 Register(manager); |
24 } | 27 } |
25 | 28 |
26 ~FakeSurfaceFactoryClient() override { | 29 ~FakeFrameSinkManagerClient() override { |
27 if (manager_) { | 30 if (manager_) { |
28 Unregister(); | 31 Unregister(); |
29 } | 32 } |
30 EXPECT_EQ(nullptr, source_); | 33 EXPECT_EQ(nullptr, source_); |
31 } | 34 } |
32 | 35 |
33 BeginFrameSource* source() { return source_; } | 36 BeginFrameSource* source() { return source_; } |
34 const FrameSinkId& frame_sink_id() { return frame_sink_id_; } | 37 const FrameSinkId& frame_sink_id() { return frame_sink_id_; } |
35 | 38 |
36 void Register(SurfaceManager* manager) { | 39 void Register(SurfaceManager* manager) { |
37 EXPECT_EQ(nullptr, manager_); | 40 EXPECT_EQ(nullptr, manager_); |
38 manager_ = manager; | 41 manager_ = manager; |
39 manager_->RegisterSurfaceFactoryClient(frame_sink_id_, this); | 42 manager_->RegisterFrameSinkManagerClient(frame_sink_id_, this); |
40 } | 43 } |
41 | 44 |
42 void Unregister() { | 45 void Unregister() { |
43 EXPECT_NE(manager_, nullptr); | 46 EXPECT_NE(manager_, nullptr); |
44 manager_->UnregisterSurfaceFactoryClient(frame_sink_id_); | 47 manager_->UnregisterFrameSinkManagerClient(frame_sink_id_); |
45 manager_ = nullptr; | 48 manager_ = nullptr; |
46 } | 49 } |
47 | 50 |
48 // SurfaceFactoryClient implementation. | 51 // FrameSinkManagerClient implementation. |
49 void ReturnResources(const ReturnedResourceArray& resources) override {} | |
50 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { | 52 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { |
51 DCHECK(!source_ || !begin_frame_source); | 53 DCHECK(!source_ || !begin_frame_source); |
52 source_ = begin_frame_source; | 54 source_ = begin_frame_source; |
53 }; | 55 } |
54 | 56 |
55 private: | 57 private: |
56 BeginFrameSource* source_; | 58 BeginFrameSource* source_; |
57 SurfaceManager* manager_; | 59 SurfaceManager* manager_; |
58 FrameSinkId frame_sink_id_; | 60 FrameSinkId frame_sink_id_; |
59 }; | 61 }; |
60 | 62 |
61 class SurfaceManagerTest : public testing::Test { | 63 class SurfaceManagerTest : public testing::Test { |
62 public: | 64 public: |
63 // These tests don't care about namespace registration, so just preregister | 65 // These tests don't care about namespace registration, so just preregister |
64 // a set of namespaces that tests can use freely without worrying if they're | 66 // a set of namespaces that tests can use freely without worrying if they're |
65 // valid or not. | 67 // valid or not. |
66 enum { MAX_FRAME_SINK = 10 }; | 68 enum { MAX_FRAME_SINK = 10 }; |
67 | 69 |
68 SurfaceManagerTest() { | 70 SurfaceManagerTest() { |
69 for (size_t i = 0; i < MAX_FRAME_SINK; ++i) | 71 for (size_t i = 0; i < MAX_FRAME_SINK; ++i) |
70 manager_.RegisterFrameSinkId(FrameSinkId(i, i)); | 72 manager_.RegisterFrameSinkId(FrameSinkId(i, i)); |
71 } | 73 } |
72 | 74 |
73 ~SurfaceManagerTest() override { | 75 ~SurfaceManagerTest() override { |
74 for (size_t i = 0; i < MAX_FRAME_SINK; ++i) | 76 for (size_t i = 0; i < MAX_FRAME_SINK; ++i) |
75 manager_.InvalidateFrameSinkId(FrameSinkId(i, i)); | 77 manager_.InvalidateFrameSinkId(FrameSinkId(i, i)); |
76 } | 78 } |
77 | 79 |
78 protected: | 80 protected: |
79 SurfaceManager manager_; | 81 SurfaceManager manager_; |
80 }; | 82 }; |
81 | 83 |
82 TEST_F(SurfaceManagerTest, SingleClients) { | 84 TEST_F(SurfaceManagerTest, SingleClients) { |
83 FakeSurfaceFactoryClient client(FrameSinkId(1, 1)); | 85 FakeFrameSinkManagerClient client(FrameSinkId(1, 1)); |
84 FakeSurfaceFactoryClient other_client(FrameSinkId(2, 2)); | 86 FakeFrameSinkManagerClient other_client(FrameSinkId(2, 2)); |
85 StubBeginFrameSource source; | 87 StubBeginFrameSource source; |
86 | 88 |
87 EXPECT_EQ(nullptr, client.source()); | 89 EXPECT_EQ(nullptr, client.source()); |
88 EXPECT_EQ(nullptr, other_client.source()); | 90 EXPECT_EQ(nullptr, other_client.source()); |
89 client.Register(&manager_); | 91 client.Register(&manager_); |
90 other_client.Register(&manager_); | 92 other_client.Register(&manager_); |
91 EXPECT_EQ(nullptr, client.source()); | 93 EXPECT_EQ(nullptr, client.source()); |
92 EXPECT_EQ(nullptr, other_client.source()); | 94 EXPECT_EQ(nullptr, other_client.source()); |
93 | 95 |
94 // Test setting unsetting BFS | 96 // Test setting unsetting BFS |
(...skipping 18 matching lines...) Expand all Loading... |
113 manager_.UnregisterBeginFrameSource(&source); | 115 manager_.UnregisterBeginFrameSource(&source); |
114 EXPECT_EQ(nullptr, client.source()); | 116 EXPECT_EQ(nullptr, client.source()); |
115 } | 117 } |
116 | 118 |
117 TEST_F(SurfaceManagerTest, MultipleDisplays) { | 119 TEST_F(SurfaceManagerTest, MultipleDisplays) { |
118 StubBeginFrameSource root1_source; | 120 StubBeginFrameSource root1_source; |
119 StubBeginFrameSource root2_source; | 121 StubBeginFrameSource root2_source; |
120 | 122 |
121 // root1 -> A -> B | 123 // root1 -> A -> B |
122 // root2 -> C | 124 // root2 -> C |
123 FakeSurfaceFactoryClient root1(FrameSinkId(1, 1), &manager_); | 125 FakeFrameSinkManagerClient root1(FrameSinkId(1, 1), &manager_); |
124 FakeSurfaceFactoryClient root2(FrameSinkId(2, 2), &manager_); | 126 FakeFrameSinkManagerClient root2(FrameSinkId(2, 2), &manager_); |
125 FakeSurfaceFactoryClient client_a(FrameSinkId(3, 3), &manager_); | 127 FakeFrameSinkManagerClient client_a(FrameSinkId(3, 3), &manager_); |
126 FakeSurfaceFactoryClient client_b(FrameSinkId(4, 4), &manager_); | 128 FakeFrameSinkManagerClient client_b(FrameSinkId(4, 4), &manager_); |
127 FakeSurfaceFactoryClient client_c(FrameSinkId(5, 5), &manager_); | 129 FakeFrameSinkManagerClient client_c(FrameSinkId(5, 5), &manager_); |
128 | 130 |
129 manager_.RegisterBeginFrameSource(&root1_source, root1.frame_sink_id()); | 131 manager_.RegisterBeginFrameSource(&root1_source, root1.frame_sink_id()); |
130 manager_.RegisterBeginFrameSource(&root2_source, root2.frame_sink_id()); | 132 manager_.RegisterBeginFrameSource(&root2_source, root2.frame_sink_id()); |
131 EXPECT_EQ(root1.source(), &root1_source); | 133 EXPECT_EQ(root1.source(), &root1_source); |
132 EXPECT_EQ(root2.source(), &root2_source); | 134 EXPECT_EQ(root2.source(), &root2_source); |
133 | 135 |
134 // Set up initial hierarchy. | 136 // Set up initial hierarchy. |
135 manager_.RegisterFrameSinkHierarchy(root1.frame_sink_id(), | 137 manager_.RegisterFrameSinkHierarchy(root1.frame_sink_id(), |
136 client_a.frame_sink_id()); | 138 client_a.frame_sink_id()); |
137 EXPECT_EQ(client_a.source(), root1.source()); | 139 EXPECT_EQ(client_a.source(), root1.source()); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 // FrameSinkId is preserved even if that FrameSinkId has no children | 187 // FrameSinkId is preserved even if that FrameSinkId has no children |
186 // and does not have a corresponding SurfaceFactoryClient. | 188 // and does not have a corresponding SurfaceFactoryClient. |
187 TEST_F(SurfaceManagerTest, ParentWithoutClientRetained) { | 189 TEST_F(SurfaceManagerTest, ParentWithoutClientRetained) { |
188 StubBeginFrameSource root_source; | 190 StubBeginFrameSource root_source; |
189 | 191 |
190 constexpr FrameSinkId kFrameSinkIdRoot(1, 1); | 192 constexpr FrameSinkId kFrameSinkIdRoot(1, 1); |
191 constexpr FrameSinkId kFrameSinkIdA(2, 2); | 193 constexpr FrameSinkId kFrameSinkIdA(2, 2); |
192 constexpr FrameSinkId kFrameSinkIdB(3, 3); | 194 constexpr FrameSinkId kFrameSinkIdB(3, 3); |
193 constexpr FrameSinkId kFrameSinkIdC(4, 4); | 195 constexpr FrameSinkId kFrameSinkIdC(4, 4); |
194 | 196 |
195 FakeSurfaceFactoryClient root(kFrameSinkIdRoot, &manager_); | 197 FakeFrameSinkManagerClient root(kFrameSinkIdRoot, &manager_); |
196 FakeSurfaceFactoryClient client_b(kFrameSinkIdB, &manager_); | 198 FakeFrameSinkManagerClient client_b(kFrameSinkIdB, &manager_); |
197 FakeSurfaceFactoryClient client_c(kFrameSinkIdC, &manager_); | 199 FakeFrameSinkManagerClient client_c(kFrameSinkIdC, &manager_); |
198 | 200 |
199 manager_.RegisterBeginFrameSource(&root_source, root.frame_sink_id()); | 201 manager_.RegisterBeginFrameSource(&root_source, root.frame_sink_id()); |
200 EXPECT_EQ(&root_source, root.source()); | 202 EXPECT_EQ(&root_source, root.source()); |
201 | 203 |
202 // Set up initial hierarchy: root -> A -> B. | 204 // Set up initial hierarchy: root -> A -> B. |
203 // Note that A does not have a SurfaceFactoryClient. | 205 // Note that A does not have a SurfaceFactoryClient. |
204 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdRoot, kFrameSinkIdA); | 206 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdRoot, kFrameSinkIdA); |
205 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdA, kFrameSinkIdB); | 207 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdA, kFrameSinkIdB); |
206 // The root's BeginFrameSource should propagate to B. | 208 // The root's BeginFrameSource should propagate to B. |
207 EXPECT_EQ(root.source(), client_b.source()); | 209 EXPECT_EQ(root.source(), client_b.source()); |
(...skipping 16 matching lines...) Expand all Loading... |
224 // propagates all the way to C. | 226 // propagates all the way to C. |
225 TEST_F(SurfaceManagerTest, | 227 TEST_F(SurfaceManagerTest, |
226 ParentWithoutClientRetained_LateBeginFrameRegistration) { | 228 ParentWithoutClientRetained_LateBeginFrameRegistration) { |
227 StubBeginFrameSource root_source; | 229 StubBeginFrameSource root_source; |
228 | 230 |
229 constexpr FrameSinkId kFrameSinkIdRoot(1, 1); | 231 constexpr FrameSinkId kFrameSinkIdRoot(1, 1); |
230 constexpr FrameSinkId kFrameSinkIdA(2, 2); | 232 constexpr FrameSinkId kFrameSinkIdA(2, 2); |
231 constexpr FrameSinkId kFrameSinkIdB(3, 3); | 233 constexpr FrameSinkId kFrameSinkIdB(3, 3); |
232 constexpr FrameSinkId kFrameSinkIdC(4, 4); | 234 constexpr FrameSinkId kFrameSinkIdC(4, 4); |
233 | 235 |
234 FakeSurfaceFactoryClient root(kFrameSinkIdRoot, &manager_); | 236 FakeFrameSinkManagerClient root(kFrameSinkIdRoot, &manager_); |
235 FakeSurfaceFactoryClient client_b(kFrameSinkIdB, &manager_); | 237 FakeFrameSinkManagerClient client_b(kFrameSinkIdB, &manager_); |
236 FakeSurfaceFactoryClient client_c(kFrameSinkIdC, &manager_); | 238 FakeFrameSinkManagerClient client_c(kFrameSinkIdC, &manager_); |
237 | 239 |
238 // Set up initial hierarchy: root -> A -> B. | 240 // Set up initial hierarchy: root -> A -> B. |
239 // Note that A does not have a SurfaceFactoryClient. | 241 // Note that A does not have a SurfaceFactoryClient. |
240 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdRoot, kFrameSinkIdA); | 242 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdRoot, kFrameSinkIdA); |
241 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdA, kFrameSinkIdB); | 243 manager_.RegisterFrameSinkHierarchy(kFrameSinkIdA, kFrameSinkIdB); |
242 // The root does not yet have a BeginFrameSource so client B should not have | 244 // The root does not yet have a BeginFrameSource so client B should not have |
243 // one either. | 245 // one either. |
244 EXPECT_EQ(nullptr, client_b.source()); | 246 EXPECT_EQ(nullptr, client_b.source()); |
245 | 247 |
246 // Unregister B, and attach C to A: root -> A -> C | 248 // Unregister B, and attach C to A: root -> A -> C |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 EXPECT_EQ(nullptr, client_b_.source()); | 359 EXPECT_EQ(nullptr, client_b_.source()); |
358 EXPECT_EQ(nullptr, client_c_.source()); | 360 EXPECT_EQ(nullptr, client_c_.source()); |
359 return; | 361 return; |
360 } | 362 } |
361 | 363 |
362 AssertAllValidBFS(); | 364 AssertAllValidBFS(); |
363 } | 365 } |
364 | 366 |
365 StubBeginFrameSource source_; | 367 StubBeginFrameSource source_; |
366 // A -> B -> C hierarchy, with A always having the BFS. | 368 // A -> B -> C hierarchy, with A always having the BFS. |
367 FakeSurfaceFactoryClient client_a_; | 369 FakeFrameSinkManagerClient client_a_; |
368 FakeSurfaceFactoryClient client_b_; | 370 FakeFrameSinkManagerClient client_b_; |
369 FakeSurfaceFactoryClient client_c_; | 371 FakeFrameSinkManagerClient client_c_; |
370 | 372 |
371 bool hierarchy_registered_; | 373 bool hierarchy_registered_; |
372 bool clients_registered_; | 374 bool clients_registered_; |
373 bool bfs_registered_; | 375 bool bfs_registered_; |
374 }; | 376 }; |
375 | 377 |
376 enum RegisterOrder { REGISTER_HIERARCHY_FIRST, REGISTER_CLIENTS_FIRST }; | 378 enum RegisterOrder { REGISTER_HIERARCHY_FIRST, REGISTER_CLIENTS_FIRST }; |
377 enum UnregisterOrder { UNREGISTER_HIERARCHY_FIRST, UNREGISTER_CLIENTS_FIRST }; | 379 enum UnregisterOrder { UNREGISTER_HIERARCHY_FIRST, UNREGISTER_CLIENTS_FIRST }; |
378 enum BFSOrder { BFS_FIRST, BFS_SECOND, BFS_THIRD }; | 380 enum BFSOrder { BFS_FIRST, BFS_SECOND, BFS_THIRD }; |
379 | 381 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 } | 445 } |
444 | 446 |
445 INSTANTIATE_TEST_CASE_P( | 447 INSTANTIATE_TEST_CASE_P( |
446 SurfaceManagerOrderingParamTestInstantiation, | 448 SurfaceManagerOrderingParamTestInstantiation, |
447 SurfaceManagerOrderingParamTest, | 449 SurfaceManagerOrderingParamTest, |
448 ::testing::Combine(::testing::ValuesIn(kRegisterOrderList), | 450 ::testing::Combine(::testing::ValuesIn(kRegisterOrderList), |
449 ::testing::ValuesIn(kUnregisterOrderList), | 451 ::testing::ValuesIn(kUnregisterOrderList), |
450 ::testing::ValuesIn(kBFSOrderList))); | 452 ::testing::ValuesIn(kBFSOrderList))); |
451 | 453 |
452 } // namespace cc | 454 } // namespace cc |
OLD | NEW |