| 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(); | |
| 233 | 231 |
| 234 // Deadline should trigger early if child surfaces are idle and | 232 // Deadline should trigger early if child surfaces are idle and |
| 235 // we get damage on the root surface. | 233 // 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. | |
| 387 BeginFrameForTest(); | 234 BeginFrameForTest(); |
| 388 EXPECT_LT(now_src().NowTicks(), | 235 EXPECT_LT(now_src().NowTicks(), |
| 389 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 236 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 390 scheduler_->SurfaceDamaged(root_surface_id); | 237 scheduler_->SurfaceDamaged(root_surface_id); |
| 391 EXPECT_GE(now_src().NowTicks(), | 238 EXPECT_GE(now_src().NowTicks(), |
| 392 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 239 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 393 scheduler_->BeginFrameDeadlineForTest(); | 240 scheduler_->BeginFrameDeadlineForTest(); |
| 394 } | 241 } |
| 395 | 242 |
| 396 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 243 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 | 397 |
| 551 scheduler_->SetRootSurfaceResourcesLocked(true); | 398 scheduler_->SetRootSurfaceResourcesLocked(true); |
| 552 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 399 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 553 | 400 |
| 554 scheduler_->OutputSurfaceLost(); | 401 scheduler_->OutputSurfaceLost(); |
| 555 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 402 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 556 } | 403 } |
| 557 | 404 |
| 558 } // namespace | 405 } // namespace |
| 559 } // namespace cc | 406 } // namespace cc |
| OLD | NEW |