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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 scheduler_->SurfaceDamaged(sid2); | 221 scheduler_->SurfaceDamaged(sid2); |
222 EXPECT_GE(now_src().NowTicks(), | 222 EXPECT_GE(now_src().NowTicks(), |
223 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 223 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
224 scheduler_->BeginFrameDeadlineForTest(); | 224 scheduler_->BeginFrameDeadlineForTest(); |
225 | 225 |
226 // Make the system idle | 226 // Make the system idle |
227 BeginFrameForTest(); | 227 BeginFrameForTest(); |
228 scheduler_->BeginFrameDeadlineForTest(); | 228 scheduler_->BeginFrameDeadlineForTest(); |
229 BeginFrameForTest(); | 229 BeginFrameForTest(); |
230 scheduler_->BeginFrameDeadlineForTest(); | 230 scheduler_->BeginFrameDeadlineForTest(); |
| 231 BeginFrameForTest(); |
| 232 scheduler_->BeginFrameDeadlineForTest(); |
231 | 233 |
232 // Deadline should trigger early if child surfaces are idle and | 234 // Deadline should trigger early if child surfaces are idle and |
233 // we get damage on the root surface. | 235 // we get damage on the root surface. |
| 236 BeginFrameForTest(); |
| 237 EXPECT_LT(now_src().NowTicks(), |
| 238 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 239 scheduler_->SurfaceDamaged(root_surface_id); |
| 240 EXPECT_GE(now_src().NowTicks(), |
| 241 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 242 scheduler_->BeginFrameDeadlineForTest(); |
| 243 } |
| 244 |
| 245 TEST_F(DisplaySchedulerTest, SurfaceActiveAt30fps) { |
| 246 SurfaceId root_surface_id(0); |
| 247 SurfaceId sid1(1); |
| 248 SurfaceId sid2(2); |
| 249 |
| 250 // Set the root surface |
| 251 scheduler_->SetNewRootSurface(root_surface_id); |
| 252 |
| 253 // Get scheduler to detect surface 1 and 2 as active by drawing |
| 254 // two frames in a row. First frame with damage only from surface 1 |
| 255 // and the second frame only with damage from surface 2. |
| 256 BeginFrameForTest(); |
| 257 scheduler_->SurfaceDamaged(sid1); |
| 258 scheduler_->BeginFrameDeadlineForTest(); |
| 259 BeginFrameForTest(); |
| 260 scheduler_->SurfaceDamaged(sid2); |
| 261 scheduler_->BeginFrameDeadlineForTest(); |
| 262 |
| 263 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. |
| 264 BeginFrameForTest(); |
| 265 EXPECT_LT(now_src().NowTicks(), |
| 266 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 267 scheduler_->SurfaceDamaged(sid1); |
| 268 EXPECT_LT(now_src().NowTicks(), |
| 269 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 270 scheduler_->SurfaceDamaged(sid2); |
| 271 EXPECT_GE(now_src().NowTicks(), |
| 272 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 273 scheduler_->BeginFrameDeadlineForTest(); |
| 274 |
| 275 // Make the system idle |
| 276 BeginFrameForTest(); |
| 277 scheduler_->BeginFrameDeadlineForTest(); |
| 278 BeginFrameForTest(); |
| 279 scheduler_->BeginFrameDeadlineForTest(); |
| 280 BeginFrameForTest(); |
| 281 scheduler_->BeginFrameDeadlineForTest(); |
| 282 |
| 283 // Deadline should trigger early if child surfaces are idle and |
| 284 // we get damage on the root surface. |
| 285 BeginFrameForTest(); |
| 286 EXPECT_LT(now_src().NowTicks(), |
| 287 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 288 scheduler_->SurfaceDamaged(root_surface_id); |
| 289 EXPECT_GE(now_src().NowTicks(), |
| 290 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 291 scheduler_->BeginFrameDeadlineForTest(); |
| 292 } |
| 293 |
| 294 TEST_F(DisplaySchedulerTest, SurfaceActiveAt20fps) { |
| 295 SurfaceId root_surface_id(0); |
| 296 SurfaceId sid1(1); |
| 297 SurfaceId sid2(2); |
| 298 SurfaceId sid3(3); |
| 299 |
| 300 // Set the root surface |
| 301 scheduler_->SetNewRootSurface(root_surface_id); |
| 302 |
| 303 // Get scheduler to detect surface 1, 2, and 3 as active by drawing |
| 304 // 3 frames in a row. With damage from each surface in succession. |
| 305 BeginFrameForTest(); |
| 306 scheduler_->SurfaceDamaged(sid1); |
| 307 scheduler_->BeginFrameDeadlineForTest(); |
| 308 BeginFrameForTest(); |
| 309 scheduler_->SurfaceDamaged(sid2); |
| 310 scheduler_->BeginFrameDeadlineForTest(); |
| 311 BeginFrameForTest(); |
| 312 scheduler_->SurfaceDamaged(sid3); |
| 313 scheduler_->BeginFrameDeadlineForTest(); |
| 314 |
| 315 // Deadline doesn't trigger early until surface 1, 2, and 3 are all damaged. |
| 316 BeginFrameForTest(); |
| 317 EXPECT_LT(now_src().NowTicks(), |
| 318 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 319 scheduler_->SurfaceDamaged(sid1); |
| 320 EXPECT_LT(now_src().NowTicks(), |
| 321 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 322 scheduler_->SurfaceDamaged(sid2); |
| 323 EXPECT_LT(now_src().NowTicks(), |
| 324 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 325 scheduler_->SurfaceDamaged(sid3); |
| 326 EXPECT_GE(now_src().NowTicks(), |
| 327 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 328 scheduler_->BeginFrameDeadlineForTest(); |
| 329 |
| 330 // Make the system idle |
| 331 BeginFrameForTest(); |
| 332 scheduler_->BeginFrameDeadlineForTest(); |
| 333 BeginFrameForTest(); |
| 334 scheduler_->BeginFrameDeadlineForTest(); |
| 335 BeginFrameForTest(); |
| 336 scheduler_->BeginFrameDeadlineForTest(); |
| 337 |
| 338 // Deadline should trigger early if child surfaces are idle and |
| 339 // we get damage on the root surface. |
| 340 BeginFrameForTest(); |
| 341 EXPECT_LT(now_src().NowTicks(), |
| 342 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 343 scheduler_->SurfaceDamaged(root_surface_id); |
| 344 EXPECT_GE(now_src().NowTicks(), |
| 345 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 346 scheduler_->BeginFrameDeadlineForTest(); |
| 347 } |
| 348 |
| 349 TEST_F(DisplaySchedulerTest, SurfaceActiveAt20fps_SingleSurface) { |
| 350 SurfaceId root_surface_id(0); |
| 351 SurfaceId sid1(1); |
| 352 SurfaceId sid2(2); |
| 353 SurfaceId sid3(3); |
| 354 |
| 355 // Set the root surface |
| 356 scheduler_->SetNewRootSurface(root_surface_id); |
| 357 |
| 358 // Get scheduler to detect surface 1 as active even though |
| 359 // it only swaps at 20fps. |
| 360 BeginFrameForTest(); |
| 361 scheduler_->SurfaceDamaged(sid1); |
| 362 scheduler_->BeginFrameDeadlineForTest(); |
| 363 BeginFrameForTest(); |
| 364 scheduler_->BeginFrameDeadlineForTest(); |
| 365 BeginFrameForTest(); |
| 366 scheduler_->BeginFrameDeadlineForTest(); |
| 367 |
| 368 // Deadline doesn't trigger early until surface 1 is damaged. |
| 369 BeginFrameForTest(); |
| 370 EXPECT_LT(now_src().NowTicks(), |
| 371 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 372 scheduler_->SurfaceDamaged(sid1); |
| 373 EXPECT_GE(now_src().NowTicks(), |
| 374 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 375 scheduler_->BeginFrameDeadlineForTest(); |
| 376 |
| 377 // Make the system idle |
| 378 BeginFrameForTest(); |
| 379 scheduler_->BeginFrameDeadlineForTest(); |
| 380 BeginFrameForTest(); |
| 381 scheduler_->BeginFrameDeadlineForTest(); |
| 382 BeginFrameForTest(); |
| 383 scheduler_->BeginFrameDeadlineForTest(); |
| 384 |
| 385 // Deadline should trigger early if child surfaces are idle and |
| 386 // we get damage on the root surface. |
234 BeginFrameForTest(); | 387 BeginFrameForTest(); |
235 EXPECT_LT(now_src().NowTicks(), | 388 EXPECT_LT(now_src().NowTicks(), |
236 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 389 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
237 scheduler_->SurfaceDamaged(root_surface_id); | 390 scheduler_->SurfaceDamaged(root_surface_id); |
238 EXPECT_GE(now_src().NowTicks(), | 391 EXPECT_GE(now_src().NowTicks(), |
239 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 392 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
240 scheduler_->BeginFrameDeadlineForTest(); | 393 scheduler_->BeginFrameDeadlineForTest(); |
241 } | 394 } |
242 | 395 |
243 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 396 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 | 550 |
398 scheduler_->SetRootSurfaceResourcesLocked(true); | 551 scheduler_->SetRootSurfaceResourcesLocked(true); |
399 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 552 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
400 | 553 |
401 scheduler_->OutputSurfaceLost(); | 554 scheduler_->OutputSurfaceLost(); |
402 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 555 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
403 } | 556 } |
404 | 557 |
405 } // namespace | 558 } // namespace |
406 } // namespace cc | 559 } // namespace cc |
OLD | NEW |