| 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/stl_util.h" |
| 8 #include "base/test/null_task_runner.h" | 9 #include "base/test/null_task_runner.h" |
| 9 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
| 10 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
| 11 #include "cc/output/begin_frame_args.h" | 12 #include "cc/output/begin_frame_args.h" |
| 12 #include "cc/surfaces/display.h" | 13 #include "cc/surfaces/display.h" |
| 14 #include "cc/surfaces/surface_info.h" |
| 13 #include "cc/test/fake_external_begin_frame_source.h" | 15 #include "cc/test/fake_external_begin_frame_source.h" |
| 14 #include "cc/test/scheduler_test_common.h" | 16 #include "cc/test/scheduler_test_common.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 18 |
| 17 namespace cc { | 19 namespace cc { |
| 18 namespace { | 20 namespace { |
| 19 | 21 |
| 20 const int kMaxPendingSwaps = 1; | 22 const int kMaxPendingSwaps = 1; |
| 21 | 23 |
| 22 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 24 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
| 23 | 25 |
| 24 class FakeDisplaySchedulerClient : public DisplaySchedulerClient { | 26 class FakeDisplaySchedulerClient : public DisplaySchedulerClient { |
| 25 public: | 27 public: |
| 26 FakeDisplaySchedulerClient() : draw_and_swap_count_(0) {} | 28 FakeDisplaySchedulerClient() |
| 29 : draw_and_swap_count_(0), next_draw_and_swap_fails_(false) {} |
| 27 | 30 |
| 28 ~FakeDisplaySchedulerClient() override {} | 31 ~FakeDisplaySchedulerClient() override {} |
| 29 | 32 |
| 30 bool DrawAndSwap() override { | 33 bool DrawAndSwap() override { |
| 31 draw_and_swap_count_++; | 34 draw_and_swap_count_++; |
| 32 return true; | 35 |
| 36 bool success = !next_draw_and_swap_fails_; |
| 37 next_draw_and_swap_fails_ = false; |
| 38 |
| 39 if (success) |
| 40 undrawn_surfaces_.clear(); |
| 41 return success; |
| 33 } | 42 } |
| 34 | 43 |
| 35 void Reset() { draw_and_swap_count_ = 0; } | 44 bool SurfaceHasUndrawnFrame(const SurfaceId& surface_id) const override { |
| 45 return base::ContainsKey(undrawn_surfaces_, surface_id); |
| 46 } |
| 36 | 47 |
| 37 int draw_and_swap_count() const { return draw_and_swap_count_; } | 48 int draw_and_swap_count() const { return draw_and_swap_count_; } |
| 38 | 49 |
| 50 void SetNextDrawAndSwapFails() { next_draw_and_swap_fails_ = true; } |
| 51 |
| 52 void SurfaceDamaged(const SurfaceId& surface_id) { |
| 53 undrawn_surfaces_.insert(surface_id); |
| 54 } |
| 55 |
| 39 protected: | 56 protected: |
| 40 int draw_and_swap_count_; | 57 int draw_and_swap_count_; |
| 58 bool next_draw_and_swap_fails_; |
| 59 std::set<SurfaceId> undrawn_surfaces_; |
| 41 }; | 60 }; |
| 42 | 61 |
| 43 class TestDisplayScheduler : public DisplayScheduler { | 62 class TestDisplayScheduler : public DisplayScheduler { |
| 44 public: | 63 public: |
| 45 TestDisplayScheduler(BeginFrameSource* begin_frame_source, | 64 TestDisplayScheduler(BeginFrameSource* begin_frame_source, |
| 46 base::SingleThreadTaskRunner* task_runner, | 65 base::SingleThreadTaskRunner* task_runner, |
| 47 int max_pending_swaps) | 66 int max_pending_swaps) |
| 48 : DisplayScheduler(task_runner, max_pending_swaps), | 67 : DisplayScheduler(task_runner, max_pending_swaps), |
| 49 scheduler_begin_frame_deadline_count_(0) { | 68 scheduler_begin_frame_deadline_count_(0) { |
| 50 SetBeginFrameSource(begin_frame_source); | 69 SetBeginFrameSource(begin_frame_source); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 68 } | 87 } |
| 69 | 88 |
| 70 int scheduler_begin_frame_deadline_count() { | 89 int scheduler_begin_frame_deadline_count() { |
| 71 return scheduler_begin_frame_deadline_count_; | 90 return scheduler_begin_frame_deadline_count_; |
| 72 } | 91 } |
| 73 | 92 |
| 74 bool inside_begin_frame_deadline_interval() { | 93 bool inside_begin_frame_deadline_interval() { |
| 75 return inside_begin_frame_deadline_interval_; | 94 return inside_begin_frame_deadline_interval_; |
| 76 } | 95 } |
| 77 | 96 |
| 97 bool has_pending_surfaces() { return has_pending_surfaces_; } |
| 98 |
| 78 protected: | 99 protected: |
| 79 int scheduler_begin_frame_deadline_count_; | 100 int scheduler_begin_frame_deadline_count_; |
| 80 }; | 101 }; |
| 81 | 102 |
| 82 class DisplaySchedulerTest : public testing::Test { | 103 class DisplaySchedulerTest : public testing::Test { |
| 83 public: | 104 public: |
| 84 DisplaySchedulerTest() | 105 DisplaySchedulerTest() |
| 85 : fake_begin_frame_source_(0.f, false), | 106 : fake_begin_frame_source_(0.f, false), |
| 86 task_runner_(new base::NullTaskRunner), | 107 task_runner_(new base::NullTaskRunner), |
| 87 scheduler_(&fake_begin_frame_source_, | 108 scheduler_(&fake_begin_frame_source_, |
| 88 task_runner_.get(), | 109 task_runner_.get(), |
| 89 kMaxPendingSwaps) { | 110 kMaxPendingSwaps) { |
| 90 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); | 111 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); |
| 91 scheduler_.SetClient(&client_); | 112 scheduler_.SetClient(&client_); |
| 92 } | 113 } |
| 93 | 114 |
| 94 ~DisplaySchedulerTest() override {} | 115 ~DisplaySchedulerTest() override {} |
| 95 | 116 |
| 96 void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); } | 117 void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); } |
| 97 | 118 |
| 98 void AdvanceTimeAndBeginFrameForTest() { | 119 void AdvanceTimeAndBeginFrameForTest( |
| 120 const std::list<SurfaceId>& observing_surfaces) { |
| 99 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); | 121 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); |
| 100 // FakeBeginFrameSource deals with |source_id| and |sequence_number|. | 122 // FakeBeginFrameSource deals with |source_id| and |sequence_number|. |
| 101 BeginFrameArgs args = fake_begin_frame_source_.CreateBeginFrameArgs( | 123 last_begin_frame_args_ = fake_begin_frame_source_.CreateBeginFrameArgs( |
| 102 BEGINFRAME_FROM_HERE, &now_src_); | 124 BEGINFRAME_FROM_HERE, &now_src_); |
| 103 fake_begin_frame_source_.TestOnBeginFrame(args); | 125 fake_begin_frame_source_.TestOnBeginFrame(last_begin_frame_args_); |
| 126 for (const SurfaceId& surface : observing_surfaces) |
| 127 scheduler_.SurfaceDamageExpected(surface, last_begin_frame_args_); |
| 128 } |
| 129 |
| 130 void SurfaceDamaged(const SurfaceId& surface_id) { |
| 131 client_.SurfaceDamaged(surface_id); |
| 132 scheduler_.SurfaceDamaged(surface_id, AckForCurrentBeginFrame(), true); |
| 104 } | 133 } |
| 105 | 134 |
| 106 protected: | 135 protected: |
| 107 base::SimpleTestTickClock& now_src() { return now_src_; } | 136 base::SimpleTestTickClock& now_src() { return now_src_; } |
| 108 FakeDisplaySchedulerClient& client() { return client_; } | 137 FakeDisplaySchedulerClient& client() { return client_; } |
| 109 DisplayScheduler& scheduler() { return scheduler_; } | 138 DisplayScheduler& scheduler() { return scheduler_; } |
| 139 BeginFrameAck AckForCurrentBeginFrame() { |
| 140 DCHECK(last_begin_frame_args_.IsValid()); |
| 141 return BeginFrameAck(last_begin_frame_args_.source_id, |
| 142 last_begin_frame_args_.sequence_number, |
| 143 last_begin_frame_args_.sequence_number, true); |
| 144 } |
| 110 | 145 |
| 111 FakeExternalBeginFrameSource fake_begin_frame_source_; | 146 FakeExternalBeginFrameSource fake_begin_frame_source_; |
| 147 BeginFrameArgs last_begin_frame_args_; |
| 112 | 148 |
| 113 base::SimpleTestTickClock now_src_; | 149 base::SimpleTestTickClock now_src_; |
| 114 scoped_refptr<base::NullTaskRunner> task_runner_; | 150 scoped_refptr<base::NullTaskRunner> task_runner_; |
| 115 FakeDisplaySchedulerClient client_; | 151 FakeDisplaySchedulerClient client_; |
| 116 TestDisplayScheduler scheduler_; | 152 TestDisplayScheduler scheduler_; |
| 117 }; | 153 }; |
| 118 | 154 |
| 119 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { | 155 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { |
| 120 SurfaceId root_surface_id1( | 156 SurfaceId root_surface_id1( |
| 121 kArbitraryFrameSinkId, | 157 kArbitraryFrameSinkId, |
| 122 LocalSurfaceId(1, base::UnguessableToken::Create())); | 158 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 123 SurfaceId root_surface_id2( | 159 SurfaceId root_surface_id2( |
| 124 kArbitraryFrameSinkId, | 160 kArbitraryFrameSinkId, |
| 125 LocalSurfaceId(2, base::UnguessableToken::Create())); | 161 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 126 SurfaceId sid1(kArbitraryFrameSinkId, | 162 SurfaceId sid1(kArbitraryFrameSinkId, |
| 127 LocalSurfaceId(3, base::UnguessableToken::Create())); | 163 LocalSurfaceId(3, base::UnguessableToken::Create())); |
| 128 base::TimeTicks late_deadline; | 164 base::TimeTicks late_deadline; |
| 129 | 165 |
| 130 scheduler_.SetVisible(true); | 166 scheduler_.SetVisible(true); |
| 131 | 167 |
| 132 // Go trough an initial BeginFrame cycle with the root surface. | 168 // Go trough an initial BeginFrame cycle with the root surface. |
| 133 AdvanceTimeAndBeginFrameForTest(); | 169 AdvanceTimeAndBeginFrameForTest({}); |
| 170 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id1, 1.0f, gfx::Size())); |
| 134 scheduler_.SetNewRootSurface(root_surface_id1); | 171 scheduler_.SetNewRootSurface(root_surface_id1); |
| 135 scheduler_.BeginFrameDeadlineForTest(); | 172 scheduler_.BeginFrameDeadlineForTest(); |
| 136 | 173 |
| 137 // Resize on the next begin frame cycle should cause the deadline to wait | 174 // Resize on the next begin frame cycle should cause the deadline to wait |
| 138 // for a new root surface. | 175 // for a new root surface. |
| 139 AdvanceTimeAndBeginFrameForTest(); | 176 AdvanceTimeAndBeginFrameForTest({root_surface_id1}); |
| 140 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 177 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 141 scheduler_.SurfaceDamaged(sid1); | 178 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 179 SurfaceDamaged(sid1); |
| 142 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 180 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 143 scheduler_.DisplayResized(); | 181 scheduler_.DisplayResized(); |
| 144 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 182 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 183 scheduler_.SurfaceDestroyed(root_surface_id1); |
| 184 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id2, 1.0f, gfx::Size())); |
| 145 scheduler_.SetNewRootSurface(root_surface_id2); | 185 scheduler_.SetNewRootSurface(root_surface_id2); |
| 146 EXPECT_GE(now_src().NowTicks(), | 186 EXPECT_GE(now_src().NowTicks(), |
| 147 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 187 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 148 scheduler_.BeginFrameDeadlineForTest(); | 188 scheduler_.BeginFrameDeadlineForTest(); |
| 149 | 189 |
| 150 // Verify deadline goes back to normal after resize. | 190 // Verify deadline goes back to normal after resize. |
| 151 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 191 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 152 AdvanceTimeAndBeginFrameForTest(); | 192 AdvanceTimeAndBeginFrameForTest({root_surface_id2, sid1}); |
| 153 scheduler_.SurfaceDamaged(sid1); | 193 SurfaceDamaged(sid1); |
| 154 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 194 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 155 scheduler_.SurfaceDamaged(root_surface_id2); | 195 SurfaceDamaged(root_surface_id2); |
| 156 EXPECT_GE(now_src().NowTicks(), | 196 EXPECT_GE(now_src().NowTicks(), |
| 157 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 197 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 158 scheduler_.BeginFrameDeadlineForTest(); | 198 scheduler_.BeginFrameDeadlineForTest(); |
| 159 } | 199 } |
| 160 | 200 |
| 161 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { | 201 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { |
| 162 SurfaceId root_surface_id( | 202 SurfaceId root_surface_id( |
| 163 kArbitraryFrameSinkId, | 203 kArbitraryFrameSinkId, |
| 164 LocalSurfaceId(1, base::UnguessableToken::Create())); | 204 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 165 SurfaceId sid1(kArbitraryFrameSinkId, | 205 SurfaceId sid1(kArbitraryFrameSinkId, |
| 166 LocalSurfaceId(2, base::UnguessableToken::Create())); | 206 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 167 base::TimeTicks late_deadline; | 207 base::TimeTicks late_deadline; |
| 168 | 208 |
| 169 scheduler_.SetVisible(true); | 209 scheduler_.SetVisible(true); |
| 170 | 210 |
| 171 // Go trough an initial BeginFrame cycle with the root surface. | 211 // Go trough an initial BeginFrame cycle with the root surface. |
| 172 AdvanceTimeAndBeginFrameForTest(); | 212 AdvanceTimeAndBeginFrameForTest({}); |
| 213 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 173 scheduler_.SetNewRootSurface(root_surface_id); | 214 scheduler_.SetNewRootSurface(root_surface_id); |
| 174 scheduler_.BeginFrameDeadlineForTest(); | 215 scheduler_.BeginFrameDeadlineForTest(); |
| 175 | 216 |
| 176 // Resize on the next begin frame cycle should cause the deadline to wait | 217 // Resize on the next begin frame cycle should cause the deadline to wait |
| 177 // for a new root surface. | 218 // for a new root surface. |
| 178 AdvanceTimeAndBeginFrameForTest(); | 219 AdvanceTimeAndBeginFrameForTest({root_surface_id}); |
| 179 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 220 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 180 scheduler_.SurfaceDamaged(sid1); | 221 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 222 SurfaceDamaged(sid1); |
| 181 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 223 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 182 scheduler_.DisplayResized(); | 224 scheduler_.DisplayResized(); |
| 183 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 225 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 184 scheduler_.SurfaceDamaged(root_surface_id); | 226 SurfaceDamaged(root_surface_id); |
| 185 EXPECT_GE(now_src().NowTicks(), | 227 EXPECT_GE(now_src().NowTicks(), |
| 186 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 228 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 187 scheduler_.BeginFrameDeadlineForTest(); | 229 scheduler_.BeginFrameDeadlineForTest(); |
| 188 | 230 |
| 189 // Verify deadline goes back to normal after resize. | 231 // Verify deadline goes back to normal after resize. |
| 190 AdvanceTimeAndBeginFrameForTest(); | 232 AdvanceTimeAndBeginFrameForTest({root_surface_id, sid1}); |
| 191 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 233 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 192 scheduler_.SurfaceDamaged(sid1); | 234 SurfaceDamaged(sid1); |
| 193 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 235 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 194 scheduler_.SurfaceDamaged(root_surface_id); | 236 SurfaceDamaged(root_surface_id); |
| 195 EXPECT_GE(now_src().NowTicks(), | 237 EXPECT_GE(now_src().NowTicks(), |
| 196 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 238 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 197 scheduler_.BeginFrameDeadlineForTest(); | 239 scheduler_.BeginFrameDeadlineForTest(); |
| 198 } | 240 } |
| 199 | 241 |
| 200 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 242 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
| 201 SurfaceId root_surface_id( | 243 SurfaceId root_surface_id( |
| 202 kArbitraryFrameSinkId, | 244 kArbitraryFrameSinkId, |
| 203 LocalSurfaceId(0, base::UnguessableToken::Create())); | 245 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 204 SurfaceId sid1(kArbitraryFrameSinkId, | 246 SurfaceId sid1(kArbitraryFrameSinkId, |
| 205 LocalSurfaceId(1, base::UnguessableToken::Create())); | 247 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 206 SurfaceId sid2(kArbitraryFrameSinkId, | 248 SurfaceId sid2(kArbitraryFrameSinkId, |
| 207 LocalSurfaceId(2, base::UnguessableToken::Create())); | 249 LocalSurfaceId(3, base::UnguessableToken::Create())); |
| 208 | 250 |
| 209 scheduler_.SetVisible(true); | 251 scheduler_.SetVisible(true); |
| 210 | 252 |
| 211 // Set the root surface | 253 // Create surfaces and set the root surface. |
| 254 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 255 scheduler_.SurfaceCreated(SurfaceInfo(sid2, 1.0f, gfx::Size())); |
| 256 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 212 scheduler_.SetNewRootSurface(root_surface_id); | 257 scheduler_.SetNewRootSurface(root_surface_id); |
| 213 | 258 |
| 214 // Get scheduler to detect surface 1 as active by drawing | 259 // Set surface1 as active via SurfaceDamageExpected(). |
| 215 // two frames in a row with damage from surface 1. | 260 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 216 AdvanceTimeAndBeginFrameForTest(); | |
| 217 scheduler_.SurfaceDamaged(sid1); | |
| 218 scheduler_.BeginFrameDeadlineForTest(); | |
| 219 AdvanceTimeAndBeginFrameForTest(); | |
| 220 scheduler_.SurfaceDamaged(sid1); | |
| 221 scheduler_.BeginFrameDeadlineForTest(); | |
| 222 | 261 |
| 223 // Damage only from surface 2 (inactive) does not trigger deadline early. | 262 // Damage only from surface 2 (inactive) does not trigger deadline early. |
| 224 AdvanceTimeAndBeginFrameForTest(); | 263 SurfaceDamaged(sid2); |
| 225 scheduler_.SurfaceDamaged(sid2); | 264 EXPECT_TRUE(scheduler_.has_pending_surfaces()); |
| 226 EXPECT_LT(now_src().NowTicks(), | 265 EXPECT_LT(now_src().NowTicks(), |
| 227 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 266 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 228 | 267 |
| 229 // Damage from surface 1 triggers deadline early. | 268 // Damage from surface 1 triggers deadline early. |
| 230 scheduler_.SurfaceDamaged(sid1); | 269 SurfaceDamaged(sid1); |
| 270 EXPECT_FALSE(scheduler_.has_pending_surfaces()); |
| 231 EXPECT_GE(now_src().NowTicks(), | 271 EXPECT_GE(now_src().NowTicks(), |
| 232 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 272 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 233 scheduler_.BeginFrameDeadlineForTest(); | 273 scheduler_.BeginFrameDeadlineForTest(); |
| 234 | 274 |
| 235 // Make both surface 1 and 2 active. | 275 // Set both surface 1 and 2 as active via SurfaceDamageExpected(). |
| 236 AdvanceTimeAndBeginFrameForTest(); | 276 AdvanceTimeAndBeginFrameForTest({sid1, sid2}); |
| 237 scheduler_.SurfaceDamaged(sid2); | |
| 238 scheduler_.SurfaceDamaged(sid1); | |
| 239 scheduler_.BeginFrameDeadlineForTest(); | |
| 240 | 277 |
| 241 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. | 278 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. |
| 242 AdvanceTimeAndBeginFrameForTest(); | |
| 243 EXPECT_LT(now_src().NowTicks(), | 279 EXPECT_LT(now_src().NowTicks(), |
| 244 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 245 scheduler_.SurfaceDamaged(sid1); | 281 SurfaceDamaged(sid1); |
| 246 EXPECT_LT(now_src().NowTicks(), | 282 EXPECT_LT(now_src().NowTicks(), |
| 247 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 283 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 248 scheduler_.SurfaceDamaged(sid2); | 284 SurfaceDamaged(sid2); |
| 249 EXPECT_GE(now_src().NowTicks(), | 285 EXPECT_GE(now_src().NowTicks(), |
| 250 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 286 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 251 scheduler_.BeginFrameDeadlineForTest(); | 287 scheduler_.BeginFrameDeadlineForTest(); |
| 252 | 288 |
| 253 // Make the system idle | 289 // SurfaceDamage with |!has_damage| triggers early deadline. |
| 254 AdvanceTimeAndBeginFrameForTest(); | 290 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 291 EXPECT_LT(now_src().NowTicks(), |
| 292 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 293 BeginFrameAck ack = AckForCurrentBeginFrame(); |
| 294 ack.has_damage = false; |
| 295 scheduler_.SurfaceDamaged(sid1, ack, false); |
| 296 EXPECT_GE(now_src().NowTicks(), |
| 297 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 255 scheduler_.BeginFrameDeadlineForTest(); | 298 scheduler_.BeginFrameDeadlineForTest(); |
| 256 AdvanceTimeAndBeginFrameForTest(); | 299 |
| 300 // System should be idle now. |
| 301 AdvanceTimeAndBeginFrameForTest({}); |
| 302 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); |
| 303 |
| 304 // SurfaceDamage with |!display_damaged| does not affect needs_draw and |
| 305 // scheduler stays idle. |
| 306 scheduler_.SurfaceDamaged(sid1, AckForCurrentBeginFrame(), false); |
| 257 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); | 307 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); |
| 258 | 308 |
| 259 // Deadline should trigger early if child surfaces are idle and | 309 // Deadline should trigger early if child surfaces are idle and |
| 260 // we get damage on the root surface. | 310 // we get damage on the root surface. |
| 261 AdvanceTimeAndBeginFrameForTest(); | 311 scheduler_.SurfaceDamageExpected(root_surface_id, last_begin_frame_args_); |
| 262 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); | 312 EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval()); |
| 263 scheduler_.SurfaceDamaged(root_surface_id); | 313 SurfaceDamaged(root_surface_id); |
| 264 EXPECT_GE(now_src().NowTicks(), | 314 EXPECT_GE(now_src().NowTicks(), |
| 265 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 315 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 266 scheduler_.BeginFrameDeadlineForTest(); | 316 scheduler_.BeginFrameDeadlineForTest(); |
| 267 } | 317 } |
| 268 | 318 |
| 269 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 319 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
| 270 SurfaceId root_surface_id( | 320 SurfaceId root_surface_id( |
| 271 kArbitraryFrameSinkId, | 321 kArbitraryFrameSinkId, |
| 272 LocalSurfaceId(0, base::UnguessableToken::Create())); | 322 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 273 SurfaceId sid1(kArbitraryFrameSinkId, | 323 SurfaceId sid1(kArbitraryFrameSinkId, |
| 274 LocalSurfaceId(1, base::UnguessableToken::Create())); | 324 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 275 | 325 |
| 276 scheduler_.SetVisible(true); | 326 scheduler_.SetVisible(true); |
| 277 | 327 |
| 278 // Set the root surface | 328 // Create surfaces and set the root surface. |
| 329 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 330 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 279 scheduler_.SetNewRootSurface(root_surface_id); | 331 scheduler_.SetNewRootSurface(root_surface_id); |
| 280 | 332 |
| 281 // DrawAndSwap normally. | 333 // DrawAndSwap normally. |
| 282 AdvanceTimeAndBeginFrameForTest(); | 334 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 283 EXPECT_LT(now_src().NowTicks(), | 335 EXPECT_LT(now_src().NowTicks(), |
| 284 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 336 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 285 EXPECT_EQ(0, client_.draw_and_swap_count()); | 337 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 286 scheduler_.SurfaceDamaged(sid1); | 338 SurfaceDamaged(sid1); |
| 287 scheduler_.BeginFrameDeadlineForTest(); | 339 scheduler_.BeginFrameDeadlineForTest(); |
| 288 EXPECT_EQ(1, client_.draw_and_swap_count()); | 340 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 289 | 341 |
| 290 // Deadline triggers immediately on OutputSurfaceLost. | 342 // Deadline triggers immediately on OutputSurfaceLost. |
| 291 AdvanceTimeAndBeginFrameForTest(); | 343 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 292 EXPECT_LT(now_src().NowTicks(), | 344 EXPECT_LT(now_src().NowTicks(), |
| 293 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 345 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 294 scheduler_.OutputSurfaceLost(); | 346 scheduler_.OutputSurfaceLost(); |
| 295 EXPECT_GE(now_src().NowTicks(), | 347 EXPECT_GE(now_src().NowTicks(), |
| 296 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 348 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 297 | 349 |
| 298 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 350 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
| 299 EXPECT_EQ(1, client_.draw_and_swap_count()); | 351 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 300 scheduler_.SurfaceDamaged(sid1); | 352 SurfaceDamaged(sid1); |
| 301 scheduler_.BeginFrameDeadlineForTest(); | 353 scheduler_.BeginFrameDeadlineForTest(); |
| 302 EXPECT_EQ(1, client_.draw_and_swap_count()); | 354 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 303 } | 355 } |
| 304 | 356 |
| 305 TEST_F(DisplaySchedulerTest, VisibleWithoutDamageNoTicks) { | 357 TEST_F(DisplaySchedulerTest, VisibleWithoutDamageNoTicks) { |
| 306 SurfaceId root_surface_id( | 358 SurfaceId root_surface_id( |
| 307 kArbitraryFrameSinkId, | 359 kArbitraryFrameSinkId, |
| 308 LocalSurfaceId(0, base::UnguessableToken::Create())); | 360 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 309 SurfaceId sid1(kArbitraryFrameSinkId, | |
| 310 LocalSurfaceId(1, base::UnguessableToken::Create())); | |
| 311 | 361 |
| 312 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 362 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
| 313 scheduler_.SetVisible(true); | 363 scheduler_.SetVisible(true); |
| 314 | 364 |
| 315 // When becoming visible, don't start listening for begin frames until there | 365 // When becoming visible, don't start listening for begin frames until there |
| 316 // is some damage. | 366 // is some damage. |
| 317 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 367 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
| 318 scheduler_.SetNewRootSurface(root_surface_id); | 368 scheduler_.SetNewRootSurface(root_surface_id); |
| 319 | 369 |
| 320 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 370 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
| 321 } | 371 } |
| 322 | 372 |
| 323 TEST_F(DisplaySchedulerTest, VisibleWithDamageTicks) { | 373 TEST_F(DisplaySchedulerTest, VisibleWithDamageTicks) { |
| 324 SurfaceId root_surface_id( | 374 SurfaceId root_surface_id( |
| 325 kArbitraryFrameSinkId, | 375 kArbitraryFrameSinkId, |
| 326 LocalSurfaceId(0, base::UnguessableToken::Create())); | 376 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 327 SurfaceId sid1(kArbitraryFrameSinkId, | 377 SurfaceId sid1(kArbitraryFrameSinkId, |
| 328 LocalSurfaceId(1, base::UnguessableToken::Create())); | 378 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 329 | 379 |
| 330 scheduler_.SetNewRootSurface(root_surface_id); | 380 scheduler_.SetNewRootSurface(root_surface_id); |
| 331 | 381 |
| 332 // When there is damage, start listening for begin frames once becoming | 382 // When there is damage, start listening for begin frames once becoming |
| 333 // visible. | 383 // visible. |
| 334 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 384 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
| 335 scheduler_.SetVisible(true); | 385 scheduler_.SetVisible(true); |
| 336 | 386 |
| 337 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 387 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
| 338 } | 388 } |
| 339 | 389 |
| 340 TEST_F(DisplaySchedulerTest, Visibility) { | 390 TEST_F(DisplaySchedulerTest, Visibility) { |
| 341 SurfaceId root_surface_id( | 391 SurfaceId root_surface_id( |
| 342 kArbitraryFrameSinkId, | 392 kArbitraryFrameSinkId, |
| 343 LocalSurfaceId(0, base::UnguessableToken::Create())); | 393 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 344 SurfaceId sid1(kArbitraryFrameSinkId, | 394 SurfaceId sid1(kArbitraryFrameSinkId, |
| 345 LocalSurfaceId(1, base::UnguessableToken::Create())); | 395 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 346 | 396 |
| 397 // Create surfaces and set the root surface. |
| 398 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 399 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 347 scheduler_.SetNewRootSurface(root_surface_id); | 400 scheduler_.SetNewRootSurface(root_surface_id); |
| 348 scheduler_.SetVisible(true); | 401 scheduler_.SetVisible(true); |
| 349 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 402 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
| 350 | 403 |
| 351 // DrawAndSwap normally. | 404 // DrawAndSwap normally. |
| 352 AdvanceTimeAndBeginFrameForTest(); | 405 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 353 EXPECT_LT(now_src().NowTicks(), | 406 EXPECT_LT(now_src().NowTicks(), |
| 354 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 407 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 355 EXPECT_EQ(0, client_.draw_and_swap_count()); | 408 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 356 scheduler_.SurfaceDamaged(sid1); | 409 SurfaceDamaged(sid1); |
| 357 scheduler_.BeginFrameDeadlineForTest(); | 410 scheduler_.BeginFrameDeadlineForTest(); |
| 358 EXPECT_EQ(1, client_.draw_and_swap_count()); | 411 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 359 | 412 |
| 360 AdvanceTimeAndBeginFrameForTest(); | 413 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 361 EXPECT_LT(now_src().NowTicks(), | 414 EXPECT_LT(now_src().NowTicks(), |
| 362 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 415 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 363 | 416 |
| 364 // Become not visible. | 417 // Become not visible. |
| 365 scheduler_.SetVisible(false); | 418 scheduler_.SetVisible(false); |
| 366 | 419 |
| 367 // It will stop listening for begin frames after the current deadline. | 420 // It will stop listening for begin frames after the current deadline. |
| 368 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 421 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
| 369 | 422 |
| 370 // Deadline does not DrawAndSwap when not visible. | 423 // Deadline does not DrawAndSwap when not visible. |
| 371 EXPECT_EQ(1, client_.draw_and_swap_count()); | 424 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 372 scheduler_.BeginFrameDeadlineForTest(); | 425 scheduler_.BeginFrameDeadlineForTest(); |
| 373 EXPECT_EQ(1, client_.draw_and_swap_count()); | 426 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 374 // Now it stops listening for begin frames. | 427 // Now it stops listening for begin frames. |
| 375 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 428 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
| 376 | 429 |
| 377 // Does not start listening for begin frames when becoming visible without | 430 // Does not start listening for begin frames when becoming visible without |
| 378 // damage. | 431 // damage. |
| 379 scheduler_.SetVisible(true); | 432 scheduler_.SetVisible(true); |
| 380 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 433 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
| 381 scheduler_.SetVisible(false); | 434 scheduler_.SetVisible(false); |
| 382 | 435 |
| 383 // Does not start listening for begin frames when damage arrives. | 436 // Does not start listening for begin frames when damage arrives. |
| 384 scheduler_.SurfaceDamaged(sid1); | 437 SurfaceDamaged(sid1); |
| 385 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); | 438 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers()); |
| 386 | 439 |
| 387 // But does when becoming visible with damage again. | 440 // But does when becoming visible with damage again. |
| 388 scheduler_.SetVisible(true); | 441 scheduler_.SetVisible(true); |
| 389 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); | 442 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers()); |
| 390 } | 443 } |
| 391 | 444 |
| 392 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { | 445 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { |
| 393 SurfaceId root_surface_id( | 446 SurfaceId root_surface_id( |
| 394 kArbitraryFrameSinkId, | 447 kArbitraryFrameSinkId, |
| 395 LocalSurfaceId(0, base::UnguessableToken::Create())); | 448 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 396 SurfaceId sid1(kArbitraryFrameSinkId, | 449 SurfaceId sid1(kArbitraryFrameSinkId, |
| 397 LocalSurfaceId(1, base::UnguessableToken::Create())); | 450 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 398 | 451 |
| 399 scheduler_.SetVisible(true); | 452 scheduler_.SetVisible(true); |
| 400 | 453 |
| 401 // Set the root surface | 454 // Create surfaces and set the root surface. |
| 455 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 456 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 402 scheduler_.SetNewRootSurface(root_surface_id); | 457 scheduler_.SetNewRootSurface(root_surface_id); |
| 403 | 458 |
| 404 // DrawAndSwap normally. | 459 // DrawAndSwap normally. |
| 405 AdvanceTimeAndBeginFrameForTest(); | 460 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 406 EXPECT_LT(now_src().NowTicks(), | 461 EXPECT_LT(now_src().NowTicks(), |
| 407 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 462 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 408 EXPECT_EQ(0, client_.draw_and_swap_count()); | 463 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 409 scheduler_.SurfaceDamaged(sid1); | 464 SurfaceDamaged(sid1); |
| 410 scheduler_.BeginFrameDeadlineForTest(); | 465 scheduler_.BeginFrameDeadlineForTest(); |
| 411 EXPECT_EQ(1, client_.draw_and_swap_count()); | 466 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 412 | 467 |
| 413 scheduler_.DisplayResized(); | 468 scheduler_.DisplayResized(); |
| 414 AdvanceTimeAndBeginFrameForTest(); | 469 AdvanceTimeAndBeginFrameForTest({}); |
| 415 // DisplayResized should trigger a swap to happen. | 470 // DisplayResized should trigger a swap to happen. |
| 416 scheduler_.BeginFrameDeadlineForTest(); | 471 scheduler_.BeginFrameDeadlineForTest(); |
| 417 EXPECT_EQ(2, client_.draw_and_swap_count()); | 472 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 418 } | 473 } |
| 419 | 474 |
| 420 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 475 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
| 421 SurfaceId root_surface_id( | 476 SurfaceId root_surface_id( |
| 422 kArbitraryFrameSinkId, | 477 kArbitraryFrameSinkId, |
| 423 LocalSurfaceId(0, base::UnguessableToken::Create())); | 478 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 424 SurfaceId sid1(kArbitraryFrameSinkId, | 479 SurfaceId sid1(kArbitraryFrameSinkId, |
| 425 LocalSurfaceId(1, base::UnguessableToken::Create())); | 480 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 426 base::TimeTicks late_deadline; | 481 base::TimeTicks late_deadline; |
| 427 | 482 |
| 428 scheduler_.SetVisible(true); | 483 scheduler_.SetVisible(true); |
| 429 | 484 |
| 430 // Set the root surface | 485 // Create surfaces and set the root surface. |
| 486 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 487 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 431 scheduler_.SetNewRootSurface(root_surface_id); | 488 scheduler_.SetNewRootSurface(root_surface_id); |
| 432 | 489 |
| 433 // DrawAndSwap normally. | 490 // DrawAndSwap normally. |
| 434 AdvanceTimeAndBeginFrameForTest(); | 491 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 435 EXPECT_LT(now_src().NowTicks(), | 492 EXPECT_LT(now_src().NowTicks(), |
| 436 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 493 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 437 EXPECT_EQ(0, client_.draw_and_swap_count()); | 494 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 438 scheduler_.SurfaceDamaged(sid1); | 495 SurfaceDamaged(sid1); |
| 439 scheduler_.BeginFrameDeadlineForTest(); | 496 scheduler_.BeginFrameDeadlineForTest(); |
| 440 EXPECT_EQ(1, client_.draw_and_swap_count()); | 497 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 441 | 498 |
| 442 // Deadline triggers late while root resources are locked. | 499 // Deadline triggers late while root resources are locked. |
| 443 AdvanceTimeAndBeginFrameForTest(); | 500 AdvanceTimeAndBeginFrameForTest({sid1}); |
| 444 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 501 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 445 scheduler_.SurfaceDamaged(sid1); | 502 SurfaceDamaged(sid1); |
| 446 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 503 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 447 scheduler_.SetRootSurfaceResourcesLocked(true); | 504 scheduler_.SetRootSurfaceResourcesLocked(true); |
| 448 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 505 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 449 | 506 |
| 450 // Deadline does not DrawAndSwap while root resources are locked. | 507 // Deadline does not DrawAndSwap while root resources are locked. |
| 451 EXPECT_EQ(1, client_.draw_and_swap_count()); | 508 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 452 scheduler_.SurfaceDamaged(sid1); | 509 SurfaceDamaged(sid1); |
| 453 scheduler_.BeginFrameDeadlineForTest(); | 510 scheduler_.BeginFrameDeadlineForTest(); |
| 454 EXPECT_EQ(1, client_.draw_and_swap_count()); | 511 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 455 | 512 |
| 456 // Deadline triggers normally when root resources are unlocked. | 513 // Deadline triggers normally when root resources are unlocked. |
| 457 AdvanceTimeAndBeginFrameForTest(); | 514 AdvanceTimeAndBeginFrameForTest({sid1, root_surface_id}); |
| 458 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 515 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 459 scheduler_.SurfaceDamaged(sid1); | 516 SurfaceDamaged(sid1); |
| 460 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 517 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 461 scheduler_.SetRootSurfaceResourcesLocked(false); | 518 scheduler_.SetRootSurfaceResourcesLocked(false); |
| 462 scheduler_.SurfaceDamaged(root_surface_id); | 519 SurfaceDamaged(root_surface_id); |
| 463 EXPECT_EQ(base::TimeTicks(), | 520 EXPECT_EQ(base::TimeTicks(), |
| 464 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 521 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 465 | 522 |
| 466 EXPECT_EQ(1, client_.draw_and_swap_count()); | 523 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 467 scheduler_.BeginFrameDeadlineForTest(); | 524 scheduler_.BeginFrameDeadlineForTest(); |
| 468 EXPECT_EQ(2, client_.draw_and_swap_count()); | 525 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 469 } | 526 } |
| 470 | 527 |
| 471 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 528 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
| 472 SurfaceId root_surface_id( | 529 SurfaceId root_surface_id( |
| 473 kArbitraryFrameSinkId, | 530 kArbitraryFrameSinkId, |
| 474 LocalSurfaceId(0, base::UnguessableToken::Create())); | 531 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 475 SurfaceId sid1(kArbitraryFrameSinkId, | 532 SurfaceId sid1(kArbitraryFrameSinkId, |
| 476 LocalSurfaceId(1, base::UnguessableToken::Create())); | 533 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| 477 SurfaceId sid2(kArbitraryFrameSinkId, | 534 SurfaceId sid2(kArbitraryFrameSinkId, |
| 478 LocalSurfaceId(2, base::UnguessableToken::Create())); | 535 LocalSurfaceId(3, base::UnguessableToken::Create())); |
| 479 | 536 |
| 480 scheduler_.SetVisible(true); | 537 scheduler_.SetVisible(true); |
| 481 | 538 |
| 482 // Set the root surface | 539 // Create surfaces and set the root surface. |
| 540 scheduler_.SurfaceCreated(SurfaceInfo(sid1, 1.0f, gfx::Size())); |
| 541 scheduler_.SurfaceCreated(SurfaceInfo(sid2, 1.0f, gfx::Size())); |
| 542 scheduler_.SurfaceCreated(SurfaceInfo(root_surface_id, 1.0f, gfx::Size())); |
| 483 scheduler_.SetNewRootSurface(root_surface_id); | 543 scheduler_.SetNewRootSurface(root_surface_id); |
| 484 | 544 |
| 485 // Get scheduler to detect surface 1 and 2 as active. | 545 // Set surface 1 and 2 as active. |
| 486 AdvanceTimeAndBeginFrameForTest(); | 546 AdvanceTimeAndBeginFrameForTest({sid1, sid2}); |
| 487 scheduler_.SurfaceDamaged(sid1); | |
| 488 scheduler_.SurfaceDamaged(sid2); | |
| 489 scheduler_.BeginFrameDeadlineForTest(); | |
| 490 AdvanceTimeAndBeginFrameForTest(); | |
| 491 scheduler_.SurfaceDamaged(sid1); | |
| 492 scheduler_.SurfaceDamaged(sid2); | |
| 493 scheduler_.BeginFrameDeadlineForTest(); | |
| 494 | 547 |
| 495 // DrawAndSwap normally. | 548 // DrawAndSwap normally. |
| 496 AdvanceTimeAndBeginFrameForTest(); | |
| 497 EXPECT_LT(now_src().NowTicks(), | 549 EXPECT_LT(now_src().NowTicks(), |
| 498 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 550 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 499 EXPECT_EQ(2, client_.draw_and_swap_count()); | 551 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 500 scheduler_.SurfaceDamaged(sid1); | 552 SurfaceDamaged(sid1); |
| 501 scheduler_.SurfaceDamaged(sid2); | 553 SurfaceDamaged(sid2); |
| 502 scheduler_.BeginFrameDeadlineForTest(); | 554 scheduler_.BeginFrameDeadlineForTest(); |
| 503 EXPECT_EQ(3, client_.draw_and_swap_count()); | 555 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 504 scheduler_.DidSwapBuffers(); | 556 scheduler_.DidSwapBuffers(); |
| 505 | 557 |
| 506 // Deadline triggers late when swap throttled. | 558 // Deadline triggers late when swap throttled. |
| 507 AdvanceTimeAndBeginFrameForTest(); | 559 AdvanceTimeAndBeginFrameForTest({sid1, sid2}); |
| 508 base::TimeTicks late_deadline = | 560 base::TimeTicks late_deadline = |
| 509 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 561 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 510 // Damage surface 1, but not surface 2 so we avoid triggering deadline | 562 // Damage surface 1, but not surface 2 so we avoid triggering deadline |
| 511 // early because all surfaces are ready. | 563 // early because all surfaces are ready. |
| 512 scheduler_.SurfaceDamaged(sid1); | 564 SurfaceDamaged(sid1); |
| 513 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 565 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 514 | 566 |
| 515 // Don't draw and swap in deadline while swap throttled. | 567 // Don't draw and swap in deadline while swap throttled. |
| 516 EXPECT_EQ(3, client_.draw_and_swap_count()); | 568 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 517 scheduler_.BeginFrameDeadlineForTest(); | 569 scheduler_.BeginFrameDeadlineForTest(); |
| 518 EXPECT_EQ(3, client_.draw_and_swap_count()); | 570 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 519 | 571 |
| 520 // Deadline triggers normally once not swap throttled. | 572 // Deadline triggers normally once not swap throttled. |
| 521 // Damage from previous BeginFrame should cary over, so don't damage again. | 573 // Damage from previous BeginFrame should cary over, so don't damage again. |
| 522 scheduler_.DidReceiveSwapBuffersAck(); | 574 scheduler_.DidReceiveSwapBuffersAck(); |
| 523 AdvanceTimeAndBeginFrameForTest(); | 575 AdvanceTimeAndBeginFrameForTest({sid2}); |
| 524 base::TimeTicks expected_deadline = | 576 base::TimeTicks expected_deadline = |
| 525 scheduler_.LastUsedBeginFrameArgs().deadline - | 577 scheduler_.LastUsedBeginFrameArgs().deadline - |
| 526 BeginFrameArgs::DefaultEstimatedParentDrawTime(); | 578 BeginFrameArgs::DefaultEstimatedParentDrawTime(); |
| 527 EXPECT_EQ(expected_deadline, | 579 EXPECT_EQ(expected_deadline, |
| 528 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 580 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 529 // Still waiting for surface 2. Once it updates, deadline should trigger | 581 // Still waiting for surface 2. Once it updates, deadline should trigger |
| 530 // immediately again. | 582 // immediately again. |
| 531 scheduler_.SurfaceDamaged(sid2); | 583 SurfaceDamaged(sid2); |
| 532 EXPECT_EQ(scheduler_.DesiredBeginFrameDeadlineTimeForTest(), | 584 EXPECT_EQ(base::TimeTicks(), |
| 533 base::TimeTicks()); | 585 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 534 // Draw and swap now that we aren't throttled. | 586 // Draw and swap now that we aren't throttled. |
| 535 EXPECT_EQ(3, client_.draw_and_swap_count()); | 587 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 536 scheduler_.BeginFrameDeadlineForTest(); | 588 scheduler_.BeginFrameDeadlineForTest(); |
| 537 EXPECT_EQ(4, client_.draw_and_swap_count()); | 589 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 538 } | 590 } |
| 539 | 591 |
| 540 // This test verfies that we try to reschedule the deadline | 592 // This test verfies that we try to reschedule the deadline |
| 541 // after any event that may change what deadline we want. | 593 // after any event that may change what deadline we want. |
| 542 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 594 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
| 543 SurfaceId root_surface_id( | 595 SurfaceId root_surface_id( |
| 544 kArbitraryFrameSinkId, | 596 kArbitraryFrameSinkId, |
| 545 LocalSurfaceId(1, base::UnguessableToken::Create())); | 597 LocalSurfaceId(1, base::UnguessableToken::Create())); |
| 546 SurfaceId sid1(kArbitraryFrameSinkId, | 598 SurfaceId sid1(kArbitraryFrameSinkId, |
| 547 LocalSurfaceId(2, base::UnguessableToken::Create())); | 599 LocalSurfaceId(2, base::UnguessableToken::Create())); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 561 scheduler_.SetNewRootSurface(root_surface_id); | 613 scheduler_.SetNewRootSurface(root_surface_id); |
| 562 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 614 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 563 | 615 |
| 564 scheduler_.SetVisible(true); | 616 scheduler_.SetVisible(true); |
| 565 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 617 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 566 | 618 |
| 567 // Set the root surface while visible. | 619 // Set the root surface while visible. |
| 568 scheduler_.SetNewRootSurface(root_surface_id); | 620 scheduler_.SetNewRootSurface(root_surface_id); |
| 569 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 621 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 570 | 622 |
| 571 AdvanceTimeAndBeginFrameForTest(); | 623 AdvanceTimeAndBeginFrameForTest({}); |
| 572 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 624 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 573 | 625 |
| 574 scheduler_.BeginFrameDeadlineForTest(); | 626 scheduler_.BeginFrameDeadlineForTest(); |
| 575 scheduler_.DidSwapBuffers(); | 627 scheduler_.DidSwapBuffers(); |
| 576 AdvanceTimeAndBeginFrameForTest(); | 628 AdvanceTimeAndBeginFrameForTest({}); |
| 577 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 629 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 578 | 630 |
| 579 scheduler_.DidReceiveSwapBuffersAck(); | 631 scheduler_.DidReceiveSwapBuffersAck(); |
| 580 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 632 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 581 | 633 |
| 582 scheduler_.DisplayResized(); | 634 scheduler_.DisplayResized(); |
| 583 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 635 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 584 | 636 |
| 585 scheduler_.SetNewRootSurface(root_surface_id); | 637 scheduler_.SetNewRootSurface(root_surface_id); |
| 586 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 638 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 587 | 639 |
| 588 scheduler_.SurfaceDamaged(sid1); | 640 SurfaceDamaged(sid1); |
| 589 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 641 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 590 | 642 |
| 591 scheduler_.SetRootSurfaceResourcesLocked(true); | 643 scheduler_.SetRootSurfaceResourcesLocked(true); |
| 592 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 644 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 593 | 645 |
| 594 scheduler_.OutputSurfaceLost(); | 646 scheduler_.OutputSurfaceLost(); |
| 595 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); | 647 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count()); |
| 596 } | 648 } |
| 597 | 649 |
| 598 } // namespace | 650 } // namespace |
| 599 } // namespace cc | 651 } // namespace cc |
| OLD | NEW |