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

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

Issue 2029323004: Get rid of virtual Display::CreateScheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@onscreendisplayclient
Patch Set: displaytest: unusedvar Created 4 years, 6 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
« no previous file with comments | « cc/surfaces/display_scheduler.cc ('k') | cc/surfaces/display_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/test/null_task_runner.h" 8 #include "base/test/null_task_runner.h"
9 #include "base/test/simple_test_tick_clock.h" 9 #include "base/test/simple_test_tick_clock.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 22 matching lines...) Expand all
33 void Reset() { draw_and_swap_count_ = 0; } 33 void Reset() { draw_and_swap_count_ = 0; }
34 34
35 int draw_and_swap_count() const { return draw_and_swap_count_; } 35 int draw_and_swap_count() const { return draw_and_swap_count_; }
36 36
37 protected: 37 protected:
38 int draw_and_swap_count_; 38 int draw_and_swap_count_;
39 }; 39 };
40 40
41 class TestDisplayScheduler : public DisplayScheduler { 41 class TestDisplayScheduler : public DisplayScheduler {
42 public: 42 public:
43 TestDisplayScheduler(DisplaySchedulerClient* client, 43 TestDisplayScheduler(BeginFrameSource* begin_frame_source,
44 BeginFrameSource* begin_frame_source,
45 base::SingleThreadTaskRunner* task_runner, 44 base::SingleThreadTaskRunner* task_runner,
46 int max_pending_swaps) 45 int max_pending_swaps)
47 : DisplayScheduler(client, 46 : DisplayScheduler(begin_frame_source, task_runner, max_pending_swaps),
48 begin_frame_source,
49 task_runner,
50 max_pending_swaps),
51 scheduler_begin_frame_deadline_count_(0) {} 47 scheduler_begin_frame_deadline_count_(0) {}
52 48
53 base::TimeTicks DesiredBeginFrameDeadlineTimeForTest() { 49 base::TimeTicks DesiredBeginFrameDeadlineTimeForTest() {
54 return DesiredBeginFrameDeadlineTime(); 50 return DesiredBeginFrameDeadlineTime();
55 } 51 }
56 52
57 void BeginFrameDeadlineForTest() { OnBeginFrameDeadline(); } 53 void BeginFrameDeadlineForTest() { OnBeginFrameDeadline(); }
58 54
59 void ScheduleBeginFrameDeadline() override { 55 void ScheduleBeginFrameDeadline() override {
60 scheduler_begin_frame_deadline_count_++; 56 scheduler_begin_frame_deadline_count_++;
61 DisplayScheduler::ScheduleBeginFrameDeadline(); 57 DisplayScheduler::ScheduleBeginFrameDeadline();
62 } 58 }
63 59
64 int scheduler_begin_frame_deadline_count() { 60 int scheduler_begin_frame_deadline_count() {
65 return scheduler_begin_frame_deadline_count_; 61 return scheduler_begin_frame_deadline_count_;
66 } 62 }
67 63
68 protected: 64 protected:
69 int scheduler_begin_frame_deadline_count_; 65 int scheduler_begin_frame_deadline_count_;
70 }; 66 };
71 67
72 class DisplaySchedulerTest : public testing::Test { 68 class DisplaySchedulerTest : public testing::Test {
73 public: 69 public:
74 DisplaySchedulerTest() 70 DisplaySchedulerTest()
75 : fake_begin_frame_source_(0.f, false), 71 : fake_begin_frame_source_(0.f, false),
76 now_src_(new base::SimpleTestTickClock()),
77 task_runner_(new base::NullTaskRunner), 72 task_runner_(new base::NullTaskRunner),
78 client_(new FakeDisplaySchedulerClient), 73 scheduler_(&fake_begin_frame_source_,
79 scheduler_(new TestDisplayScheduler(client_.get(), 74 task_runner_.get(),
80 &fake_begin_frame_source_, 75 kMaxPendingSwaps) {
81 task_runner_.get(), 76 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000));
82 kMaxPendingSwaps)) { 77 scheduler_.SetClient(&client_);
83 now_src_->Advance(base::TimeDelta::FromMicroseconds(10000));
84 } 78 }
85 79
86 ~DisplaySchedulerTest() override {} 80 ~DisplaySchedulerTest() override {}
87 81
88 void SetUp() override { scheduler_->SetRootSurfaceResourcesLocked(false); } 82 void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); }
89 83
90 void BeginFrameForTest() { 84 void BeginFrameForTest() {
91 base::TimeTicks frame_time = now_src_->NowTicks(); 85 base::TimeTicks frame_time = now_src_.NowTicks();
92 base::TimeDelta interval = BeginFrameArgs::DefaultInterval(); 86 base::TimeDelta interval = BeginFrameArgs::DefaultInterval();
93 base::TimeTicks deadline = frame_time + interval; 87 base::TimeTicks deadline = frame_time + interval;
94 fake_begin_frame_source_.TestOnBeginFrame( 88 fake_begin_frame_source_.TestOnBeginFrame(
95 BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, 89 BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
96 interval, BeginFrameArgs::NORMAL)); 90 interval, BeginFrameArgs::NORMAL));
97 } 91 }
98 92
99 protected: 93 protected:
100 base::SimpleTestTickClock& now_src() { return *now_src_; } 94 base::SimpleTestTickClock& now_src() { return now_src_; }
101 FakeDisplaySchedulerClient& client() { return *client_; } 95 FakeDisplaySchedulerClient& client() { return client_; }
102 DisplayScheduler& scheduler() { return *scheduler_; } 96 DisplayScheduler& scheduler() { return scheduler_; }
103 97
104 FakeExternalBeginFrameSource fake_begin_frame_source_; 98 FakeExternalBeginFrameSource fake_begin_frame_source_;
105 99
106 std::unique_ptr<base::SimpleTestTickClock> now_src_; 100 base::SimpleTestTickClock now_src_;
107 scoped_refptr<base::NullTaskRunner> task_runner_; 101 scoped_refptr<base::NullTaskRunner> task_runner_;
108 std::unique_ptr<FakeDisplaySchedulerClient> client_; 102 FakeDisplaySchedulerClient client_;
109 std::unique_ptr<TestDisplayScheduler> scheduler_; 103 TestDisplayScheduler scheduler_;
110 }; 104 };
111 105
112 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { 106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
113 SurfaceId root_surface_id1(0, 1, 0); 107 SurfaceId root_surface_id1(0, 1, 0);
114 SurfaceId root_surface_id2(0, 2, 0); 108 SurfaceId root_surface_id2(0, 2, 0);
115 SurfaceId sid1(0, 3, 0); 109 SurfaceId sid1(0, 3, 0);
116 base::TimeTicks late_deadline; 110 base::TimeTicks late_deadline;
117 111
118 // Go trough an initial BeginFrame cycle with the root surface. 112 // Go trough an initial BeginFrame cycle with the root surface.
119 BeginFrameForTest(); 113 BeginFrameForTest();
120 scheduler_->SetNewRootSurface(root_surface_id1); 114 scheduler_.SetNewRootSurface(root_surface_id1);
121 scheduler_->BeginFrameDeadlineForTest(); 115 scheduler_.BeginFrameDeadlineForTest();
122 116
123 // Resize on the next begin frame cycle should cause the deadline to wait 117 // Resize on the next begin frame cycle should cause the deadline to wait
124 // for a new root surface. 118 // for a new root surface.
125 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 119 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
126 BeginFrameForTest(); 120 BeginFrameForTest();
127 scheduler_->SurfaceDamaged(sid1); 121 scheduler_.SurfaceDamaged(sid1);
128 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 122 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
129 scheduler_->DisplayResized(); 123 scheduler_.DisplayResized();
130 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 124 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
131 scheduler_->SetNewRootSurface(root_surface_id2); 125 scheduler_.SetNewRootSurface(root_surface_id2);
132 EXPECT_GE(now_src().NowTicks(), 126 EXPECT_GE(now_src().NowTicks(),
133 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 127 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
134 scheduler_->BeginFrameDeadlineForTest(); 128 scheduler_.BeginFrameDeadlineForTest();
135 129
136 // Verify deadline goes back to normal after resize. 130 // Verify deadline goes back to normal after resize.
137 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 131 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
138 BeginFrameForTest(); 132 BeginFrameForTest();
139 scheduler_->SurfaceDamaged(sid1); 133 scheduler_.SurfaceDamaged(sid1);
140 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 134 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
141 scheduler_->SurfaceDamaged(root_surface_id2); 135 scheduler_.SurfaceDamaged(root_surface_id2);
142 EXPECT_GE(now_src().NowTicks(), 136 EXPECT_GE(now_src().NowTicks(),
143 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 137 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
144 scheduler_->BeginFrameDeadlineForTest(); 138 scheduler_.BeginFrameDeadlineForTest();
145 } 139 }
146 140
147 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { 141 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
148 SurfaceId root_surface_id(0, 1, 0); 142 SurfaceId root_surface_id(0, 1, 0);
149 SurfaceId sid1(0, 2, 0); 143 SurfaceId sid1(0, 2, 0);
150 base::TimeTicks late_deadline; 144 base::TimeTicks late_deadline;
151 145
152 // Go trough an initial BeginFrame cycle with the root surface. 146 // Go trough an initial BeginFrame cycle with the root surface.
153 BeginFrameForTest(); 147 BeginFrameForTest();
154 scheduler_->SetNewRootSurface(root_surface_id); 148 scheduler_.SetNewRootSurface(root_surface_id);
155 scheduler_->BeginFrameDeadlineForTest(); 149 scheduler_.BeginFrameDeadlineForTest();
156 150
157 // Resize on the next begin frame cycle should cause the deadline to wait 151 // Resize on the next begin frame cycle should cause the deadline to wait
158 // for a new root surface. 152 // for a new root surface.
159 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 153 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
160 BeginFrameForTest(); 154 BeginFrameForTest();
161 scheduler_->SurfaceDamaged(sid1); 155 scheduler_.SurfaceDamaged(sid1);
162 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 156 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
163 scheduler_->DisplayResized(); 157 scheduler_.DisplayResized();
164 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 158 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
165 scheduler_->SurfaceDamaged(root_surface_id); 159 scheduler_.SurfaceDamaged(root_surface_id);
166 EXPECT_GE(now_src().NowTicks(), 160 EXPECT_GE(now_src().NowTicks(),
167 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 161 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
168 scheduler_->BeginFrameDeadlineForTest(); 162 scheduler_.BeginFrameDeadlineForTest();
169 163
170 // Verify deadline goes back to normal after resize. 164 // Verify deadline goes back to normal after resize.
171 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 165 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
172 BeginFrameForTest(); 166 BeginFrameForTest();
173 scheduler_->SurfaceDamaged(sid1); 167 scheduler_.SurfaceDamaged(sid1);
174 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 168 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
175 scheduler_->SurfaceDamaged(root_surface_id); 169 scheduler_.SurfaceDamaged(root_surface_id);
176 EXPECT_GE(now_src().NowTicks(), 170 EXPECT_GE(now_src().NowTicks(),
177 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 171 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
178 scheduler_->BeginFrameDeadlineForTest(); 172 scheduler_.BeginFrameDeadlineForTest();
179 } 173 }
180 174
181 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { 175 TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
182 SurfaceId root_surface_id(0, 0, 0); 176 SurfaceId root_surface_id(0, 0, 0);
183 SurfaceId sid1(0, 1, 0); 177 SurfaceId sid1(0, 1, 0);
184 SurfaceId sid2(0, 2, 0); 178 SurfaceId sid2(0, 2, 0);
185 179
186 // Set the root surface 180 // Set the root surface
187 scheduler_->SetNewRootSurface(root_surface_id); 181 scheduler_.SetNewRootSurface(root_surface_id);
188 182
189 // Get scheduler to detect surface 1 as active by drawing 183 // Get scheduler to detect surface 1 as active by drawing
190 // two frames in a row with damage from surface 1. 184 // two frames in a row with damage from surface 1.
191 BeginFrameForTest(); 185 BeginFrameForTest();
192 scheduler_->SurfaceDamaged(sid1); 186 scheduler_.SurfaceDamaged(sid1);
193 scheduler_->BeginFrameDeadlineForTest(); 187 scheduler_.BeginFrameDeadlineForTest();
194 BeginFrameForTest(); 188 BeginFrameForTest();
195 scheduler_->SurfaceDamaged(sid1); 189 scheduler_.SurfaceDamaged(sid1);
196 scheduler_->BeginFrameDeadlineForTest(); 190 scheduler_.BeginFrameDeadlineForTest();
197 191
198 // Damage only from surface 2 (inactive) does not trigger deadline early. 192 // Damage only from surface 2 (inactive) does not trigger deadline early.
199 BeginFrameForTest(); 193 BeginFrameForTest();
200 scheduler_->SurfaceDamaged(sid2); 194 scheduler_.SurfaceDamaged(sid2);
201 EXPECT_LT(now_src().NowTicks(), 195 EXPECT_LT(now_src().NowTicks(),
202 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 196 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
203 197
204 // Damage from surface 1 triggers deadline early. 198 // Damage from surface 1 triggers deadline early.
205 scheduler_->SurfaceDamaged(sid1); 199 scheduler_.SurfaceDamaged(sid1);
206 EXPECT_GE(now_src().NowTicks(), 200 EXPECT_GE(now_src().NowTicks(),
207 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 201 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
208 scheduler_->BeginFrameDeadlineForTest(); 202 scheduler_.BeginFrameDeadlineForTest();
209 203
210 // Make both surface 1 and 2 active. 204 // Make both surface 1 and 2 active.
211 BeginFrameForTest(); 205 BeginFrameForTest();
212 scheduler_->SurfaceDamaged(sid2); 206 scheduler_.SurfaceDamaged(sid2);
213 scheduler_->SurfaceDamaged(sid1); 207 scheduler_.SurfaceDamaged(sid1);
214 scheduler_->BeginFrameDeadlineForTest(); 208 scheduler_.BeginFrameDeadlineForTest();
215 209
216 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. 210 // Deadline doesn't trigger early until surface 1 and 2 are both damaged.
217 BeginFrameForTest(); 211 BeginFrameForTest();
218 EXPECT_LT(now_src().NowTicks(), 212 EXPECT_LT(now_src().NowTicks(),
219 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 213 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
220 scheduler_->SurfaceDamaged(sid1); 214 scheduler_.SurfaceDamaged(sid1);
221 EXPECT_LT(now_src().NowTicks(), 215 EXPECT_LT(now_src().NowTicks(),
222 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 216 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
223 scheduler_->SurfaceDamaged(sid2); 217 scheduler_.SurfaceDamaged(sid2);
224 EXPECT_GE(now_src().NowTicks(), 218 EXPECT_GE(now_src().NowTicks(),
225 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 219 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
226 scheduler_->BeginFrameDeadlineForTest(); 220 scheduler_.BeginFrameDeadlineForTest();
227 221
228 // Make the system idle 222 // Make the system idle
229 BeginFrameForTest(); 223 BeginFrameForTest();
230 scheduler_->BeginFrameDeadlineForTest(); 224 scheduler_.BeginFrameDeadlineForTest();
231 BeginFrameForTest(); 225 BeginFrameForTest();
232 scheduler_->BeginFrameDeadlineForTest(); 226 scheduler_.BeginFrameDeadlineForTest();
233 227
234 // Deadline should trigger early if child surfaces are idle and 228 // Deadline should trigger early if child surfaces are idle and
235 // we get damage on the root surface. 229 // we get damage on the root surface.
236 BeginFrameForTest(); 230 BeginFrameForTest();
237 EXPECT_LT(now_src().NowTicks(), 231 EXPECT_LT(now_src().NowTicks(),
238 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 232 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
239 scheduler_->SurfaceDamaged(root_surface_id); 233 scheduler_.SurfaceDamaged(root_surface_id);
240 EXPECT_GE(now_src().NowTicks(), 234 EXPECT_GE(now_src().NowTicks(),
241 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 235 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
242 scheduler_->BeginFrameDeadlineForTest(); 236 scheduler_.BeginFrameDeadlineForTest();
243 } 237 }
244 238
245 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { 239 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
246 SurfaceId root_surface_id(0, 0, 0); 240 SurfaceId root_surface_id(0, 0, 0);
247 SurfaceId sid1(0, 1, 0); 241 SurfaceId sid1(0, 1, 0);
248 242
249 // Set the root surface 243 // Set the root surface
250 scheduler_->SetNewRootSurface(root_surface_id); 244 scheduler_.SetNewRootSurface(root_surface_id);
251 245
252 // DrawAndSwap normally. 246 // DrawAndSwap normally.
253 BeginFrameForTest(); 247 BeginFrameForTest();
254 EXPECT_LT(now_src().NowTicks(), 248 EXPECT_LT(now_src().NowTicks(),
255 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 249 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
256 EXPECT_EQ(0, client_->draw_and_swap_count()); 250 EXPECT_EQ(0, client_.draw_and_swap_count());
257 scheduler_->SurfaceDamaged(sid1); 251 scheduler_.SurfaceDamaged(sid1);
258 scheduler_->BeginFrameDeadlineForTest(); 252 scheduler_.BeginFrameDeadlineForTest();
259 EXPECT_EQ(1, client_->draw_and_swap_count()); 253 EXPECT_EQ(1, client_.draw_and_swap_count());
260 254
261 // Deadline triggers immediately on OutputSurfaceLost. 255 // Deadline triggers immediately on OutputSurfaceLost.
262 BeginFrameForTest(); 256 BeginFrameForTest();
263 EXPECT_LT(now_src().NowTicks(), 257 EXPECT_LT(now_src().NowTicks(),
264 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 258 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
265 scheduler_->OutputSurfaceLost(); 259 scheduler_.OutputSurfaceLost();
266 EXPECT_GE(now_src().NowTicks(), 260 EXPECT_GE(now_src().NowTicks(),
267 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 261 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
268 262
269 // Deadline does not DrawAndSwap after OutputSurfaceLost. 263 // Deadline does not DrawAndSwap after OutputSurfaceLost.
270 EXPECT_EQ(1, client_->draw_and_swap_count()); 264 EXPECT_EQ(1, client_.draw_and_swap_count());
271 scheduler_->SurfaceDamaged(sid1); 265 scheduler_.SurfaceDamaged(sid1);
272 scheduler_->BeginFrameDeadlineForTest(); 266 scheduler_.BeginFrameDeadlineForTest();
273 EXPECT_EQ(1, client_->draw_and_swap_count()); 267 EXPECT_EQ(1, client_.draw_and_swap_count());
274 } 268 }
275 269
276 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { 270 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
277 SurfaceId root_surface_id(0, 0, 0); 271 SurfaceId root_surface_id(0, 0, 0);
278 SurfaceId sid1(0, 1, 0); 272 SurfaceId sid1(0, 1, 0);
279 273
280 // Set the root surface 274 // Set the root surface
281 scheduler_->SetNewRootSurface(root_surface_id); 275 scheduler_.SetNewRootSurface(root_surface_id);
282 276
283 // DrawAndSwap normally. 277 // DrawAndSwap normally.
284 BeginFrameForTest(); 278 BeginFrameForTest();
285 EXPECT_LT(now_src().NowTicks(), 279 EXPECT_LT(now_src().NowTicks(),
286 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 280 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
287 EXPECT_EQ(0, client_->draw_and_swap_count()); 281 EXPECT_EQ(0, client_.draw_and_swap_count());
288 scheduler_->SurfaceDamaged(sid1); 282 scheduler_.SurfaceDamaged(sid1);
289 scheduler_->BeginFrameDeadlineForTest(); 283 scheduler_.BeginFrameDeadlineForTest();
290 EXPECT_EQ(1, client_->draw_and_swap_count()); 284 EXPECT_EQ(1, client_.draw_and_swap_count());
291 285
292 scheduler_->DisplayResized(); 286 scheduler_.DisplayResized();
293 BeginFrameForTest(); 287 BeginFrameForTest();
294 // DisplayResized should trigger a swap to happen. 288 // DisplayResized should trigger a swap to happen.
295 scheduler_->BeginFrameDeadlineForTest(); 289 scheduler_.BeginFrameDeadlineForTest();
296 EXPECT_EQ(2, client_->draw_and_swap_count()); 290 EXPECT_EQ(2, client_.draw_and_swap_count());
297 } 291 }
298 292
299 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { 293 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
300 SurfaceId root_surface_id(0, 0, 0); 294 SurfaceId root_surface_id(0, 0, 0);
301 SurfaceId sid1(0, 1, 0); 295 SurfaceId sid1(0, 1, 0);
302 base::TimeTicks late_deadline; 296 base::TimeTicks late_deadline;
303 297
304 // Set the root surface 298 // Set the root surface
305 scheduler_->SetNewRootSurface(root_surface_id); 299 scheduler_.SetNewRootSurface(root_surface_id);
306 300
307 // DrawAndSwap normally. 301 // DrawAndSwap normally.
308 BeginFrameForTest(); 302 BeginFrameForTest();
309 EXPECT_LT(now_src().NowTicks(), 303 EXPECT_LT(now_src().NowTicks(),
310 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 304 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
311 EXPECT_EQ(0, client_->draw_and_swap_count()); 305 EXPECT_EQ(0, client_.draw_and_swap_count());
312 scheduler_->SurfaceDamaged(sid1); 306 scheduler_.SurfaceDamaged(sid1);
313 scheduler_->BeginFrameDeadlineForTest(); 307 scheduler_.BeginFrameDeadlineForTest();
314 EXPECT_EQ(1, client_->draw_and_swap_count()); 308 EXPECT_EQ(1, client_.draw_and_swap_count());
315 309
316 // Deadline triggers late while root resources are locked. 310 // Deadline triggers late while root resources are locked.
317 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 311 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
318 BeginFrameForTest(); 312 BeginFrameForTest();
319 scheduler_->SurfaceDamaged(sid1); 313 scheduler_.SurfaceDamaged(sid1);
320 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 314 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
321 scheduler_->SetRootSurfaceResourcesLocked(true); 315 scheduler_.SetRootSurfaceResourcesLocked(true);
322 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 316 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
323 317
324 // Deadline does not DrawAndSwap while root resources are locked. 318 // Deadline does not DrawAndSwap while root resources are locked.
325 EXPECT_EQ(1, client_->draw_and_swap_count()); 319 EXPECT_EQ(1, client_.draw_and_swap_count());
326 scheduler_->SurfaceDamaged(sid1); 320 scheduler_.SurfaceDamaged(sid1);
327 scheduler_->BeginFrameDeadlineForTest(); 321 scheduler_.BeginFrameDeadlineForTest();
328 EXPECT_EQ(1, client_->draw_and_swap_count()); 322 EXPECT_EQ(1, client_.draw_and_swap_count());
329 323
330 // Deadline triggers normally when root resources are unlocked. 324 // Deadline triggers normally when root resources are unlocked.
331 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 325 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
332 BeginFrameForTest(); 326 BeginFrameForTest();
333 scheduler_->SurfaceDamaged(sid1); 327 scheduler_.SurfaceDamaged(sid1);
334 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 328 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
335 scheduler_->SetRootSurfaceResourcesLocked(false); 329 scheduler_.SetRootSurfaceResourcesLocked(false);
336 scheduler_->SurfaceDamaged(root_surface_id); 330 scheduler_.SurfaceDamaged(root_surface_id);
337 EXPECT_EQ(base::TimeTicks(), 331 EXPECT_EQ(base::TimeTicks(),
338 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 332 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
339 333
340 EXPECT_EQ(1, client_->draw_and_swap_count()); 334 EXPECT_EQ(1, client_.draw_and_swap_count());
341 scheduler_->BeginFrameDeadlineForTest(); 335 scheduler_.BeginFrameDeadlineForTest();
342 EXPECT_EQ(2, client_->draw_and_swap_count()); 336 EXPECT_EQ(2, client_.draw_and_swap_count());
343 } 337 }
344 338
345 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { 339 TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
346 SurfaceId root_surface_id(0, 0, 0); 340 SurfaceId root_surface_id(0, 0, 0);
347 SurfaceId sid1(0, 1, 0); 341 SurfaceId sid1(0, 1, 0);
348 SurfaceId sid2(0, 2, 0); 342 SurfaceId sid2(0, 2, 0);
349 343
350 // Set the root surface 344 // Set the root surface
351 scheduler_->SetNewRootSurface(root_surface_id); 345 scheduler_.SetNewRootSurface(root_surface_id);
352 346
353 // Get scheduler to detect surface 1 and 2 as active. 347 // Get scheduler to detect surface 1 and 2 as active.
354 BeginFrameForTest(); 348 BeginFrameForTest();
355 scheduler_->SurfaceDamaged(sid1); 349 scheduler_.SurfaceDamaged(sid1);
356 scheduler_->SurfaceDamaged(sid2); 350 scheduler_.SurfaceDamaged(sid2);
357 scheduler_->BeginFrameDeadlineForTest(); 351 scheduler_.BeginFrameDeadlineForTest();
358 BeginFrameForTest(); 352 BeginFrameForTest();
359 scheduler_->SurfaceDamaged(sid1); 353 scheduler_.SurfaceDamaged(sid1);
360 scheduler_->SurfaceDamaged(sid2); 354 scheduler_.SurfaceDamaged(sid2);
361 scheduler_->BeginFrameDeadlineForTest(); 355 scheduler_.BeginFrameDeadlineForTest();
362 356
363 // DrawAndSwap normally. 357 // DrawAndSwap normally.
364 BeginFrameForTest(); 358 BeginFrameForTest();
365 EXPECT_LT(now_src().NowTicks(), 359 EXPECT_LT(now_src().NowTicks(),
366 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 360 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
367 EXPECT_EQ(2, client_->draw_and_swap_count()); 361 EXPECT_EQ(2, client_.draw_and_swap_count());
368 scheduler_->SurfaceDamaged(sid1); 362 scheduler_.SurfaceDamaged(sid1);
369 scheduler_->SurfaceDamaged(sid2); 363 scheduler_.SurfaceDamaged(sid2);
370 scheduler_->BeginFrameDeadlineForTest(); 364 scheduler_.BeginFrameDeadlineForTest();
371 EXPECT_EQ(3, client_->draw_and_swap_count()); 365 EXPECT_EQ(3, client_.draw_and_swap_count());
372 scheduler_->DidSwapBuffers(); 366 scheduler_.DidSwapBuffers();
373 367
374 // Deadline triggers late when swap throttled. 368 // Deadline triggers late when swap throttled.
375 base::TimeTicks late_deadline = 369 base::TimeTicks late_deadline =
376 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 370 now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
377 BeginFrameForTest(); 371 BeginFrameForTest();
378 // Damage surface 1, but not surface 2 so we avoid triggering deadline 372 // Damage surface 1, but not surface 2 so we avoid triggering deadline
379 // early because all surfaces are ready. 373 // early because all surfaces are ready.
380 scheduler_->SurfaceDamaged(sid1); 374 scheduler_.SurfaceDamaged(sid1);
381 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 375 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
382 376
383 // Don't draw and swap in deadline while swap throttled. 377 // Don't draw and swap in deadline while swap throttled.
384 EXPECT_EQ(3, client_->draw_and_swap_count()); 378 EXPECT_EQ(3, client_.draw_and_swap_count());
385 scheduler_->BeginFrameDeadlineForTest(); 379 scheduler_.BeginFrameDeadlineForTest();
386 EXPECT_EQ(3, client_->draw_and_swap_count()); 380 EXPECT_EQ(3, client_.draw_and_swap_count());
387 381
388 // Deadline triggers normally once not swap throttled. 382 // Deadline triggers normally once not swap throttled.
389 // Damage from previous BeginFrame should cary over, so don't damage again. 383 // Damage from previous BeginFrame should cary over, so don't damage again.
390 base::TimeTicks expected_deadline = 384 base::TimeTicks expected_deadline =
391 scheduler_->LastUsedBeginFrameArgs().deadline - 385 scheduler_.LastUsedBeginFrameArgs().deadline -
392 BeginFrameArgs::DefaultEstimatedParentDrawTime(); 386 BeginFrameArgs::DefaultEstimatedParentDrawTime();
393 scheduler_->DidSwapBuffersComplete(); 387 scheduler_.DidSwapBuffersComplete();
394 BeginFrameForTest(); 388 BeginFrameForTest();
395 EXPECT_EQ(expected_deadline, 389 EXPECT_EQ(expected_deadline,
396 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); 390 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
397 // Still waiting for surface 2. Once it updates, deadline should trigger 391 // Still waiting for surface 2. Once it updates, deadline should trigger
398 // immediately again. 392 // immediately again.
399 scheduler_->SurfaceDamaged(sid2); 393 scheduler_.SurfaceDamaged(sid2);
400 EXPECT_EQ(scheduler_->DesiredBeginFrameDeadlineTimeForTest(), 394 EXPECT_EQ(scheduler_.DesiredBeginFrameDeadlineTimeForTest(),
401 base::TimeTicks()); 395 base::TimeTicks());
402 // Draw and swap now that we aren't throttled. 396 // Draw and swap now that we aren't throttled.
403 EXPECT_EQ(3, client_->draw_and_swap_count()); 397 EXPECT_EQ(3, client_.draw_and_swap_count());
404 scheduler_->BeginFrameDeadlineForTest(); 398 scheduler_.BeginFrameDeadlineForTest();
405 EXPECT_EQ(4, client_->draw_and_swap_count()); 399 EXPECT_EQ(4, client_.draw_and_swap_count());
406 } 400 }
407 401
408 // This test verfies that we try to reschedule the deadline 402 // This test verfies that we try to reschedule the deadline
409 // after any event that may change what deadline we want. 403 // after any event that may change what deadline we want.
410 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { 404 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) {
411 SurfaceId root_surface_id(0, 1, 0); 405 SurfaceId root_surface_id(0, 1, 0);
412 SurfaceId sid1(0, 2, 0); 406 SurfaceId sid1(0, 2, 0);
413 int count = 1; 407 int count = 1;
414 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 408 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
415 409
416 // Set the root surface 410 // Set the root surface
417 scheduler_->SetNewRootSurface(root_surface_id); 411 scheduler_.SetNewRootSurface(root_surface_id);
418 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 412 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
419 413
420 BeginFrameForTest(); 414 BeginFrameForTest();
421 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 415 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
422 416
423 scheduler_->BeginFrameDeadlineForTest(); 417 scheduler_.BeginFrameDeadlineForTest();
424 scheduler_->DidSwapBuffers(); 418 scheduler_.DidSwapBuffers();
425 BeginFrameForTest(); 419 BeginFrameForTest();
426 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 420 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
427 421
428 scheduler_->DidSwapBuffersComplete(); 422 scheduler_.DidSwapBuffersComplete();
429 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 423 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
430 424
431 scheduler_->DisplayResized(); 425 scheduler_.DisplayResized();
432 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 426 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
433 427
434 scheduler_->SetNewRootSurface(root_surface_id); 428 scheduler_.SetNewRootSurface(root_surface_id);
435 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 429 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
436 430
437 scheduler_->SurfaceDamaged(sid1); 431 scheduler_.SurfaceDamaged(sid1);
438 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 432 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
439 433
440 scheduler_->SetRootSurfaceResourcesLocked(true); 434 scheduler_.SetRootSurfaceResourcesLocked(true);
441 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 435 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
442 436
443 scheduler_->OutputSurfaceLost(); 437 scheduler_.OutputSurfaceLost();
444 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); 438 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count());
445 } 439 }
446 440
447 } // namespace 441 } // namespace
448 } // namespace cc 442 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/display_scheduler.cc ('k') | cc/surfaces/display_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698