OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "cc/surfaces/display_scheduler.h" | 5 #include "cc/surfaces/display_scheduler.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" |
8 #include "base/test/null_task_runner.h" | 9 #include "base/test/null_task_runner.h" |
9 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
10 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
11 #include "cc/output/begin_frame_args.h" | 12 #include "cc/output/begin_frame_args.h" |
12 #include "cc/surfaces/display.h" | 13 #include "cc/surfaces/display.h" |
| 14 #include "cc/surfaces/surface_info.h" |
13 #include "cc/test/fake_external_begin_frame_source.h" | 15 #include "cc/test/fake_external_begin_frame_source.h" |
14 #include "cc/test/scheduler_test_common.h" | 16 #include "cc/test/scheduler_test_common.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
16 | 18 |
17 namespace cc { | 19 namespace cc { |
18 namespace { | 20 namespace { |
19 | 21 |
20 const int kMaxPendingSwaps = 1; | 22 const int kMaxPendingSwaps = 1; |
21 | 23 |
22 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 24 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
23 | 25 |
24 class FakeDisplaySchedulerClient : public DisplaySchedulerClient { | 26 class FakeDisplaySchedulerClient : public DisplaySchedulerClient { |
25 public: | 27 public: |
26 FakeDisplaySchedulerClient() : draw_and_swap_count_(0) {} | 28 FakeDisplaySchedulerClient() |
| 29 : draw_and_swap_count_(0), next_draw_and_swap_fails_(false) {} |
27 | 30 |
28 ~FakeDisplaySchedulerClient() override {} | 31 ~FakeDisplaySchedulerClient() override {} |
29 | 32 |
30 bool DrawAndSwap() override { | 33 bool DrawAndSwap() override { |
31 draw_and_swap_count_++; | 34 draw_and_swap_count_++; |
32 return true; | 35 |
| 36 bool success = !next_draw_and_swap_fails_; |
| 37 next_draw_and_swap_fails_ = false; |
| 38 |
| 39 if (success) |
| 40 undrawn_surfaces_.clear(); |
| 41 return success; |
33 } | 42 } |
34 | 43 |
35 void Reset() { draw_and_swap_count_ = 0; } | 44 bool SurfaceHasUndrawnFrame(const SurfaceId& surface_id) const override { |
| 45 return base::ContainsKey(undrawn_surfaces_, surface_id); |
| 46 } |
36 | 47 |
37 int draw_and_swap_count() const { return draw_and_swap_count_; } | 48 int draw_and_swap_count() const { return draw_and_swap_count_; } |
38 | 49 |
| 50 void SetNextDrawAndSwapFails() { next_draw_and_swap_fails_ = true; } |
| 51 |
| 52 void SurfaceDamaged(const SurfaceId& surface_id) { |
| 53 undrawn_surfaces_.insert(surface_id); |
| 54 } |
| 55 |
39 protected: | 56 protected: |
40 int draw_and_swap_count_; | 57 int draw_and_swap_count_; |
| 58 bool next_draw_and_swap_fails_; |
| 59 std::set<SurfaceId> undrawn_surfaces_; |
41 }; | 60 }; |
42 | 61 |
43 class TestDisplayScheduler : public DisplayScheduler { | 62 class TestDisplayScheduler : public DisplayScheduler { |
44 public: | 63 public: |
45 TestDisplayScheduler(BeginFrameSource* begin_frame_source, | 64 TestDisplayScheduler(BeginFrameSource* begin_frame_source, |
46 base::SingleThreadTaskRunner* task_runner, | 65 base::SingleThreadTaskRunner* task_runner, |
47 int max_pending_swaps) | 66 int max_pending_swaps) |
48 : DisplayScheduler(task_runner, max_pending_swaps), | 67 : DisplayScheduler(task_runner, max_pending_swaps), |
49 scheduler_begin_frame_deadline_count_(0) { | 68 scheduler_begin_frame_deadline_count_(0) { |
50 SetBeginFrameSource(begin_frame_source); | 69 SetBeginFrameSource(begin_frame_source); |
(...skipping 17 matching lines...) Expand all Loading... |
68 } | 87 } |
69 | 88 |
70 int scheduler_begin_frame_deadline_count() { | 89 int scheduler_begin_frame_deadline_count() { |
71 return scheduler_begin_frame_deadline_count_; | 90 return scheduler_begin_frame_deadline_count_; |
72 } | 91 } |
73 | 92 |
74 bool inside_begin_frame_deadline_interval() { | 93 bool inside_begin_frame_deadline_interval() { |
75 return inside_begin_frame_deadline_interval_; | 94 return inside_begin_frame_deadline_interval_; |
76 } | 95 } |
77 | 96 |
| 97 bool has_pending_surfaces() { return has_pending_surfaces_; } |
| 98 |
78 protected: | 99 protected: |
79 int scheduler_begin_frame_deadline_count_; | 100 int scheduler_begin_frame_deadline_count_; |
80 }; | 101 }; |
81 | 102 |
82 class DisplaySchedulerTest : public testing::Test { | 103 class DisplaySchedulerTest : public testing::Test { |
83 public: | 104 public: |
84 DisplaySchedulerTest() | 105 DisplaySchedulerTest() |
85 : fake_begin_frame_source_(0.f, false), | 106 : fake_begin_frame_source_(0.f, false), |
86 task_runner_(new base::NullTaskRunner), | 107 task_runner_(new base::NullTaskRunner), |
87 scheduler_(&fake_begin_frame_source_, | 108 scheduler_(&fake_begin_frame_source_, |
88 task_runner_.get(), | 109 task_runner_.get(), |
89 kMaxPendingSwaps) { | 110 kMaxPendingSwaps) { |
90 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); | 111 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); |
91 scheduler_.SetClient(&client_); | 112 scheduler_.SetClient(&client_); |
92 } | 113 } |
93 | 114 |
94 ~DisplaySchedulerTest() override {} | 115 ~DisplaySchedulerTest() override {} |
95 | 116 |
96 void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); } | 117 void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); } |
97 | 118 |
98 void AdvanceTimeAndBeginFrameForTest() { | 119 void AdvanceTimeAndBeginFrameForTest( |
| 120 const std::list<SurfaceId>& observing_surfaces) { |
99 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); | 121 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); |
100 // FakeBeginFrameSource deals with |source_id| and |sequence_number|. | 122 // FakeBeginFrameSource deals with |source_id| and |sequence_number|. |
101 BeginFrameArgs args = fake_begin_frame_source_.CreateBeginFrameArgs( | 123 last_begin_frame_args_ = fake_begin_frame_source_.CreateBeginFrameArgs( |
102 BEGINFRAME_FROM_HERE, &now_src_); | 124 BEGINFRAME_FROM_HERE, &now_src_); |
103 fake_begin_frame_source_.TestOnBeginFrame(args); | 125 fake_begin_frame_source_.TestOnBeginFrame(last_begin_frame_args_); |
| 126 for (const SurfaceId& surface : observing_surfaces) |
| 127 scheduler_.SurfaceDamageExpected(surface, last_begin_frame_args_); |
| 128 } |
| 129 |
| 130 void SurfaceDamaged(const SurfaceId& surface_id) { |
| 131 client_.SurfaceDamaged(surface_id); |
| 132 scheduler_.SurfaceDamaged(surface_id, AckForCurrentBeginFrame(), true); |
104 } | 133 } |
105 | 134 |
106 protected: | 135 protected: |
107 base::SimpleTestTickClock& now_src() { return now_src_; } | 136 base::SimpleTestTickClock& now_src() { return now_src_; } |
108 FakeDisplaySchedulerClient& client() { return client_; } | 137 FakeDisplaySchedulerClient& client() { return client_; } |
109 DisplayScheduler& scheduler() { return scheduler_; } | 138 DisplayScheduler& scheduler() { return scheduler_; } |
| 139 BeginFrameAck AckForCurrentBeginFrame() { |
| 140 DCHECK(last_begin_frame_args_.IsValid()); |
| 141 return BeginFrameAck(last_begin_frame_args_.source_id, |
| 142 last_begin_frame_args_.sequence_number, |
| 143 last_begin_frame_args_.sequence_number, true); |
| 144 } |
110 | 145 |
111 FakeExternalBeginFrameSource fake_begin_frame_source_; | 146 FakeExternalBeginFrameSource fake_begin_frame_source_; |
| 147 BeginFrameArgs last_begin_frame_args_; |
112 | 148 |
113 base::SimpleTestTickClock now_src_; | 149 base::SimpleTestTickClock now_src_; |
114 scoped_refptr<base::NullTaskRunner> task_runner_; | 150 scoped_refptr<base::NullTaskRunner> task_runner_; |
115 FakeDisplaySchedulerClient client_; | 151 FakeDisplaySchedulerClient client_; |
116 TestDisplayScheduler scheduler_; | 152 TestDisplayScheduler scheduler_; |
117 }; | 153 }; |
118 | 154 |
119 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { | 155 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { |
120 SurfaceId root_surface_id1( | 156 SurfaceId root_surface_id1( |
121 kArbitraryFrameSinkId, | 157 kArbitraryFrameSinkId, |
122 LocalSurfaceId(1, base::UnguessableToken::Create())); | 158 LocalSurfaceId(1, base::UnguessableToken::Create())); |
123 SurfaceId root_surface_id2( | 159 SurfaceId root_surface_id2( |
124 kArbitraryFrameSinkId, | 160 kArbitraryFrameSinkId, |
125 LocalSurfaceId(2, base::UnguessableToken::Create())); | 161 LocalSurfaceId(2, base::UnguessableToken::Create())); |
126 SurfaceId sid1(kArbitraryFrameSinkId, | 162 SurfaceId sid1(kArbitraryFrameSinkId, |
127 LocalSurfaceId(3, base::UnguessableToken::Create())); | 163 LocalSurfaceId(3, base::UnguessableToken::Create())); |
128 base::TimeTicks late_deadline; | 164 base::TimeTicks late_deadline; |
129 | 165 |
130 scheduler_.SetVisible(true); | 166 scheduler_.SetVisible(true); |
131 | 167 |
132 // Go trough an initial BeginFrame cycle with the root surface. | 168 // Go trough an initial BeginFrame cycle with the root surface. |
133 AdvanceTimeAndBeginFrameForTest(); | 169 AdvanceTimeAndBeginFrameForTest({}); |
| 170 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id1, 1.0f, gfx::Size())); |
134 scheduler_.SetNewRootSurface(root_surface_id1); | 171 scheduler_.SetNewRootSurface(root_surface_id1); |
135 scheduler_.BeginFrameDeadlineForTest(); | 172 scheduler_.BeginFrameDeadlineForTest(); |
136 | 173 |
137 // Resize on the next begin frame cycle should cause the deadline to wait | 174 // Resize on the next begin frame cycle should cause the deadline to wait |
138 // for a new root surface. | 175 // for a new root surface. |
139 AdvanceTimeAndBeginFrameForTest(); | 176 AdvanceTimeAndBeginFrameForTest({root_surface_id1}); |
140 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 177 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
141 scheduler_.SurfaceDamaged(sid1); | 178 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 179 SurfaceDamaged(sid1); |
142 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 180 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
143 scheduler_.DisplayResized(); | 181 scheduler_.DisplayResized(); |
144 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 182 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 183 scheduler_.SurfaceDestroyed(root_surface_id1); |
| 184 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id2, 1.0f, gfx::Size())); |
145 scheduler_.SetNewRootSurface(root_surface_id2); | 185 scheduler_.SetNewRootSurface(root_surface_id2); |
146 EXPECT_GE(now_src().NowTicks(), | 186 EXPECT_GE(now_src().NowTicks(), |
147 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 187 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
148 scheduler_.BeginFrameDeadlineForTest(); | 188 scheduler_.BeginFrameDeadlineForTest(); |
149 | 189 |
150 // Verify deadline goes back to normal after resize. | 190 // Verify deadline goes back to normal after resize. |
151 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 191 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
152 AdvanceTimeAndBeginFrameForTest(); | 192 AdvanceTimeAndBeginFrameForTest({root_surface_id2, sid1}); |
153 scheduler_.SurfaceDamaged(sid1); | 193 SurfaceDamaged(sid1); |
154 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 194 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
155 scheduler_.SurfaceDamaged(root_surface_id2); | 195 SurfaceDamaged(root_surface_id2); |
156 EXPECT_GE(now_src().NowTicks(), | 196 EXPECT_GE(now_src().NowTicks(), |
157 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 197 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
158 scheduler_.BeginFrameDeadlineForTest(); | 198 scheduler_.BeginFrameDeadlineForTest(); |
159 } | 199 } |
160 | 200 |
161 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { | 201 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { |
162 SurfaceId root_surface_id( | 202 SurfaceId root_surface_id( |
163 kArbitraryFrameSinkId, | 203 kArbitraryFrameSinkId, |
164 LocalSurfaceId(1, base::UnguessableToken::Create())); | 204 LocalSurfaceId(1, base::UnguessableToken::Create())); |
165 SurfaceId sid1(kArbitraryFrameSinkId, | 205 SurfaceId sid1(kArbitraryFrameSinkId, |
166 LocalSurfaceId(2, base::UnguessableToken::Create())); | 206 LocalSurfaceId(2, base::UnguessableToken::Create())); |
167 base::TimeTicks late_deadline; | 207 base::TimeTicks late_deadline; |
168 | 208 |
169 scheduler_.SetVisible(true); | 209 scheduler_.SetVisible(true); |
170 | 210 |
171 // Go trough an initial BeginFrame cycle with the root surface. | 211 // Go trough an initial BeginFrame cycle with the root surface. |
172 AdvanceTimeAndBeginFrameForTest(); | 212 AdvanceTimeAndBeginFrameForTest({}); |
| 213 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
173 scheduler_.SetNewRootSurface(root_surface_id); | 214 scheduler_.SetNewRootSurface(root_surface_id); |
174 scheduler_.BeginFrameDeadlineForTest(); | 215 scheduler_.BeginFrameDeadlineForTest(); |
175 | 216 |
176 // Resize on the next begin frame cycle should cause the deadline to wait | 217 // Resize on the next begin frame cycle should cause the deadline to wait |
177 // for a new root surface. | 218 // for a new root surface. |
178 AdvanceTimeAndBeginFrameForTest(); | 219 AdvanceTimeAndBeginFrameForTest({root_surface_id}); |
179 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 220 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
180 scheduler_.SurfaceDamaged(sid1); | 221 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 222 SurfaceDamaged(sid1); |
181 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 223 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
182 scheduler_.DisplayResized(); | 224 scheduler_.DisplayResized(); |
183 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 225 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
184 scheduler_.SurfaceDamaged(root_surface_id); | 226 SurfaceDamaged(root_surface_id); |
185 EXPECT_GE(now_src().NowTicks(), | 227 EXPECT_GE(now_src().NowTicks(), |
186 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 228 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
187 scheduler_.BeginFrameDeadlineForTest(); | 229 scheduler_.BeginFrameDeadlineForTest(); |
188 | 230 |
189 // Verify deadline goes back to normal after resize. | 231 // Verify deadline goes back to normal after resize. |
190 AdvanceTimeAndBeginFrameForTest(); | 232 AdvanceTimeAndBeginFrameForTest({root_surface_id, sid1}); |
191 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 233 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
192 scheduler_.SurfaceDamaged(sid1); | 234 SurfaceDamaged(sid1); |
193 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 235 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
194 scheduler_.SurfaceDamaged(root_surface_id); | 236 SurfaceDamaged(root_surface_id); |
195 EXPECT_GE(now_src().NowTicks(), | 237 EXPECT_GE(now_src().NowTicks(), |
196 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 238 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
197 scheduler_.BeginFrameDeadlineForTest(); | 239 scheduler_.BeginFrameDeadlineForTest(); |
198 } | 240 } |
199 | 241 |
200 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 242 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
201 SurfaceId root_surface_id( | 243 SurfaceId root_surface_id( |
202 kArbitraryFrameSinkId, | 244 kArbitraryFrameSinkId, |
203 LocalSurfaceId(0, base::UnguessableToken::Create())); | 245 LocalSurfaceId(1, base::UnguessableToken::Create())); |
204 SurfaceId sid1(kArbitraryFrameSinkId, | 246 SurfaceId sid1(kArbitraryFrameSinkId, |
205 LocalSurfaceId(1, base::UnguessableToken::Create())); | 247 LocalSurfaceId(2, base::UnguessableToken::Create())); |
206 SurfaceId sid2(kArbitraryFrameSinkId, | 248 SurfaceId sid2(kArbitraryFrameSinkId, |
207 LocalSurfaceId(2, base::UnguessableToken::Create())); | 249 LocalSurfaceId(3, base::UnguessableToken::Create())); |
208 | 250 |
209 scheduler_.SetVisible(true); | 251 scheduler_.SetVisible(true); |
210 | 252 |
211 // Set the root surface | 253 // Create surfaces and set the root surface. |
| 254 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 255 scheduler_.SurfaceCreated(SurfaceInfo(sid2, 1.0f, gfx::Size())); |
| 256 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
212 scheduler_.SetNewRootSurface(root_surface_id); | 257 scheduler_.SetNewRootSurface(root_surface_id); |
213 | 258 |
214 // Get scheduler to detect surface 1 as active by drawing | 259 // Set surface1 as active via SurfaceDamageExpected(). |
215 // two frames in a row with damage from surface 1. | 260 AdvanceTimeAndBeginFrameForTest({sid1}); |
216 AdvanceTimeAndBeginFrameForTest(); | |
217 scheduler_.SurfaceDamaged(sid1); | |
218 scheduler_.BeginFrameDeadlineForTest(); | |
219 AdvanceTimeAndBeginFrameForTest(); | |
220 scheduler_.SurfaceDamaged(sid1); | |
221 scheduler_.BeginFrameDeadlineForTest(); | |
222 | 261 |
223 // Damage only from surface 2 (inactive) does not trigger deadline early. | 262 // Damage only from surface 2 (inactive) does not trigger deadline early. |
224 AdvanceTimeAndBeginFrameForTest(); | 263 SurfaceDamaged(sid2); |
225 scheduler_.SurfaceDamaged(sid2); | 264 EXPECT_TRUE(scheduler_.has_pending_surfaces()); |
226 EXPECT_LT(now_src().NowTicks(), | 265 EXPECT_LT(now_src().NowTicks(), |
227 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 266 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
228 | 267 |
229 // Damage from surface 1 triggers deadline early. | 268 // Damage from surface 1 triggers deadline early. |
230 scheduler_.SurfaceDamaged(sid1); | 269 SurfaceDamaged(sid1); |
| 270 EXPECT_FALSE(scheduler_.has_pending_surfaces()); |
231 EXPECT_GE(now_src().NowTicks(), | 271 EXPECT_GE(now_src().NowTicks(), |
232 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 272 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
233 scheduler_.BeginFrameDeadlineForTest(); | 273 scheduler_.BeginFrameDeadlineForTest(); |
234 | 274 |
235 // Make both surface 1 and 2 active. | 275 // Set both surface 1 and 2 as active via SurfaceDamageExpected(). |
236 AdvanceTimeAndBeginFrameForTest(); | 276 AdvanceTimeAndBeginFrameForTest({sid1, sid2}); |
237 scheduler_.SurfaceDamaged(sid2); | |
238 scheduler_.SurfaceDamaged(sid1); | |
239 scheduler_.BeginFrameDeadlineForTest(); | |
240 | 277 |
241 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. | 278 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. |
242 AdvanceTimeAndBeginFrameForTest(); | |
243 EXPECT_LT(now_src().NowTicks(), | 279 EXPECT_LT(now_src().NowTicks(), |
244 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
245 scheduler_.SurfaceDamaged(sid1); | 281 SurfaceDamaged(sid1); |
246 EXPECT_LT(now_src().NowTicks(), | 282 EXPECT_LT(now_src().NowTicks(), |
247 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 283 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
248 scheduler_.SurfaceDamaged(sid2); | 284 SurfaceDamaged(sid2); |
249 EXPECT_GE(now_src().NowTicks(), | 285 EXPECT_GE(now_src().NowTicks(), |
250 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 286 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
251 scheduler_.BeginFrameDeadlineForTest(); | 287 scheduler_.BeginFrameDeadlineForTest(); |
252 | 288 |
253 // Make the system idle | 289 // SurfaceDamage with |!has_damage| triggers early deadline. |
254 AdvanceTimeAndBeginFrameForTest(); | 290 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 291 EXPECT_LT(now_src().NowTicks(), |
| 292 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 293 BeginFrameAck ack = AckForCurrentBeginFrame(); |
| 294 ack.has_damage = false; |
| 295 scheduler_.SurfaceDamaged(sid1, ack, false); |
| 296 EXPECT_GE(now_src().NowTicks(), |
| 297 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
255 scheduler_.BeginFrameDeadlineForTest(); | 298 scheduler_.BeginFrameDeadlineForTest(); |
256 AdvanceTimeAndBeginFrameForTest(); | 299 |
| 300 // System should be idle now. |
| 301 AdvanceTimeAndBeginFrameForTest({}); |
| 302 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); |
| 303 |
| 304 // SurfaceDamage with |!display_damaged| does not affect needs_draw and |
| 305 // scheduler stays idle. |
| 306 scheduler_.SurfaceDamaged(sid1, AckForCurrentBeginFrame(), false); |
257 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); | 307 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); |
258 | 308 |
259 // Deadline should trigger early if child surfaces are idle and | 309 // Deadline should trigger early if child surfaces are idle and |
260 // we get damage on the root surface. | 310 // we get damage on the root surface. |
261 AdvanceTimeAndBeginFrameForTest(); | 311 scheduler_.SurfaceDamageExpected(root_surface_id, last_begin_frame_args_); |
262 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); | 312 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); |
263 scheduler_.SurfaceDamaged(root_surface_id); | 313 SurfaceDamaged(root_surface_id); |
264 EXPECT_GE(now_src().NowTicks(), | 314 EXPECT_GE(now_src().NowTicks(), |
265 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 315 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
266 scheduler_.BeginFrameDeadlineForTest(); | 316 scheduler_.BeginFrameDeadlineForTest(); |
267 } | 317 } |
268 | 318 |
269 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 319 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
270 SurfaceId root_surface_id( | 320 SurfaceId root_surface_id( |
271 kArbitraryFrameSinkId, | 321 kArbitraryFrameSinkId, |
272 LocalSurfaceId(0, base::UnguessableToken::Create())); | 322 LocalSurfaceId(1, base::UnguessableToken::Create())); |
273 SurfaceId sid1(kArbitraryFrameSinkId, | 323 SurfaceId sid1(kArbitraryFrameSinkId, |
274 LocalSurfaceId(1, base::UnguessableToken::Create())); | 324 LocalSurfaceId(2, base::UnguessableToken::Create())); |
275 | 325 |
276 scheduler_.SetVisible(true); | 326 scheduler_.SetVisible(true); |
277 | 327 |
278 // Set the root surface | 328 // Create surfaces and set the root surface. |
| 329 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 330 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
279 scheduler_.SetNewRootSurface(root_surface_id); | 331 scheduler_.SetNewRootSurface(root_surface_id); |
280 | 332 |
281 // DrawAndSwap normally. | 333 // DrawAndSwap normally. |
282 AdvanceTimeAndBeginFrameForTest(); | 334 AdvanceTimeAndBeginFrameForTest({sid1}); |
283 EXPECT_LT(now_src().NowTicks(), | 335 EXPECT_LT(now_src().NowTicks(), |
284 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 336 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
285 EXPECT_EQ(0, client_.draw_and_swap_count()); | 337 EXPECT_EQ(0, client_.draw_and_swap_count()); |
286 scheduler_.SurfaceDamaged(sid1); | 338 SurfaceDamaged(sid1); |
287 scheduler_.BeginFrameDeadlineForTest(); | 339 scheduler_.BeginFrameDeadlineForTest(); |
288 EXPECT_EQ(1, client_.draw_and_swap_count()); | 340 EXPECT_EQ(1, client_.draw_and_swap_count()); |
289 | 341 |
290 // Deadline triggers immediately on OutputSurfaceLost. | 342 // Deadline triggers immediately on OutputSurfaceLost. |
291 AdvanceTimeAndBeginFrameForTest(); | 343 AdvanceTimeAndBeginFrameForTest({sid1}); |
292 EXPECT_LT(now_src().NowTicks(), | 344 EXPECT_LT(now_src().NowTicks(), |
293 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 345 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
294 scheduler_.OutputSurfaceLost(); | 346 scheduler_.OutputSurfaceLost(); |
295 EXPECT_GE(now_src().NowTicks(), | 347 EXPECT_GE(now_src().NowTicks(), |
296 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 348 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
297 | 349 |
298 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 350 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
299 EXPECT_EQ(1, client_.draw_and_swap_count()); | 351 EXPECT_EQ(1, client_.draw_and_swap_count()); |
300 scheduler_.SurfaceDamaged(sid1); | 352 SurfaceDamaged(sid1); |
301 scheduler_.BeginFrameDeadlineForTest(); | 353 scheduler_.BeginFrameDeadlineForTest(); |
302 EXPECT_EQ(1, client_.draw_and_swap_count()); | 354 EXPECT_EQ(1, client_.draw_and_swap_count()); |
303 } | 355 } |
304 | 356 |
305 TEST_F(DisplaySchedulerTest, VisibleWithoutDamageNoTicks) { | 357 TEST_F(DisplaySchedulerTest, VisibleWithoutDamageNoTicks) { |
306 SurfaceId root_surface_id( | 358 SurfaceId root_surface_id( |
307 kArbitraryFrameSinkId, | 359 kArbitraryFrameSinkId, |
308 LocalSurfaceId(0, base::UnguessableToken::Create())); | 360 LocalSurfaceId(1, base::UnguessableToken::Create())); |
309 SurfaceId sid1(kArbitraryFrameSinkId, | |
310 LocalSurfaceId(1, base::UnguessableToken::Create())); | |
311 | 361 |
312 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 362 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
313 scheduler_.SetVisible(true); | 363 scheduler_.SetVisible(true); |
314 | 364 |
315 // When becoming visible, don't start listening for begin frames until there | 365 // When becoming visible, don't start listening for begin frames until there |
316 // is some damage. | 366 // is some damage. |
317 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 367 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
318 scheduler_.SetNewRootSurface(root_surface_id); | 368 scheduler_.SetNewRootSurface(root_surface_id); |
319 | 369 |
320 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 370 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
321 } | 371 } |
322 | 372 |
323 TEST_F(DisplaySchedulerTest, VisibleWithDamageTicks) { | 373 TEST_F(DisplaySchedulerTest, VisibleWithDamageTicks) { |
324 SurfaceId root_surface_id( | 374 SurfaceId root_surface_id( |
325 kArbitraryFrameSinkId, | 375 kArbitraryFrameSinkId, |
326 LocalSurfaceId(0, base::UnguessableToken::Create())); | 376 LocalSurfaceId(1, base::UnguessableToken::Create())); |
327 SurfaceId sid1(kArbitraryFrameSinkId, | 377 SurfaceId sid1(kArbitraryFrameSinkId, |
328 LocalSurfaceId(1, base::UnguessableToken::Create())); | 378 LocalSurfaceId(2, base::UnguessableToken::Create())); |
329 | 379 |
330 scheduler_.SetNewRootSurface(root_surface_id); | 380 scheduler_.SetNewRootSurface(root_surface_id); |
331 | 381 |
332 // When there is damage, start listening for begin frames once becoming | 382 // When there is damage, start listening for begin frames once becoming |
333 // visible. | 383 // visible. |
334 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 384 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
335 scheduler_.SetVisible(true); | 385 scheduler_.SetVisible(true); |
336 | 386 |
337 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 387 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
338 } | 388 } |
339 | 389 |
340 TEST_F(DisplaySchedulerTest, Visibility) { | 390 TEST_F(DisplaySchedulerTest, Visibility) { |
341 SurfaceId root_surface_id( | 391 SurfaceId root_surface_id( |
342 kArbitraryFrameSinkId, | 392 kArbitraryFrameSinkId, |
343 LocalSurfaceId(0, base::UnguessableToken::Create())); | 393 LocalSurfaceId(1, base::UnguessableToken::Create())); |
344 SurfaceId sid1(kArbitraryFrameSinkId, | 394 SurfaceId sid1(kArbitraryFrameSinkId, |
345 LocalSurfaceId(1, base::UnguessableToken::Create())); | 395 LocalSurfaceId(2, base::UnguessableToken::Create())); |
346 | 396 |
| 397 // Create surfaces and set the root surface. |
| 398 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 399 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
347 scheduler_.SetNewRootSurface(root_surface_id); | 400 scheduler_.SetNewRootSurface(root_surface_id); |
348 scheduler_.SetVisible(true); | 401 scheduler_.SetVisible(true); |
349 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 402 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
350 | 403 |
351 // DrawAndSwap normally. | 404 // DrawAndSwap normally. |
352 AdvanceTimeAndBeginFrameForTest(); | 405 AdvanceTimeAndBeginFrameForTest({sid1}); |
353 EXPECT_LT(now_src().NowTicks(), | 406 EXPECT_LT(now_src().NowTicks(), |
354 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 407 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
355 EXPECT_EQ(0, client_.draw_and_swap_count()); | 408 EXPECT_EQ(0, client_.draw_and_swap_count()); |
356 scheduler_.SurfaceDamaged(sid1); | 409 SurfaceDamaged(sid1); |
357 scheduler_.BeginFrameDeadlineForTest(); | 410 scheduler_.BeginFrameDeadlineForTest(); |
358 EXPECT_EQ(1, client_.draw_and_swap_count()); | 411 EXPECT_EQ(1, client_.draw_and_swap_count()); |
359 | 412 |
360 AdvanceTimeAndBeginFrameForTest(); | 413 AdvanceTimeAndBeginFrameForTest({sid1}); |
361 EXPECT_LT(now_src().NowTicks(), | 414 EXPECT_LT(now_src().NowTicks(), |
362 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 415 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
363 | 416 |
364 // Become not visible. | 417 // Become not visible. |
365 scheduler_.SetVisible(false); | 418 scheduler_.SetVisible(false); |
366 | 419 |
367 // It will stop listening for begin frames after the current deadline. | 420 // It will stop listening for begin frames after the current deadline. |
368 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 421 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
369 | 422 |
370 // Deadline does not DrawAndSwap when not visible. | 423 // Deadline does not DrawAndSwap when not visible. |
371 EXPECT_EQ(1, client_.draw_and_swap_count()); | 424 EXPECT_EQ(1, client_.draw_and_swap_count()); |
372 scheduler_.BeginFrameDeadlineForTest(); | 425 scheduler_.BeginFrameDeadlineForTest(); |
373 EXPECT_EQ(1, client_.draw_and_swap_count()); | 426 EXPECT_EQ(1, client_.draw_and_swap_count()); |
374 // Now it stops listening for begin frames. | 427 // Now it stops listening for begin frames. |
375 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 428 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
376 | 429 |
377 // Does not start listening for begin frames when becoming visible without | 430 // Does not start listening for begin frames when becoming visible without |
378 // damage. | 431 // damage. |
379 scheduler_.SetVisible(true); | 432 scheduler_.SetVisible(true); |
380 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 433 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
381 scheduler_.SetVisible(false); | 434 scheduler_.SetVisible(false); |
382 | 435 |
383 // Does not start listening for begin frames when damage arrives. | 436 // Does not start listening for begin frames when damage arrives. |
384 scheduler_.SurfaceDamaged(sid1); | 437 SurfaceDamaged(sid1); |
385 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 438 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
386 | 439 |
387 // But does when becoming visible with damage again. | 440 // But does when becoming visible with damage again. |
388 scheduler_.SetVisible(true); | 441 scheduler_.SetVisible(true); |
389 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 442 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
390 } | 443 } |
391 | 444 |
392 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { | 445 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { |
393 SurfaceId root_surface_id( | 446 SurfaceId root_surface_id( |
394 kArbitraryFrameSinkId, | 447 kArbitraryFrameSinkId, |
395 LocalSurfaceId(0, base::UnguessableToken::Create())); | 448 LocalSurfaceId(1, base::UnguessableToken::Create())); |
396 SurfaceId sid1(kArbitraryFrameSinkId, | 449 SurfaceId sid1(kArbitraryFrameSinkId, |
397 LocalSurfaceId(1, base::UnguessableToken::Create())); | 450 LocalSurfaceId(2, base::UnguessableToken::Create())); |
398 | 451 |
399 scheduler_.SetVisible(true); | 452 scheduler_.SetVisible(true); |
400 | 453 |
401 // Set the root surface | 454 // Create surfaces and set the root surface. |
| 455 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 456 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
402 scheduler_.SetNewRootSurface(root_surface_id); | 457 scheduler_.SetNewRootSurface(root_surface_id); |
403 | 458 |
404 // DrawAndSwap normally. | 459 // DrawAndSwap normally. |
405 AdvanceTimeAndBeginFrameForTest(); | 460 AdvanceTimeAndBeginFrameForTest({sid1}); |
406 EXPECT_LT(now_src().NowTicks(), | 461 EXPECT_LT(now_src().NowTicks(), |
407 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 462 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
408 EXPECT_EQ(0, client_.draw_and_swap_count()); | 463 EXPECT_EQ(0, client_.draw_and_swap_count()); |
409 scheduler_.SurfaceDamaged(sid1); | 464 SurfaceDamaged(sid1); |
410 scheduler_.BeginFrameDeadlineForTest(); | 465 scheduler_.BeginFrameDeadlineForTest(); |
411 EXPECT_EQ(1, client_.draw_and_swap_count()); | 466 EXPECT_EQ(1, client_.draw_and_swap_count()); |
412 | 467 |
413 scheduler_.DisplayResized(); | 468 scheduler_.DisplayResized(); |
414 AdvanceTimeAndBeginFrameForTest(); | 469 AdvanceTimeAndBeginFrameForTest({}); |
415 // DisplayResized should trigger a swap to happen. | 470 // DisplayResized should trigger a swap to happen. |
416 scheduler_.BeginFrameDeadlineForTest(); | 471 scheduler_.BeginFrameDeadlineForTest(); |
417 EXPECT_EQ(2, client_.draw_and_swap_count()); | 472 EXPECT_EQ(2, client_.draw_and_swap_count()); |
418 } | 473 } |
419 | 474 |
420 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 475 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
421 SurfaceId root_surface_id( | 476 SurfaceId root_surface_id( |
422 kArbitraryFrameSinkId, | 477 kArbitraryFrameSinkId, |
423 LocalSurfaceId(0, base::UnguessableToken::Create())); | 478 LocalSurfaceId(1, base::UnguessableToken::Create())); |
424 SurfaceId sid1(kArbitraryFrameSinkId, | 479 SurfaceId sid1(kArbitraryFrameSinkId, |
425 LocalSurfaceId(1, base::UnguessableToken::Create())); | 480 LocalSurfaceId(2, base::UnguessableToken::Create())); |
426 base::TimeTicks late_deadline; | 481 base::TimeTicks late_deadline; |
427 | 482 |
428 scheduler_.SetVisible(true); | 483 scheduler_.SetVisible(true); |
429 | 484 |
430 // Set the root surface | 485 // Create surfaces and set the root surface. |
| 486 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 487 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
431 scheduler_.SetNewRootSurface(root_surface_id); | 488 scheduler_.SetNewRootSurface(root_surface_id); |
432 | 489 |
433 // DrawAndSwap normally. | 490 // DrawAndSwap normally. |
434 AdvanceTimeAndBeginFrameForTest(); | 491 AdvanceTimeAndBeginFrameForTest({sid1}); |
435 EXPECT_LT(now_src().NowTicks(), | 492 EXPECT_LT(now_src().NowTicks(), |
436 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 493 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
437 EXPECT_EQ(0, client_.draw_and_swap_count()); | 494 EXPECT_EQ(0, client_.draw_and_swap_count()); |
438 scheduler_.SurfaceDamaged(sid1); | 495 SurfaceDamaged(sid1); |
439 scheduler_.BeginFrameDeadlineForTest(); | 496 scheduler_.BeginFrameDeadlineForTest(); |
440 EXPECT_EQ(1, client_.draw_and_swap_count()); | 497 EXPECT_EQ(1, client_.draw_and_swap_count()); |
441 | 498 |
442 // Deadline triggers late while root resources are locked. | 499 // Deadline triggers late while root resources are locked. |
443 AdvanceTimeAndBeginFrameForTest(); | 500 AdvanceTimeAndBeginFrameForTest({sid1}); |
444 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 501 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
445 scheduler_.SurfaceDamaged(sid1); | 502 SurfaceDamaged(sid1); |
446 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 503 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
447 scheduler_.SetRootSurfaceResourcesLocked(true); | 504 scheduler_.SetRootSurfaceResourcesLocked(true); |
448 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 505 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
449 | 506 |
450 // Deadline does not DrawAndSwap while root resources are locked. | 507 // Deadline does not DrawAndSwap while root resources are locked. |
451 EXPECT_EQ(1, client_.draw_and_swap_count()); | 508 EXPECT_EQ(1, client_.draw_and_swap_count()); |
452 scheduler_.SurfaceDamaged(sid1); | 509 SurfaceDamaged(sid1); |
453 scheduler_.BeginFrameDeadlineForTest(); | 510 scheduler_.BeginFrameDeadlineForTest(); |
454 EXPECT_EQ(1, client_.draw_and_swap_count()); | 511 EXPECT_EQ(1, client_.draw_and_swap_count()); |
455 | 512 |
456 // Deadline triggers normally when root resources are unlocked. | 513 // Deadline triggers normally when root resources are unlocked. |
457 AdvanceTimeAndBeginFrameForTest(); | 514 AdvanceTimeAndBeginFrameForTest({sid1, root_surface_id}); |
458 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 515 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
459 scheduler_.SurfaceDamaged(sid1); | 516 SurfaceDamaged(sid1); |
460 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 517 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
461 scheduler_.SetRootSurfaceResourcesLocked(false); | 518 scheduler_.SetRootSurfaceResourcesLocked(false); |
462 scheduler_.SurfaceDamaged(root_surface_id); | 519 SurfaceDamaged(root_surface_id); |
463 EXPECT_EQ(base::TimeTicks(), | 520 EXPECT_EQ(base::TimeTicks(), |
464 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 521 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
465 | 522 |
466 EXPECT_EQ(1, client_.draw_and_swap_count()); | 523 EXPECT_EQ(1, client_.draw_and_swap_count()); |
467 scheduler_.BeginFrameDeadlineForTest(); | 524 scheduler_.BeginFrameDeadlineForTest(); |
468 EXPECT_EQ(2, client_.draw_and_swap_count()); | 525 EXPECT_EQ(2, client_.draw_and_swap_count()); |
469 } | 526 } |
470 | 527 |
471 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 528 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
472 SurfaceId root_surface_id( | 529 SurfaceId root_surface_id( |
473 kArbitraryFrameSinkId, | 530 kArbitraryFrameSinkId, |
474 LocalSurfaceId(0, base::UnguessableToken::Create())); | 531 LocalSurfaceId(1, base::UnguessableToken::Create())); |
475 SurfaceId sid1(kArbitraryFrameSinkId, | 532 SurfaceId sid1(kArbitraryFrameSinkId, |
476 LocalSurfaceId(1, base::UnguessableToken::Create())); | 533 LocalSurfaceId(2, base::UnguessableToken::Create())); |
477 SurfaceId sid2(kArbitraryFrameSinkId, | 534 SurfaceId sid2(kArbitraryFrameSinkId, |
478 LocalSurfaceId(2, base::UnguessableToken::Create())); | 535 LocalSurfaceId(3, base::UnguessableToken::Create())); |
479 | 536 |
480 scheduler_.SetVisible(true); | 537 scheduler_.SetVisible(true); |
481 | 538 |
482 // Set the root surface | 539 // Create surfaces and set the root surface. |
| 540 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 541 scheduler_.SurfaceCreated(SurfaceInfo(sid2, 1.0f, gfx::Size())); |
| 542 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
483 scheduler_.SetNewRootSurface(root_surface_id); | 543 scheduler_.SetNewRootSurface(root_surface_id); |
484 | 544 |
485 // Get scheduler to detect surface 1 and 2 as active. | 545 // Set surface 1 and 2 as active. |
486 AdvanceTimeAndBeginFrameForTest(); | 546 AdvanceTimeAndBeginFrameForTest({sid1, sid2}); |
487 scheduler_.SurfaceDamaged(sid1); | |
488 scheduler_.SurfaceDamaged(sid2); | |
489 scheduler_.BeginFrameDeadlineForTest(); | |
490 AdvanceTimeAndBeginFrameForTest(); | |
491 scheduler_.SurfaceDamaged(sid1); | |
492 scheduler_.SurfaceDamaged(sid2); | |
493 scheduler_.BeginFrameDeadlineForTest(); | |
494 | 547 |
495 // DrawAndSwap normally. | 548 // DrawAndSwap normally. |
496 AdvanceTimeAndBeginFrameForTest(); | |
497 EXPECT_LT(now_src().NowTicks(), | 549 EXPECT_LT(now_src().NowTicks(), |
498 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 550 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
499 EXPECT_EQ(2, client_.draw_and_swap_count()); | 551 EXPECT_EQ(0, client_.draw_and_swap_count()); |
500 scheduler_.SurfaceDamaged(sid1); | 552 SurfaceDamaged(sid1); |
501 scheduler_.SurfaceDamaged(sid2); | 553 SurfaceDamaged(sid2); |
502 scheduler_.BeginFrameDeadlineForTest(); | 554 scheduler_.BeginFrameDeadlineForTest(); |
503 EXPECT_EQ(3, client_.draw_and_swap_count()); | 555 EXPECT_EQ(1, client_.draw_and_swap_count()); |
504 scheduler_.DidSwapBuffers(); | 556 scheduler_.DidSwapBuffers(); |
505 | 557 |
506 // Deadline triggers late when swap throttled. | 558 // Deadline triggers late when swap throttled. |
507 AdvanceTimeAndBeginFrameForTest(); | 559 AdvanceTimeAndBeginFrameForTest({sid1, sid2}); |
508 base::TimeTicks late_deadline = | 560 base::TimeTicks late_deadline = |
509 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 561 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
510 // Damage surface 1, but not surface 2 so we avoid triggering deadline | 562 // Damage surface 1, but not surface 2 so we avoid triggering deadline |
511 // early because all surfaces are ready. | 563 // early because all surfaces are ready. |
512 scheduler_.SurfaceDamaged(sid1); | 564 SurfaceDamaged(sid1); |
513 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 565 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
514 | 566 |
515 // Don't draw and swap in deadline while swap throttled. | 567 // Don't draw and swap in deadline while swap throttled. |
516 EXPECT_EQ(3, client_.draw_and_swap_count()); | 568 EXPECT_EQ(1, client_.draw_and_swap_count()); |
517 scheduler_.BeginFrameDeadlineForTest(); | 569 scheduler_.BeginFrameDeadlineForTest(); |
518 EXPECT_EQ(3, client_.draw_and_swap_count()); | 570 EXPECT_EQ(1, client_.draw_and_swap_count()); |
519 | 571 |
520 // Deadline triggers normally once not swap throttled. | 572 // Deadline triggers normally once not swap throttled. |
521 // Damage from previous BeginFrame should cary over, so don't damage again. | 573 // Damage from previous BeginFrame should cary over, so don't damage again. |
522 scheduler_.DidReceiveSwapBuffersAck(); | 574 scheduler_.DidReceiveSwapBuffersAck(); |
523 AdvanceTimeAndBeginFrameForTest(); | 575 AdvanceTimeAndBeginFrameForTest({sid2}); |
524 base::TimeTicks expected_deadline = | 576 base::TimeTicks expected_deadline = |
525 scheduler_.LastUsedBeginFrameArgs().deadline - | 577 scheduler_.LastUsedBeginFrameArgs().deadline - |
526 BeginFrameArgs::DefaultEstimatedParentDrawTime(); | 578 BeginFrameArgs::DefaultEstimatedParentDrawTime(); |
527 EXPECT_EQ(expected_deadline, | 579 EXPECT_EQ(expected_deadline, |
528 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 580 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
529 // Still waiting for surface 2. Once it updates, deadline should trigger | 581 // Still waiting for surface 2. Once it updates, deadline should trigger |
530 // immediately again. | 582 // immediately again. |
531 scheduler_.SurfaceDamaged(sid2); | 583 SurfaceDamaged(sid2); |
532 EXPECT_EQ(scheduler_.DesiredBeginFrameDeadlineTimeForTest(), | 584 EXPECT_EQ(base::TimeTicks(), |
533 base::TimeTicks()); | 585 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
534 // Draw and swap now that we aren't throttled. | 586 // Draw and swap now that we aren't throttled. |
535 EXPECT_EQ(3, client_.draw_and_swap_count()); | 587 EXPECT_EQ(1, client_.draw_and_swap_count()); |
536 scheduler_.BeginFrameDeadlineForTest(); | 588 scheduler_.BeginFrameDeadlineForTest(); |
537 EXPECT_EQ(4, client_.draw_and_swap_count()); | 589 EXPECT_EQ(2, client_.draw_and_swap_count()); |
538 } | 590 } |
539 | 591 |
540 // This test verfies that we try to reschedule the deadline | 592 // This test verfies that we try to reschedule the deadline |
541 // after any event that may change what deadline we want. | 593 // after any event that may change what deadline we want. |
542 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 594 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
543 SurfaceId root_surface_id( | 595 SurfaceId root_surface_id( |
544 kArbitraryFrameSinkId, | 596 kArbitraryFrameSinkId, |
545 LocalSurfaceId(1, base::UnguessableToken::Create())); | 597 LocalSurfaceId(1, base::UnguessableToken::Create())); |
546 SurfaceId sid1(kArbitraryFrameSinkId, | 598 SurfaceId sid1(kArbitraryFrameSinkId, |
547 LocalSurfaceId(2, base::UnguessableToken::Create())); | 599 LocalSurfaceId(2, base::UnguessableToken::Create())); |
(...skipping 13 matching lines...) Expand all Loading... |
561 scheduler_.SetNewRootSurface(root_surface_id); | 613 scheduler_.SetNewRootSurface(root_surface_id); |
562 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 614 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
563 | 615 |
564 scheduler_.SetVisible(true); | 616 scheduler_.SetVisible(true); |
565 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 617 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
566 | 618 |
567 // Set the root surface while visible. | 619 // Set the root surface while visible. |
568 scheduler_.SetNewRootSurface(root_surface_id); | 620 scheduler_.SetNewRootSurface(root_surface_id); |
569 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 621 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
570 | 622 |
571 AdvanceTimeAndBeginFrameForTest(); | 623 AdvanceTimeAndBeginFrameForTest({}); |
572 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 624 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
573 | 625 |
574 scheduler_.BeginFrameDeadlineForTest(); | 626 scheduler_.BeginFrameDeadlineForTest(); |
575 scheduler_.DidSwapBuffers(); | 627 scheduler_.DidSwapBuffers(); |
576 AdvanceTimeAndBeginFrameForTest(); | 628 AdvanceTimeAndBeginFrameForTest({}); |
577 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 629 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
578 | 630 |
579 scheduler_.DidReceiveSwapBuffersAck(); | 631 scheduler_.DidReceiveSwapBuffersAck(); |
580 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 632 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
581 | 633 |
582 scheduler_.DisplayResized(); | 634 scheduler_.DisplayResized(); |
583 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 635 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
584 | 636 |
585 scheduler_.SetNewRootSurface(root_surface_id); | 637 scheduler_.SetNewRootSurface(root_surface_id); |
586 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 638 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
587 | 639 |
588 scheduler_.SurfaceDamaged(sid1); | 640 SurfaceDamaged(sid1); |
589 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 641 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
590 | 642 |
591 scheduler_.SetRootSurfaceResourcesLocked(true); | 643 scheduler_.SetRootSurfaceResourcesLocked(true); |
592 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 644 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
593 | 645 |
594 scheduler_.OutputSurfaceLost(); | 646 scheduler_.OutputSurfaceLost(); |
595 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 647 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
596 } | 648 } |
597 | 649 |
598 } // namespace | 650 } // namespace |
599 } // namespace cc | 651 } // namespace cc |
OLD | NEW |