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/test/null_task_runner.h" | 8 #include "base/test/null_task_runner.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 97 |
98 FakeExternalBeginFrameSource fake_begin_frame_source_; | 98 FakeExternalBeginFrameSource fake_begin_frame_source_; |
99 | 99 |
100 base::SimpleTestTickClock now_src_; | 100 base::SimpleTestTickClock now_src_; |
101 scoped_refptr<base::NullTaskRunner> task_runner_; | 101 scoped_refptr<base::NullTaskRunner> task_runner_; |
102 FakeDisplaySchedulerClient client_; | 102 FakeDisplaySchedulerClient client_; |
103 TestDisplayScheduler scheduler_; | 103 TestDisplayScheduler scheduler_; |
104 }; | 104 }; |
105 | 105 |
106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { | 106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { |
107 SurfaceId root_surface_id1(0, 1, 0); | 107 SurfaceId root_surface_id1(0, 0, 1, 0); |
108 SurfaceId root_surface_id2(0, 2, 0); | 108 SurfaceId root_surface_id2(0, 0, 2, 0); |
109 SurfaceId sid1(0, 3, 0); | 109 SurfaceId sid1(0, 0, 3, 0); |
110 base::TimeTicks late_deadline; | 110 base::TimeTicks late_deadline; |
111 | 111 |
112 // Go trough an initial BeginFrame cycle with the root surface. | 112 // Go trough an initial BeginFrame cycle with the root surface. |
113 BeginFrameForTest(); | 113 BeginFrameForTest(); |
114 scheduler_.SetNewRootSurface(root_surface_id1); | 114 scheduler_.SetNewRootSurface(root_surface_id1); |
115 scheduler_.BeginFrameDeadlineForTest(); | 115 scheduler_.BeginFrameDeadlineForTest(); |
116 | 116 |
117 // Resize on the next begin frame cycle should cause the deadline to wait | 117 // Resize on the next begin frame cycle should cause the deadline to wait |
118 // for a new root surface. | 118 // for a new root surface. |
119 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 119 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
(...skipping 12 matching lines...) Expand all Loading... |
132 BeginFrameForTest(); | 132 BeginFrameForTest(); |
133 scheduler_.SurfaceDamaged(sid1); | 133 scheduler_.SurfaceDamaged(sid1); |
134 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 134 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
135 scheduler_.SurfaceDamaged(root_surface_id2); | 135 scheduler_.SurfaceDamaged(root_surface_id2); |
136 EXPECT_GE(now_src().NowTicks(), | 136 EXPECT_GE(now_src().NowTicks(), |
137 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 137 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
138 scheduler_.BeginFrameDeadlineForTest(); | 138 scheduler_.BeginFrameDeadlineForTest(); |
139 } | 139 } |
140 | 140 |
141 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { | 141 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { |
142 SurfaceId root_surface_id(0, 1, 0); | 142 SurfaceId root_surface_id(0, 0, 1, 0); |
143 SurfaceId sid1(0, 2, 0); | 143 SurfaceId sid1(0, 0, 2, 0); |
144 base::TimeTicks late_deadline; | 144 base::TimeTicks late_deadline; |
145 | 145 |
146 // Go trough an initial BeginFrame cycle with the root surface. | 146 // Go trough an initial BeginFrame cycle with the root surface. |
147 BeginFrameForTest(); | 147 BeginFrameForTest(); |
148 scheduler_.SetNewRootSurface(root_surface_id); | 148 scheduler_.SetNewRootSurface(root_surface_id); |
149 scheduler_.BeginFrameDeadlineForTest(); | 149 scheduler_.BeginFrameDeadlineForTest(); |
150 | 150 |
151 // Resize on the next begin frame cycle should cause the deadline to wait | 151 // Resize on the next begin frame cycle should cause the deadline to wait |
152 // for a new root surface. | 152 // for a new root surface. |
153 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 153 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
(...skipping 12 matching lines...) Expand all Loading... |
166 BeginFrameForTest(); | 166 BeginFrameForTest(); |
167 scheduler_.SurfaceDamaged(sid1); | 167 scheduler_.SurfaceDamaged(sid1); |
168 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 168 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
169 scheduler_.SurfaceDamaged(root_surface_id); | 169 scheduler_.SurfaceDamaged(root_surface_id); |
170 EXPECT_GE(now_src().NowTicks(), | 170 EXPECT_GE(now_src().NowTicks(), |
171 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 171 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
172 scheduler_.BeginFrameDeadlineForTest(); | 172 scheduler_.BeginFrameDeadlineForTest(); |
173 } | 173 } |
174 | 174 |
175 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 175 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
176 SurfaceId root_surface_id(0, 0, 0); | 176 SurfaceId root_surface_id(0, 0, 0, 0); |
177 SurfaceId sid1(0, 1, 0); | 177 SurfaceId sid1(0, 0, 1, 0); |
178 SurfaceId sid2(0, 2, 0); | 178 SurfaceId sid2(0, 0, 2, 0); |
179 | 179 |
180 // Set the root surface | 180 // Set the root surface |
181 scheduler_.SetNewRootSurface(root_surface_id); | 181 scheduler_.SetNewRootSurface(root_surface_id); |
182 | 182 |
183 // Get scheduler to detect surface 1 as active by drawing | 183 // Get scheduler to detect surface 1 as active by drawing |
184 // two frames in a row with damage from surface 1. | 184 // two frames in a row with damage from surface 1. |
185 BeginFrameForTest(); | 185 BeginFrameForTest(); |
186 scheduler_.SurfaceDamaged(sid1); | 186 scheduler_.SurfaceDamaged(sid1); |
187 scheduler_.BeginFrameDeadlineForTest(); | 187 scheduler_.BeginFrameDeadlineForTest(); |
188 BeginFrameForTest(); | 188 BeginFrameForTest(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 BeginFrameForTest(); | 230 BeginFrameForTest(); |
231 EXPECT_LT(now_src().NowTicks(), | 231 EXPECT_LT(now_src().NowTicks(), |
232 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 232 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
233 scheduler_.SurfaceDamaged(root_surface_id); | 233 scheduler_.SurfaceDamaged(root_surface_id); |
234 EXPECT_GE(now_src().NowTicks(), | 234 EXPECT_GE(now_src().NowTicks(), |
235 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 235 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
236 scheduler_.BeginFrameDeadlineForTest(); | 236 scheduler_.BeginFrameDeadlineForTest(); |
237 } | 237 } |
238 | 238 |
239 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 239 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
240 SurfaceId root_surface_id(0, 0, 0); | 240 SurfaceId root_surface_id(0, 0, 0, 0); |
241 SurfaceId sid1(0, 1, 0); | 241 SurfaceId sid1(0, 0, 1, 0); |
242 | 242 |
243 // Set the root surface | 243 // Set the root surface |
244 scheduler_.SetNewRootSurface(root_surface_id); | 244 scheduler_.SetNewRootSurface(root_surface_id); |
245 | 245 |
246 // DrawAndSwap normally. | 246 // DrawAndSwap normally. |
247 BeginFrameForTest(); | 247 BeginFrameForTest(); |
248 EXPECT_LT(now_src().NowTicks(), | 248 EXPECT_LT(now_src().NowTicks(), |
249 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 249 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
250 EXPECT_EQ(0, client_.draw_and_swap_count()); | 250 EXPECT_EQ(0, client_.draw_and_swap_count()); |
251 scheduler_.SurfaceDamaged(sid1); | 251 scheduler_.SurfaceDamaged(sid1); |
252 scheduler_.BeginFrameDeadlineForTest(); | 252 scheduler_.BeginFrameDeadlineForTest(); |
253 EXPECT_EQ(1, client_.draw_and_swap_count()); | 253 EXPECT_EQ(1, client_.draw_and_swap_count()); |
254 | 254 |
255 // Deadline triggers immediately on OutputSurfaceLost. | 255 // Deadline triggers immediately on OutputSurfaceLost. |
256 BeginFrameForTest(); | 256 BeginFrameForTest(); |
257 EXPECT_LT(now_src().NowTicks(), | 257 EXPECT_LT(now_src().NowTicks(), |
258 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 258 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
259 scheduler_.OutputSurfaceLost(); | 259 scheduler_.OutputSurfaceLost(); |
260 EXPECT_GE(now_src().NowTicks(), | 260 EXPECT_GE(now_src().NowTicks(), |
261 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 261 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
262 | 262 |
263 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 263 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
264 EXPECT_EQ(1, client_.draw_and_swap_count()); | 264 EXPECT_EQ(1, client_.draw_and_swap_count()); |
265 scheduler_.SurfaceDamaged(sid1); | 265 scheduler_.SurfaceDamaged(sid1); |
266 scheduler_.BeginFrameDeadlineForTest(); | 266 scheduler_.BeginFrameDeadlineForTest(); |
267 EXPECT_EQ(1, client_.draw_and_swap_count()); | 267 EXPECT_EQ(1, client_.draw_and_swap_count()); |
268 } | 268 } |
269 | 269 |
270 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { | 270 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { |
271 SurfaceId root_surface_id(0, 0, 0); | 271 SurfaceId root_surface_id(0, 0, 0, 0); |
272 SurfaceId sid1(0, 1, 0); | 272 SurfaceId sid1(0, 0, 1, 0); |
273 | 273 |
274 // Set the root surface | 274 // Set the root surface |
275 scheduler_.SetNewRootSurface(root_surface_id); | 275 scheduler_.SetNewRootSurface(root_surface_id); |
276 | 276 |
277 // DrawAndSwap normally. | 277 // DrawAndSwap normally. |
278 BeginFrameForTest(); | 278 BeginFrameForTest(); |
279 EXPECT_LT(now_src().NowTicks(), | 279 EXPECT_LT(now_src().NowTicks(), |
280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
281 EXPECT_EQ(0, client_.draw_and_swap_count()); | 281 EXPECT_EQ(0, client_.draw_and_swap_count()); |
282 scheduler_.SurfaceDamaged(sid1); | 282 scheduler_.SurfaceDamaged(sid1); |
283 scheduler_.BeginFrameDeadlineForTest(); | 283 scheduler_.BeginFrameDeadlineForTest(); |
284 EXPECT_EQ(1, client_.draw_and_swap_count()); | 284 EXPECT_EQ(1, client_.draw_and_swap_count()); |
285 | 285 |
286 scheduler_.DisplayResized(); | 286 scheduler_.DisplayResized(); |
287 BeginFrameForTest(); | 287 BeginFrameForTest(); |
288 // DisplayResized should trigger a swap to happen. | 288 // DisplayResized should trigger a swap to happen. |
289 scheduler_.BeginFrameDeadlineForTest(); | 289 scheduler_.BeginFrameDeadlineForTest(); |
290 EXPECT_EQ(2, client_.draw_and_swap_count()); | 290 EXPECT_EQ(2, client_.draw_and_swap_count()); |
291 } | 291 } |
292 | 292 |
293 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 293 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
294 SurfaceId root_surface_id(0, 0, 0); | 294 SurfaceId root_surface_id(0, 0, 0, 0); |
295 SurfaceId sid1(0, 1, 0); | 295 SurfaceId sid1(0, 0, 1, 0); |
296 base::TimeTicks late_deadline; | 296 base::TimeTicks late_deadline; |
297 | 297 |
298 // Set the root surface | 298 // Set the root surface |
299 scheduler_.SetNewRootSurface(root_surface_id); | 299 scheduler_.SetNewRootSurface(root_surface_id); |
300 | 300 |
301 // DrawAndSwap normally. | 301 // DrawAndSwap normally. |
302 BeginFrameForTest(); | 302 BeginFrameForTest(); |
303 EXPECT_LT(now_src().NowTicks(), | 303 EXPECT_LT(now_src().NowTicks(), |
304 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 304 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
305 EXPECT_EQ(0, client_.draw_and_swap_count()); | 305 EXPECT_EQ(0, client_.draw_and_swap_count()); |
(...skipping 24 matching lines...) Expand all Loading... |
330 scheduler_.SurfaceDamaged(root_surface_id); | 330 scheduler_.SurfaceDamaged(root_surface_id); |
331 EXPECT_EQ(base::TimeTicks(), | 331 EXPECT_EQ(base::TimeTicks(), |
332 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 332 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
333 | 333 |
334 EXPECT_EQ(1, client_.draw_and_swap_count()); | 334 EXPECT_EQ(1, client_.draw_and_swap_count()); |
335 scheduler_.BeginFrameDeadlineForTest(); | 335 scheduler_.BeginFrameDeadlineForTest(); |
336 EXPECT_EQ(2, client_.draw_and_swap_count()); | 336 EXPECT_EQ(2, client_.draw_and_swap_count()); |
337 } | 337 } |
338 | 338 |
339 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 339 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
340 SurfaceId root_surface_id(0, 0, 0); | 340 SurfaceId root_surface_id(0, 0, 0, 0); |
341 SurfaceId sid1(0, 1, 0); | 341 SurfaceId sid1(0, 0, 1, 0); |
342 SurfaceId sid2(0, 2, 0); | 342 SurfaceId sid2(0, 0, 2, 0); |
343 | 343 |
344 // Set the root surface | 344 // Set the root surface |
345 scheduler_.SetNewRootSurface(root_surface_id); | 345 scheduler_.SetNewRootSurface(root_surface_id); |
346 | 346 |
347 // Get scheduler to detect surface 1 and 2 as active. | 347 // Get scheduler to detect surface 1 and 2 as active. |
348 BeginFrameForTest(); | 348 BeginFrameForTest(); |
349 scheduler_.SurfaceDamaged(sid1); | 349 scheduler_.SurfaceDamaged(sid1); |
350 scheduler_.SurfaceDamaged(sid2); | 350 scheduler_.SurfaceDamaged(sid2); |
351 scheduler_.BeginFrameDeadlineForTest(); | 351 scheduler_.BeginFrameDeadlineForTest(); |
352 BeginFrameForTest(); | 352 BeginFrameForTest(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 base::TimeTicks()); | 395 base::TimeTicks()); |
396 // Draw and swap now that we aren't throttled. | 396 // Draw and swap now that we aren't throttled. |
397 EXPECT_EQ(3, client_.draw_and_swap_count()); | 397 EXPECT_EQ(3, client_.draw_and_swap_count()); |
398 scheduler_.BeginFrameDeadlineForTest(); | 398 scheduler_.BeginFrameDeadlineForTest(); |
399 EXPECT_EQ(4, client_.draw_and_swap_count()); | 399 EXPECT_EQ(4, client_.draw_and_swap_count()); |
400 } | 400 } |
401 | 401 |
402 // This test verfies that we try to reschedule the deadline | 402 // This test verfies that we try to reschedule the deadline |
403 // after any event that may change what deadline we want. | 403 // after any event that may change what deadline we want. |
404 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 404 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
405 SurfaceId root_surface_id(0, 1, 0); | 405 SurfaceId root_surface_id(0, 0, 1, 0); |
406 SurfaceId sid1(0, 2, 0); | 406 SurfaceId sid1(0, 0, 2, 0); |
407 int count = 1; | 407 int count = 1; |
408 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 408 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
409 | 409 |
410 // Set the root surface | 410 // Set the root surface |
411 scheduler_.SetNewRootSurface(root_surface_id); | 411 scheduler_.SetNewRootSurface(root_surface_id); |
412 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 412 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
413 | 413 |
414 BeginFrameForTest(); | 414 BeginFrameForTest(); |
415 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 415 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
416 | 416 |
(...skipping 16 matching lines...) Expand all Loading... |
433 | 433 |
434 scheduler_.SetRootSurfaceResourcesLocked(true); | 434 scheduler_.SetRootSurfaceResourcesLocked(true); |
435 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 435 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
436 | 436 |
437 scheduler_.OutputSurfaceLost(); | 437 scheduler_.OutputSurfaceLost(); |
438 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 438 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
439 } | 439 } |
440 | 440 |
441 } // namespace | 441 } // namespace |
442 } // namespace cc | 442 } // namespace cc |
OLD | NEW |