Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index 21e20ea9880c2eb3504157b3b5ec32a9cf962e16..a5d279bcefe1644f9c6733ade7ca836e11ffd9ea 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -39,8 +39,7 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
class FakeSchedulerClient : public SchedulerClient { |
public: |
- FakeSchedulerClient() |
- : needs_begin_impl_frame_(false), automatic_swap_ack_(true) { |
+ FakeSchedulerClient() : needs_begin_frame_(false), automatic_swap_ack_(true) { |
Reset(); |
} |
@@ -64,7 +63,7 @@ class FakeSchedulerClient : public SchedulerClient { |
void set_log_anticipated_draw_time_change(bool log) { |
log_anticipated_draw_time_change_ = log; |
} |
- bool needs_begin_impl_frame() { return needs_begin_impl_frame_; } |
+ bool needs_begin_frame() { return needs_begin_frame_; } |
int num_draws() const { return num_draws_; } |
int num_actions_() const { return static_cast<int>(actions_.size()); } |
const char* Action(int i) const { return actions_[i]; } |
@@ -100,7 +99,7 @@ class FakeSchedulerClient : public SchedulerClient { |
virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { |
actions_.push_back("SetNeedsBeginFrame"); |
states_.push_back(scheduler_->StateAsValue().release()); |
- needs_begin_impl_frame_ = enable; |
+ needs_begin_frame_ = enable; |
} |
virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { |
actions_.push_back("WillBeginImplFrame"); |
@@ -185,7 +184,7 @@ class FakeSchedulerClient : public SchedulerClient { |
virtual void DidBeginImplFrameDeadline() OVERRIDE {} |
protected: |
- bool needs_begin_impl_frame_; |
+ bool needs_begin_frame_; |
bool draw_will_happen_; |
bool swap_will_happen_if_draw_happens_; |
bool automatic_swap_ack_; |
@@ -200,12 +199,19 @@ class FakeSchedulerClient : public SchedulerClient { |
void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
FakeSchedulerClient* client) { |
+ bool client_initiates_begin_frame = |
+ scheduler->settings().begin_frame_scheduling_enabled && |
+ scheduler->settings().throttle_frame_production; |
+ |
scheduler->DidCreateAndInitializeOutputSurface(); |
scheduler->SetNeedsCommit(); |
scheduler->NotifyBeginMainFrameStarted(); |
scheduler->NotifyReadyToCommit(); |
// Go through the motions to draw the commit. |
- scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
+ if (client_initiates_begin_frame) |
+ scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
+ else |
+ client->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
// Run the posted deadline task. |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
@@ -214,7 +220,10 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
// We need another BeginImplFrame so Scheduler calls |
// SetNeedsBeginFrame(false). |
- scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
+ if (client_initiates_begin_frame) |
+ scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
+ else |
+ client->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
// Run the posted deadline task. |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
@@ -250,7 +259,7 @@ TEST(SchedulerTest, RequestCommit) { |
// SetNeedsCommit should begin the frame on the next BeginImplFrame. |
client.Reset(); |
scheduler->SetNeedsCommit(); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
client.Reset(); |
@@ -258,37 +267,35 @@ TEST(SchedulerTest, RequestCommit) { |
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
- // If we don't swap on the deadline, we need to request another |
- // BeginImplFrame. |
+ // If we don't swap on the deadline, we wait for the next BeginFrame. |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
+ EXPECT_EQ(0, client.num_actions_()); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// NotifyReadyToCommit should trigger the commit. |
scheduler->NotifyBeginMainFrameStarted(); |
scheduler->NotifyReadyToCommit(); |
EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// BeginImplFrame should prepare the draw. |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// BeginImplFrame deadline should draw. |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
@@ -300,7 +307,7 @@ TEST(SchedulerTest, RequestCommit) { |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
client.Reset(); |
} |
@@ -326,7 +333,7 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Now SetNeedsCommit again. Calling here means we need a second commit. |
@@ -341,13 +348,12 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
client.Reset(); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
// Because we just swapped, the Scheduler should also request the next |
// BeginImplFrame from the OutputSurface. |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Since another commit is needed, the next BeginImplFrame should initiate |
// the second commit. |
@@ -365,17 +371,16 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
client.Reset(); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// On the next BeginImplFrame, verify we go back to a quiescent state and |
// no longer request BeginImplFrames. |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
client.Reset(); |
} |
@@ -419,20 +424,20 @@ TEST(SchedulerTest, RequestRedrawInsideDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_EQ(1, client.num_draws()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
// swap. |
@@ -440,7 +445,7 @@ TEST(SchedulerTest, RequestRedrawInsideDraw) { |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
} |
// Test that requesting redraw inside a failed draw doesn't lose the request. |
@@ -458,7 +463,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// Fail the draw. |
@@ -470,7 +475,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
// request. |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Fail the draw again. |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
@@ -478,7 +483,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Draw successfully. |
client.SetDrawWillHappen(true); |
@@ -487,7 +492,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
EXPECT_EQ(3, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
} |
class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { |
@@ -536,11 +541,11 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { |
InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
client.Reset(); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
EXPECT_EQ(0, client.num_draws()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.SetNeedsCommitOnNextDraw(); |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
@@ -548,7 +553,7 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_EQ(1, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
scheduler->NotifyBeginMainFrameStarted(); |
scheduler->NotifyReadyToCommit(); |
@@ -558,7 +563,7 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { |
EXPECT_FALSE(scheduler->RedrawPending()); |
EXPECT_FALSE(scheduler->CommitPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
// swap. |
@@ -567,7 +572,7 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
EXPECT_FALSE(scheduler->CommitPending()); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
} |
// Tests that when a draw fails then the pending commit should not be dropped. |
@@ -585,7 +590,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// Fail the draw. |
@@ -597,7 +602,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
// request. |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Fail the draw again. |
scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
@@ -606,7 +611,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Draw successfully. |
client.SetDrawWillHappen(true); |
@@ -615,7 +620,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
EXPECT_EQ(3, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
} |
TEST(SchedulerTest, NoSwapWhenDrawFails) { |
@@ -630,7 +635,7 @@ TEST(SchedulerTest, NoSwapWhenDrawFails) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// Draw successfully, this starts a new frame. |
@@ -641,7 +646,7 @@ TEST(SchedulerTest, NoSwapWhenDrawFails) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Fail to draw, this should not start a frame. |
client.SetDrawWillHappen(false); |
@@ -724,7 +729,7 @@ TEST(SchedulerTest, ManageTiles) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
EXPECT_TRUE(scheduler->ManageTilesPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
@@ -753,7 +758,7 @@ TEST(SchedulerTest, ManageTiles) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
EXPECT_FALSE(scheduler->ManageTilesPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// We have no immediate actions to perform, so the BeginImplFrame should post |
@@ -785,15 +790,16 @@ TEST(SchedulerTest, ManageTiles) { |
client.Reset(); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
EXPECT_EQ(0, client.num_draws()); |
// Now trigger a ManageTiles outside of a draw. We will then need |
// a begin-frame for the ManageTiles, but we don't need a draw. |
client.Reset(); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
scheduler->SetNeedsManageTiles(); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_TRUE(scheduler->ManageTilesPending()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
@@ -1116,7 +1122,7 @@ TEST(SchedulerTest, PollForCommitCompletion) { |
} |
} |
-TEST(SchedulerTest, BeginRetroFrameBasic) { |
+TEST(SchedulerTest, BeginRetroFrame) { |
FakeSchedulerClient client; |
SchedulerSettings scheduler_settings; |
Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
@@ -1128,7 +1134,7 @@ TEST(SchedulerTest, BeginRetroFrameBasic) { |
// SetNeedsCommit should begin the frame on the next BeginImplFrame. |
client.Reset(); |
scheduler->SetNeedsCommit(); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
client.Reset(); |
@@ -1140,7 +1146,7 @@ TEST(SchedulerTest, BeginRetroFrameBasic) { |
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Queue BeginFrames while we are still handling the previous BeginFrame. |
@@ -1149,34 +1155,32 @@ TEST(SchedulerTest, BeginRetroFrameBasic) { |
args.frame_time += base::TimeDelta::FromSeconds(1); |
scheduler->BeginFrame(args); |
- // If we don't swap on the deadline, we need to request another |
- // BeginImplFrame. |
+ // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
+ EXPECT_EQ(0, client.num_actions_()); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// NotifyReadyToCommit should trigger the commit. |
scheduler->NotifyBeginMainFrameStarted(); |
scheduler->NotifyReadyToCommit(); |
EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// BeginImplFrame should prepare the draw. |
client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// BeginImplFrame deadline should draw. |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
@@ -1188,7 +1192,7 @@ TEST(SchedulerTest, BeginRetroFrameBasic) { |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
client.Reset(); |
} |
@@ -1208,7 +1212,7 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
// SetNeedsCommit should begin the frame on the next BeginImplFrame. |
client.Reset(); |
scheduler->SetNeedsCommit(); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
client.Reset(); |
@@ -1220,7 +1224,7 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Queue BeginFrame while we are still handling the previous BeginFrame. |
@@ -1235,15 +1239,14 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
scheduler->NotifyBeginMainFrameStarted(); |
scheduler->NotifyReadyToCommit(); |
EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Swapping will put us into a swap throttled state. |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// While swap throttled, BeginRetroFrames should trigger BeginImplFrames |
@@ -1252,7 +1255,7 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Queue BeginFrame while we are still handling the previous BeginFrame. |
@@ -1260,24 +1263,210 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
scheduler->BeginFrame(args); |
EXPECT_EQ(0, client.num_actions_()); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Take us out of a swap throttled state. |
scheduler->DidSwapBuffersComplete(); |
EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// BeginImplFrame deadline should draw. |
scheduler->SetNeedsRedraw(); |
client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
+ client.Reset(); |
+} |
+ |
+void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, |
+ bool throttle_frame_production) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings scheduler_settings; |
+ scheduler_settings.begin_frame_scheduling_enabled = |
+ begin_frame_scheduling_enabled; |
+ scheduler_settings.throttle_frame_production = throttle_frame_production; |
+ Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
+ scheduler->SetCanStart(); |
+ scheduler->SetVisible(true); |
+ scheduler->SetCanDraw(true); |
+ InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
+ |
+ // SetNeedsCommit should begin the frame on the next BeginImplFrame |
+ // without calling SetNeedsBeginFrame. |
+ client.Reset(); |
+ scheduler->SetNeedsCommit(); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ EXPECT_EQ(0, client.num_actions_()); |
+ client.Reset(); |
+ |
+ // When the client-driven BeginFrame are disabled, the scheduler posts it's |
+ // own BeginFrame tasks. |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // If we don't swap on the deadline, we wait for the next BeginFrame. |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_EQ(0, client.num_actions_()); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // NotifyReadyToCommit should trigger the commit. |
+ scheduler->NotifyBeginMainFrameStarted(); |
+ scheduler->NotifyReadyToCommit(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // BeginImplFrame should prepare the draw. |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // BeginImplFrame deadline should draw. |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
client.Reset(); |
+ |
+ // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
+ // to avoid excessive toggles. |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // Make sure SetNeedsBeginFrame isn't called on the client |
+ // when the BeginFrame is no longer needed. |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_EQ(0, client.num_actions_()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+} |
+ |
+TEST(SchedulerTest, SyntheticBeginFrames) { |
+ bool begin_frame_scheduling_enabled = false; |
+ bool throttle_frame_production = true; |
+ BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
+ throttle_frame_production); |
+} |
+ |
+TEST(SchedulerTest, VSyncThrottlingDisabled) { |
+ bool begin_frame_scheduling_enabled = true; |
+ bool throttle_frame_production = false; |
+ BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
+ throttle_frame_production); |
+} |
+ |
+TEST(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { |
+ bool begin_frame_scheduling_enabled = false; |
+ bool throttle_frame_production = false; |
+ BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
+ throttle_frame_production); |
+} |
+ |
+void BeginFramesNotFromClient_SwapThrottled(bool begin_frame_scheduling_enabled, |
+ bool throttle_frame_production) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings scheduler_settings; |
+ scheduler_settings.begin_frame_scheduling_enabled = |
+ begin_frame_scheduling_enabled; |
+ scheduler_settings.throttle_frame_production = throttle_frame_production; |
+ Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
+ scheduler->SetCanStart(); |
+ scheduler->SetVisible(true); |
+ scheduler->SetCanDraw(true); |
+ InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
+ |
+ // To test swap ack throttling, this test disables automatic swap acks. |
+ scheduler->SetMaxSwapsPending(1); |
+ client.SetAutomaticSwapAck(false); |
+ |
+ // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
+ client.Reset(); |
+ scheduler->SetNeedsCommit(); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ EXPECT_EQ(0, client.num_actions_()); |
+ client.Reset(); |
+ |
+ // Trigger the first BeginImplFrame and BeginMainFrame |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // NotifyReadyToCommit should trigger the pending commit and draw. |
+ scheduler->NotifyBeginMainFrameStarted(); |
+ scheduler->NotifyReadyToCommit(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // Swapping will put us into a swap throttled state. |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // While swap throttled, BeginFrames should trigger BeginImplFrames, |
+ // but not a BeginMainFrame or draw. |
+ scheduler->SetNeedsCommit(); |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // Take us out of a swap throttled state. |
+ scheduler->DidSwapBuffersComplete(); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+ |
+ // BeginImplFrame deadline should draw. |
+ scheduler->SetNeedsRedraw(); |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
+} |
+ |
+TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
+ bool begin_frame_scheduling_enabled = false; |
+ bool throttle_frame_production = true; |
+ BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
+ throttle_frame_production); |
+} |
+ |
+TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
+ bool begin_frame_scheduling_enabled = true; |
+ bool throttle_frame_production = false; |
+ BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
+ throttle_frame_production); |
+} |
+ |
+TEST(SchedulerTest, |
+ SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
+ bool begin_frame_scheduling_enabled = false; |
+ bool throttle_frame_production = false; |
+ BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
+ throttle_frame_production); |
} |
} // namespace |