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 |