| 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 scheduler_->SurfaceDamaged(sid2); | 162 scheduler_->SurfaceDamaged(sid2); |
| 163 EXPECT_GE(now_src().NowTicks(), | 163 EXPECT_GE(now_src().NowTicks(), |
| 164 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 164 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 165 scheduler_->BeginFrameDeadlineForTest(); | 165 scheduler_->BeginFrameDeadlineForTest(); |
| 166 | 166 |
| 167 // Make the system idle | 167 // Make the system idle |
| 168 BeginFrameForTest(); | 168 BeginFrameForTest(); |
| 169 scheduler_->BeginFrameDeadlineForTest(); | 169 scheduler_->BeginFrameDeadlineForTest(); |
| 170 BeginFrameForTest(); | 170 BeginFrameForTest(); |
| 171 scheduler_->BeginFrameDeadlineForTest(); | 171 scheduler_->BeginFrameDeadlineForTest(); |
| 172 BeginFrameForTest(); |
| 173 scheduler_->BeginFrameDeadlineForTest(); |
| 172 | 174 |
| 173 // Deadline should trigger early if child surfaces are idle and | 175 // Deadline should trigger early if child surfaces are idle and |
| 174 // we get damage on the root surface. | 176 // we get damage on the root surface. |
| 177 BeginFrameForTest(); |
| 178 EXPECT_LT(now_src().NowTicks(), |
| 179 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 180 scheduler_->SurfaceDamaged(root_surface_id); |
| 181 EXPECT_GE(now_src().NowTicks(), |
| 182 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 183 scheduler_->BeginFrameDeadlineForTest(); |
| 184 } |
| 185 |
| 186 TEST_F(DisplaySchedulerTest, SurfaceActiveAt30fps) { |
| 187 SurfaceId root_surface_id(0); |
| 188 SurfaceId sid1(1); |
| 189 SurfaceId sid2(2); |
| 190 |
| 191 // Set the root surface |
| 192 scheduler_->EntireDisplayDamaged(root_surface_id); |
| 193 |
| 194 // Get scheduler to detect surface 1 and 2 as active by drawing |
| 195 // two frames in a row. First frame with damage only from surface 1 |
| 196 // and the second frame only with damage from surface 2. |
| 197 BeginFrameForTest(); |
| 198 scheduler_->SurfaceDamaged(sid1); |
| 199 scheduler_->BeginFrameDeadlineForTest(); |
| 200 BeginFrameForTest(); |
| 201 scheduler_->SurfaceDamaged(sid2); |
| 202 scheduler_->BeginFrameDeadlineForTest(); |
| 203 |
| 204 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. |
| 205 BeginFrameForTest(); |
| 206 EXPECT_LT(now_src().NowTicks(), |
| 207 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 208 scheduler_->SurfaceDamaged(sid1); |
| 209 EXPECT_LT(now_src().NowTicks(), |
| 210 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 211 scheduler_->SurfaceDamaged(sid2); |
| 212 EXPECT_GE(now_src().NowTicks(), |
| 213 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 214 scheduler_->BeginFrameDeadlineForTest(); |
| 215 |
| 216 // Make the system idle |
| 217 BeginFrameForTest(); |
| 218 scheduler_->BeginFrameDeadlineForTest(); |
| 219 BeginFrameForTest(); |
| 220 scheduler_->BeginFrameDeadlineForTest(); |
| 221 BeginFrameForTest(); |
| 222 scheduler_->BeginFrameDeadlineForTest(); |
| 223 |
| 224 // Deadline should trigger early if child surfaces are idle and |
| 225 // we get damage on the root surface. |
| 226 BeginFrameForTest(); |
| 227 EXPECT_LT(now_src().NowTicks(), |
| 228 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 229 scheduler_->SurfaceDamaged(root_surface_id); |
| 230 EXPECT_GE(now_src().NowTicks(), |
| 231 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 232 scheduler_->BeginFrameDeadlineForTest(); |
| 233 } |
| 234 |
| 235 TEST_F(DisplaySchedulerTest, SurfaceActiveAt20fps) { |
| 236 SurfaceId root_surface_id(0); |
| 237 SurfaceId sid1(1); |
| 238 SurfaceId sid2(2); |
| 239 SurfaceId sid3(3); |
| 240 |
| 241 // Set the root surface |
| 242 scheduler_->EntireDisplayDamaged(root_surface_id); |
| 243 |
| 244 // Get scheduler to detect surface 1, 2, and 3 as active by drawing |
| 245 // 3 frames in a row. With damage from each surface in succession. |
| 246 BeginFrameForTest(); |
| 247 scheduler_->SurfaceDamaged(sid1); |
| 248 scheduler_->BeginFrameDeadlineForTest(); |
| 249 BeginFrameForTest(); |
| 250 scheduler_->SurfaceDamaged(sid2); |
| 251 scheduler_->BeginFrameDeadlineForTest(); |
| 252 BeginFrameForTest(); |
| 253 scheduler_->SurfaceDamaged(sid3); |
| 254 scheduler_->BeginFrameDeadlineForTest(); |
| 255 |
| 256 // Deadline doesn't trigger early until surface 1, 2, and 3 are all damaged. |
| 257 BeginFrameForTest(); |
| 258 EXPECT_LT(now_src().NowTicks(), |
| 259 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 260 scheduler_->SurfaceDamaged(sid1); |
| 261 EXPECT_LT(now_src().NowTicks(), |
| 262 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 263 scheduler_->SurfaceDamaged(sid2); |
| 264 EXPECT_LT(now_src().NowTicks(), |
| 265 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 266 scheduler_->SurfaceDamaged(sid3); |
| 267 EXPECT_GE(now_src().NowTicks(), |
| 268 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 269 scheduler_->BeginFrameDeadlineForTest(); |
| 270 |
| 271 // Make the system idle |
| 272 BeginFrameForTest(); |
| 273 scheduler_->BeginFrameDeadlineForTest(); |
| 274 BeginFrameForTest(); |
| 275 scheduler_->BeginFrameDeadlineForTest(); |
| 276 BeginFrameForTest(); |
| 277 scheduler_->BeginFrameDeadlineForTest(); |
| 278 |
| 279 // Deadline should trigger early if child surfaces are idle and |
| 280 // we get damage on the root surface. |
| 281 BeginFrameForTest(); |
| 282 EXPECT_LT(now_src().NowTicks(), |
| 283 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 284 scheduler_->SurfaceDamaged(root_surface_id); |
| 285 EXPECT_GE(now_src().NowTicks(), |
| 286 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 287 scheduler_->BeginFrameDeadlineForTest(); |
| 288 } |
| 289 |
| 290 TEST_F(DisplaySchedulerTest, SurfaceActiveAt20fps_SingleSurface) { |
| 291 SurfaceId root_surface_id(0); |
| 292 SurfaceId sid1(1); |
| 293 SurfaceId sid2(2); |
| 294 SurfaceId sid3(3); |
| 295 |
| 296 // Set the root surface |
| 297 scheduler_->EntireDisplayDamaged(root_surface_id); |
| 298 |
| 299 // Get scheduler to detect surface 1 as active even though |
| 300 // it only swaps at 20fps. |
| 301 BeginFrameForTest(); |
| 302 scheduler_->SurfaceDamaged(sid1); |
| 303 scheduler_->BeginFrameDeadlineForTest(); |
| 304 BeginFrameForTest(); |
| 305 scheduler_->BeginFrameDeadlineForTest(); |
| 306 BeginFrameForTest(); |
| 307 scheduler_->BeginFrameDeadlineForTest(); |
| 308 |
| 309 // Deadline doesn't trigger early until surface 1 is damaged. |
| 310 BeginFrameForTest(); |
| 311 EXPECT_LT(now_src().NowTicks(), |
| 312 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 313 scheduler_->SurfaceDamaged(sid1); |
| 314 EXPECT_GE(now_src().NowTicks(), |
| 315 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 316 scheduler_->BeginFrameDeadlineForTest(); |
| 317 |
| 318 // Make the system idle |
| 319 BeginFrameForTest(); |
| 320 scheduler_->BeginFrameDeadlineForTest(); |
| 321 BeginFrameForTest(); |
| 322 scheduler_->BeginFrameDeadlineForTest(); |
| 323 BeginFrameForTest(); |
| 324 scheduler_->BeginFrameDeadlineForTest(); |
| 325 |
| 326 // Deadline should trigger early if child surfaces are idle and |
| 327 // we get damage on the root surface. |
| 175 BeginFrameForTest(); | 328 BeginFrameForTest(); |
| 176 EXPECT_LT(now_src().NowTicks(), | 329 EXPECT_LT(now_src().NowTicks(), |
| 177 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 330 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 178 scheduler_->SurfaceDamaged(root_surface_id); | 331 scheduler_->SurfaceDamaged(root_surface_id); |
| 179 EXPECT_GE(now_src().NowTicks(), | 332 EXPECT_GE(now_src().NowTicks(), |
| 180 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 333 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 181 scheduler_->BeginFrameDeadlineForTest(); | 334 scheduler_->BeginFrameDeadlineForTest(); |
| 182 } | 335 } |
| 183 | 336 |
| 184 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 337 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 488 |
| 336 scheduler_->SetRootSurfaceResourcesLocked(true); | 489 scheduler_->SetRootSurfaceResourcesLocked(true); |
| 337 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 490 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 338 | 491 |
| 339 scheduler_->OutputSurfaceLost(); | 492 scheduler_->OutputSurfaceLost(); |
| 340 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 493 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 341 } | 494 } |
| 342 | 495 |
| 343 } // namespace | 496 } // namespace |
| 344 } // namespace cc | 497 } // namespace cc |
| OLD | NEW |