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