161 size_t presents_called = 0u;
162 zx_handle_t release_fence_handle;
163 fake_flatland().SetPresentHandler([&presents_called,
164 &release_fence_handle](
auto present_args) {
166 release_fence_handle = present_args.release_fences().
empty()
168 : present_args.release_fences().front().get();
173 size_t vsyncs_handled = 0u;
181 GetCurrentTestName(), TakeFlatlandHandle(), []() {
FAIL(); },
182 std::move(on_frame_presented));
183 EXPECT_EQ(presents_called, 0u);
184 EXPECT_EQ(vsyncs_handled, 0u);
187 loop().RunUntilIdle();
188 EXPECT_EQ(presents_called, 0u);
189 EXPECT_EQ(vsyncs_handled, 0u);
192 bool await_vsync_fired =
false;
193 AwaitVsyncChecked(flatland_connection, await_vsync_fired,
199 await_vsync_fired =
false;
200 zx::event first_release_fence;
201 zx::event::create(0, &first_release_fence);
202 const zx_handle_t first_release_fence_handle = first_release_fence.get();
203 flatland_connection.EnqueueReleaseFence(std::move(first_release_fence));
204 flatland_connection.Present();
205 loop().RunUntilIdle();
206 EXPECT_EQ(presents_called, 1u);
207 EXPECT_EQ(release_fence_handle, ZX_HANDLE_INVALID);
208 EXPECT_EQ(vsyncs_handled, 0u);
209 EXPECT_FALSE(await_vsync_fired);
215 fuchsia::ui::composition::OnNextFrameBeginValues on_next_frame_begin_values;
216 on_next_frame_begin_values.set_additional_present_credits(3);
217 on_next_frame_begin_values.set_future_presentation_infos(
218 CreateFuturePresentationInfos(kPresentationTime1, kPresentationTime2));
219 fake_flatland().FireOnNextFrameBeginEvent(
220 std::move(on_next_frame_begin_values));
221 loop().RunUntilIdle();
222 AwaitVsyncChecked(flatland_connection, await_vsync_fired, kPresentationTime1);
226 fake_flatland().FireOnFramePresentedEvent(
227 fuchsia::scenic::scheduling::FramePresentedInfo());
228 loop().RunUntilIdle();
229 EXPECT_EQ(vsyncs_handled, 1u);
233 await_vsync_fired =
false;
234 flatland_connection.Present();
235 loop().RunUntilIdle();
236 EXPECT_EQ(presents_called, 2u);
237 EXPECT_EQ(release_fence_handle, first_release_fence_handle);
240 await_vsync_fired =
false;
241 AwaitVsyncChecked(flatland_connection, await_vsync_fired, kPresentationTime2);
247 size_t presents_called = 0u;
248 fake_flatland().SetPresentHandler(
249 [&presents_called](
auto present_args) { presents_called++; });
254 GetCurrentTestName(), TakeFlatlandHandle(), []() {
FAIL(); },
256 EXPECT_EQ(presents_called, 0u);
259 loop().RunUntilIdle();
260 EXPECT_EQ(presents_called, 0u);
263 bool await_vsync_callback_fired =
false;
264 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
269 bool await_vsync_secondary_callback_fired =
false;
270 flatland_connection.AwaitVsyncForSecondaryCallback(
271 [&await_vsync_secondary_callback_fired](
fml::TimePoint frame_start,
273 await_vsync_secondary_callback_fired =
true;
280 size_t presents_called = 0u;
281 fake_flatland().SetPresentHandler(
282 [&presents_called](
auto present_args) { presents_called++; });
286 size_t vsyncs_handled = 0u;
294 GetCurrentTestName(), TakeFlatlandHandle(), []() {
FAIL(); },
295 std::move(on_frame_presented));
296 EXPECT_EQ(presents_called, 0u);
297 EXPECT_EQ(vsyncs_handled, 0u);
300 loop().RunUntilIdle();
301 EXPECT_EQ(presents_called, 0u);
302 EXPECT_EQ(vsyncs_handled, 0u);
305 bool await_vsync_callback_fired =
false;
306 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
311 flatland_connection.Present();
312 loop().RunUntilIdle();
313 EXPECT_EQ(presents_called, 1u);
317 await_vsync_callback_fired =
false;
318 const auto kPresentationTime1 =
321 const auto kPresentationTime2 = kPresentationTime1 + kVsyncInterval;
322 OnNextFrameBegin(1, kPresentationTime1, kPresentationTime2);
323 loop().RunUntilIdle();
324 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
330 await_vsync_callback_fired =
false;
331 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
336 await_vsync_callback_fired =
false;
337 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
338 kPresentationTime2 + kVsyncInterval);
344 size_t num_presents_called = 0u;
345 size_t num_release_fences = 0u;
346 size_t num_acquire_fences = 0u;
348 auto reset_test_counters = [&num_presents_called, &num_acquire_fences,
349 &num_release_fences]() {
350 num_presents_called = 0u;
351 num_release_fences = 0u;
352 num_acquire_fences = 0u;
355 fake_flatland().SetPresentHandler(
356 [&num_presents_called, &num_acquire_fences, &num_release_fences](
357 fuchsia::ui::composition::PresentArgs present_args) {
358 num_presents_called++;
359 num_acquire_fences = present_args.acquire_fences().size();
360 num_release_fences = present_args.release_fences().size();
367 GetCurrentTestName(), TakeFlatlandHandle(), []() {
FAIL(); },
368 std::move(on_frame_presented));
369 EXPECT_EQ(num_presents_called, 0u);
372 loop().RunUntilIdle();
373 EXPECT_EQ(num_presents_called, 0u);
377 loop().RunUntilIdle();
378 EXPECT_EQ(num_presents_called, 0u);
383 auto fire_callback = [dispatcher = loop().dispatcher(), &flatland_connection](
386 async::PostTask(dispatcher, [&flatland_connection]() {
387 zx::event acquire_fence;
388 zx::event::create(0, &acquire_fence);
389 zx::event release_fence;
390 zx::event::create(0, &release_fence);
391 flatland_connection.EnqueueAcquireFence(std::move(acquire_fence));
392 flatland_connection.EnqueueReleaseFence(std::move(release_fence));
393 flatland_connection.Present();
399 reset_test_counters();
400 flatland_connection.AwaitVsync(fire_callback);
401 loop().RunUntilIdle();
402 EXPECT_EQ(num_presents_called, 1u);
403 EXPECT_EQ(num_acquire_fences, 1u);
404 EXPECT_EQ(num_release_fences, 0u);
408 reset_test_counters();
409 flatland_connection.AwaitVsync(fire_callback);
411 loop().RunUntilIdle();
412 EXPECT_EQ(num_presents_called, 0u);
416 reset_test_counters();
418 loop().RunUntilIdle();
419 EXPECT_EQ(num_presents_called, 1u);
420 EXPECT_EQ(num_acquire_fences, 1u);
421 EXPECT_EQ(num_release_fences, 1u);
429 uint num_deferred_callbacks = 0;
434 num_deferred_callbacks++;
435 if (num_deferred_callbacks > num_onfb) {
437 for (uint i = 0; i < num_onfb + 1; i++) {
438 fire_callback(now, now);
439 num_deferred_callbacks--;
444 reset_test_counters();
445 for (uint i = 0; i < num_onfb; i++) {
446 flatland_connection.AwaitVsync(accumulating_fire_callback);
450 OnNextFrameBegin(i == 0 ? 1 : 0);
451 loop().RunUntilIdle();
452 EXPECT_EQ(num_presents_called, 0u);
458 flatland_connection.AwaitVsync(accumulating_fire_callback);
460 loop().RunUntilIdle();
461 EXPECT_EQ(num_presents_called, 1u);
462 EXPECT_EQ(num_acquire_fences, 1u);
463 EXPECT_EQ(num_release_fences, 1u);
468 reset_test_counters();
471 loop().RunUntilIdle();
472 EXPECT_EQ(num_presents_called, 1u);
473 EXPECT_EQ(num_acquire_fences, num_onfb);
474 EXPECT_EQ(num_release_fences, 1u);
477 reset_test_counters();
478 flatland_connection.AwaitVsync(fire_callback);
480 loop().RunUntilIdle();
481 EXPECT_EQ(num_presents_called, 1u);
482 EXPECT_EQ(num_acquire_fences, 1u);
483 EXPECT_EQ(num_release_fences, num_onfb);
#define FAIL(name, result)