126 const uintptr_t kWarmUpBaton = 0xFFFFFFFF;
129 CFTimeInterval timestamp;
130 CFTimeInterval targetTimestamp;
133 __block std::vector<Entry> entries;
136 initWithDisplayLink:displayLink
137 block:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp,
139 entries.push_back({timestamp, targetTimestamp, baton});
140 if (baton == kWarmUpBaton) {
144 CFRunLoopStop(CFRunLoopGetCurrent());
147 __block CFTimeInterval expectedStartUntil;
151 [waiter waitForVSync:kWarmUpBaton];
152 [[NSRunLoop currentRunLoop] performBlock:^{
153 expectedStartUntil = CACurrentMediaTime();
157 CFTimeInterval now = CACurrentMediaTime();
161 EXPECT_EQ(displayLink.
paused, YES);
163 [waiter waitForVSync:1];
166 [waiter waitForVSync:2];
171 [waiter waitForVSync:3];
176 EXPECT_FALSE(displayLink.
paused);
181 CFTimeInterval start = CACurrentMediaTime();
182 while (!displayLink.
paused) {
184 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.02, NO);
185 if (CACurrentMediaTime() - start > 1.0) {
189 ASSERT_TRUE(displayLink.
paused);
191 EXPECT_EQ(entries.size(),
size_t(4));
194 EXPECT_TRUE(entries[0].timestamp <= expectedStartUntil);
195 EXPECT_TRUE(entries[0].targetTimestamp <= expectedStartUntil);
196 EXPECT_EQ(entries[0].baton, kWarmUpBaton);
200 EXPECT_EQ(entries[1].baton,
size_t(1));
203 EXPECT_EQ(entries[2].baton,
size_t(2));
206 EXPECT_EQ(entries[3].baton,
size_t(3));