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

Unified Diff: cc/surfaces/display_scheduler_unittest.cc

Issue 2591013004: [cc] Add and use BeginFrameAck for DidFinishFrame. (Closed)
Patch Set: remove ipc struct traits for BeginFrameAck. Created 3 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/surfaces/display_scheduler.cc ('k') | cc/test/fake_external_begin_frame_source.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/surfaces/display_scheduler_unittest.cc
diff --git a/cc/surfaces/display_scheduler_unittest.cc b/cc/surfaces/display_scheduler_unittest.cc
index c7b5bd81802681d0c567ca61e6b31e969a7026f0..a5a053d8415796047f1dce8ea1a44e890dedb605 100644
--- a/cc/surfaces/display_scheduler_unittest.cc
+++ b/cc/surfaces/display_scheduler_unittest.cc
@@ -54,7 +54,13 @@ class TestDisplayScheduler : public DisplayScheduler {
return DesiredBeginFrameDeadlineTime();
}
- void BeginFrameDeadlineForTest() { OnBeginFrameDeadline(); }
+ void BeginFrameDeadlineForTest() {
+ // Ensure that any missed BeginFrames were handled by the scheduler. We need
+ // to run the scheduled task ourselves since the NullTaskRunner won't.
+ if (!missed_begin_frame_task_.IsCancelled())
+ missed_begin_frame_task_.callback().Run();
+ OnBeginFrameDeadline();
+ }
void ScheduleBeginFrameDeadline() override {
scheduler_begin_frame_deadline_count_++;
@@ -65,6 +71,10 @@ class TestDisplayScheduler : public DisplayScheduler {
return scheduler_begin_frame_deadline_count_;
}
+ bool inside_begin_frame_deadline_interval() {
+ return inside_begin_frame_deadline_interval_;
+ }
+
protected:
int scheduler_begin_frame_deadline_count_;
};
@@ -85,7 +95,8 @@ class DisplaySchedulerTest : public testing::Test {
void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); }
- void BeginFrameForTest() {
+ void AdvanceTimeAndBeginFrameForTest() {
+ now_src_.Advance(base::TimeDelta::FromMicroseconds(10000));
base::TimeTicks frame_time = now_src_.NowTicks();
base::TimeDelta interval = BeginFrameArgs::DefaultInterval();
base::TimeTicks deadline = frame_time + interval;
@@ -120,14 +131,14 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
scheduler_.SetVisible(true);
// Go trough an initial BeginFrame cycle with the root surface.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SetNewRootSurface(root_surface_id1);
scheduler_.BeginFrameDeadlineForTest();
// Resize on the next begin frame cycle should cause the deadline to wait
// for a new root surface.
+ AdvanceTimeAndBeginFrameForTest();
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.DisplayResized();
@@ -139,7 +150,7 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
// Verify deadline goes back to normal after resize.
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.SurfaceDamaged(root_surface_id2);
@@ -158,14 +169,14 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
scheduler_.SetVisible(true);
// Go trough an initial BeginFrame cycle with the root surface.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SetNewRootSurface(root_surface_id);
scheduler_.BeginFrameDeadlineForTest();
// Resize on the next begin frame cycle should cause the deadline to wait
// for a new root surface.
+ AdvanceTimeAndBeginFrameForTest();
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.DisplayResized();
@@ -176,8 +187,8 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
scheduler_.BeginFrameDeadlineForTest();
// Verify deadline goes back to normal after resize.
+ AdvanceTimeAndBeginFrameForTest();
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.SurfaceDamaged(root_surface_id);
@@ -201,15 +212,15 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
// Get scheduler to detect surface 1 as active by drawing
// two frames in a row with damage from surface 1.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
scheduler_.BeginFrameDeadlineForTest();
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
scheduler_.BeginFrameDeadlineForTest();
// Damage only from surface 2 (inactive) does not trigger deadline early.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid2);
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
@@ -221,13 +232,13 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
scheduler_.BeginFrameDeadlineForTest();
// Make both surface 1 and 2 active.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid2);
scheduler_.SurfaceDamaged(sid1);
scheduler_.BeginFrameDeadlineForTest();
// Deadline doesn't trigger early until surface 1 and 2 are both damaged.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.SurfaceDamaged(sid1);
@@ -239,16 +250,15 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
scheduler_.BeginFrameDeadlineForTest();
// Make the system idle
- BeginFrameForTest();
- scheduler_.BeginFrameDeadlineForTest();
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.BeginFrameDeadlineForTest();
+ AdvanceTimeAndBeginFrameForTest();
+ EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
// Deadline should trigger early if child surfaces are idle and
// we get damage on the root surface.
- BeginFrameForTest();
- EXPECT_LT(now_src().NowTicks(),
- scheduler_.DesiredBeginFrameDeadlineTimeForTest());
+ AdvanceTimeAndBeginFrameForTest();
+ EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
scheduler_.SurfaceDamaged(root_surface_id);
EXPECT_GE(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
@@ -267,7 +277,7 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
scheduler_.SetNewRootSurface(root_surface_id);
// DrawAndSwap normally.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
EXPECT_EQ(0, client_.draw_and_swap_count());
@@ -276,7 +286,7 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
EXPECT_EQ(1, client_.draw_and_swap_count());
// Deadline triggers immediately on OutputSurfaceLost.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.OutputSurfaceLost();
@@ -334,7 +344,7 @@ TEST_F(DisplaySchedulerTest, Visibility) {
EXPECT_EQ(1u, fake_begin_frame_source_.num_observers());
// DrawAndSwap normally.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
EXPECT_EQ(0, client_.draw_and_swap_count());
@@ -342,7 +352,7 @@ TEST_F(DisplaySchedulerTest, Visibility) {
scheduler_.BeginFrameDeadlineForTest();
EXPECT_EQ(1, client_.draw_and_swap_count());
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
@@ -386,7 +396,7 @@ TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
scheduler_.SetNewRootSurface(root_surface_id);
// DrawAndSwap normally.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
EXPECT_EQ(0, client_.draw_and_swap_count());
@@ -395,7 +405,7 @@ TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
EXPECT_EQ(1, client_.draw_and_swap_count());
scheduler_.DisplayResized();
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
// DisplayResized should trigger a swap to happen.
scheduler_.BeginFrameDeadlineForTest();
EXPECT_EQ(2, client_.draw_and_swap_count());
@@ -414,7 +424,7 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
scheduler_.SetNewRootSurface(root_surface_id);
// DrawAndSwap normally.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
EXPECT_EQ(0, client_.draw_and_swap_count());
@@ -423,8 +433,8 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
EXPECT_EQ(1, client_.draw_and_swap_count());
// Deadline triggers late while root resources are locked.
+ AdvanceTimeAndBeginFrameForTest();
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.SetRootSurfaceResourcesLocked(true);
@@ -437,8 +447,8 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
EXPECT_EQ(1, client_.draw_and_swap_count());
// Deadline triggers normally when root resources are unlocked.
+ AdvanceTimeAndBeginFrameForTest();
late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
scheduler_.SetRootSurfaceResourcesLocked(false);
@@ -465,17 +475,17 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
scheduler_.SetNewRootSurface(root_surface_id);
// Get scheduler to detect surface 1 and 2 as active.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
scheduler_.SurfaceDamaged(sid2);
scheduler_.BeginFrameDeadlineForTest();
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
scheduler_.SurfaceDamaged(sid1);
scheduler_.SurfaceDamaged(sid2);
scheduler_.BeginFrameDeadlineForTest();
// DrawAndSwap normally.
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_LT(now_src().NowTicks(),
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
EXPECT_EQ(2, client_.draw_and_swap_count());
@@ -486,9 +496,9 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
scheduler_.DidSwapBuffers();
// Deadline triggers late when swap throttled.
+ AdvanceTimeAndBeginFrameForTest();
base::TimeTicks late_deadline =
now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
- BeginFrameForTest();
// Damage surface 1, but not surface 2 so we avoid triggering deadline
// early because all surfaces are ready.
scheduler_.SurfaceDamaged(sid1);
@@ -501,11 +511,11 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
// Deadline triggers normally once not swap throttled.
// Damage from previous BeginFrame should cary over, so don't damage again.
+ scheduler_.DidReceiveSwapBuffersAck();
+ AdvanceTimeAndBeginFrameForTest();
base::TimeTicks expected_deadline =
scheduler_.LastUsedBeginFrameArgs().deadline -
BeginFrameArgs::DefaultEstimatedParentDrawTime();
- scheduler_.DidReceiveSwapBuffersAck();
- BeginFrameForTest();
EXPECT_EQ(expected_deadline,
scheduler_.DesiredBeginFrameDeadlineTimeForTest());
// Still waiting for surface 2. Once it updates, deadline should trigger
@@ -549,12 +559,12 @@ TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) {
scheduler_.SetNewRootSurface(root_surface_id);
EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
scheduler_.BeginFrameDeadlineForTest();
scheduler_.DidSwapBuffers();
- BeginFrameForTest();
+ AdvanceTimeAndBeginFrameForTest();
EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
scheduler_.DidReceiveSwapBuffersAck();
« no previous file with comments | « cc/surfaces/display_scheduler.cc ('k') | cc/test/fake_external_begin_frame_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698