Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Side by Side Diff: cc/surfaces/display_scheduler_unittest.cc

Issue 2854163003: [cc] Plumb BeginFrameAcks through SurfaceManager to DisplayScheduler. (Closed)
Patch Set: Pass ack via SurfaceDamaged, add back tests. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698