| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index 1049445fa7f0a331cdac6d95d20dd391e2679ca3..cbaf2768d5c7db9ef0457099ea874e28dcba81a4 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -72,6 +72,7 @@ class FakeSchedulerClient : public SchedulerClient,
|
| swap_will_happen_if_draw_happens_ = true;
|
| num_draws_ = 0;
|
| last_begin_main_frame_args_ = BeginFrameArgs();
|
| + last_begin_frame_ack_ = BeginFrameAck();
|
| }
|
|
|
| void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; }
|
| @@ -123,7 +124,9 @@ class FakeSchedulerClient : public SchedulerClient,
|
| EXPECT_TRUE(inside_begin_impl_frame_);
|
| inside_begin_impl_frame_ = false;
|
| }
|
| - void DidNotProduceFrame(const BeginFrameAck& ack) override {}
|
| + void DidNotProduceFrame(const BeginFrameAck& ack) override {
|
| + last_begin_frame_ack_ = ack;
|
| + }
|
|
|
| void ScheduledActionSendBeginMainFrame(const BeginFrameArgs& args) override {
|
| PushAction("ScheduledActionSendBeginMainFrame");
|
| @@ -134,6 +137,8 @@ class FakeSchedulerClient : public SchedulerClient,
|
| return last_begin_main_frame_args_;
|
| }
|
|
|
| + const BeginFrameAck& last_begin_frame_ack() { return last_begin_frame_ack_; }
|
| +
|
| DrawResult ScheduledActionDrawIfPossible() override {
|
| PushAction("ScheduledActionDrawIfPossible");
|
| num_draws_++;
|
| @@ -142,6 +147,7 @@ class FakeSchedulerClient : public SchedulerClient,
|
| bool swap_will_happen =
|
| draw_will_happen_ && swap_will_happen_if_draw_happens_;
|
| if (swap_will_happen) {
|
| + last_begin_frame_ack_ = scheduler_->CurrentBeginFrameAckForActiveTree();
|
| scheduler_->DidSubmitCompositorFrame();
|
|
|
| if (automatic_ack_)
|
| @@ -151,6 +157,7 @@ class FakeSchedulerClient : public SchedulerClient,
|
| }
|
| DrawResult ScheduledActionDrawForced() override {
|
| PushAction("ScheduledActionDrawForced");
|
| + last_begin_frame_ack_ = scheduler_->CurrentBeginFrameAckForActiveTree();
|
| return DRAW_SUCCESS;
|
| }
|
| void ScheduledActionCommit() override {
|
| @@ -228,6 +235,7 @@ class FakeSchedulerClient : public SchedulerClient,
|
| bool automatic_ack_;
|
| int num_draws_;
|
| BeginFrameArgs last_begin_main_frame_args_;
|
| + BeginFrameAck last_begin_frame_ack_;
|
| base::TimeTicks posted_begin_impl_frame_deadline_;
|
| std::vector<const char*> actions_;
|
| std::vector<std::unique_ptr<base::trace_event::ConvertableToTraceFormat>>
|
| @@ -389,6 +397,20 @@ class SchedulerTest : public testing::Test {
|
| }
|
|
|
| EXPECT_FALSE(scheduler_->begin_frames_expected());
|
| +
|
| + if (scheduler_->begin_frame_source() ==
|
| + fake_external_begin_frame_source_.get()) {
|
| + // Expect the last BeginFrameAck to be for last BeginFrame, which didn't
|
| + // cause damage.
|
| + uint64_t last_begin_frame_number =
|
| + fake_external_begin_frame_source_->next_begin_frame_number() - 1;
|
| + bool has_damage = false;
|
| + EXPECT_EQ(BeginFrameAck(fake_external_begin_frame_source_->source_id(),
|
| + last_begin_frame_number, last_begin_frame_number,
|
| + has_damage),
|
| + client_->last_begin_frame_ack());
|
| + }
|
| +
|
| client_->Reset();
|
| }
|
|
|
| @@ -2940,16 +2962,9 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) {
|
| scheduler_settings_.using_synchronous_renderer_compositor = true;
|
| SetUpScheduler(EXTERNAL_BFS);
|
|
|
| - // Expect the last ack to be for last BeginFrame, which didn't cause damage.
|
| - uint64_t last_begin_frame_number =
|
| + // The last BeginFrame was confirmed.
|
| + uint64_t latest_confirmed_sequence_number =
|
| fake_external_begin_frame_source_->next_begin_frame_number() - 1;
|
| - uint64_t latest_confirmed_sequence_number = last_begin_frame_number;
|
| - bool has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(fake_external_begin_frame_source_->source_id(),
|
| - last_begin_frame_number, latest_confirmed_sequence_number,
|
| - has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
|
|
| scheduler_->SetNeedsBeginMainFrame();
|
| EXPECT_SINGLE_ACTION("AddObserver(this)", client_);
|
| @@ -2960,13 +2975,12 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) {
|
| EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
|
| EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| - client_->Reset();
|
|
|
| - has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + bool has_damage = false;
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
|
|
| scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks());
|
| EXPECT_NO_ACTION(client_);
|
| @@ -2975,13 +2989,12 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) {
|
| args = SendNextBeginFrame();
|
| EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| - client_->Reset();
|
|
|
| has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
|
|
| scheduler_->NotifyReadyToCommit();
|
| EXPECT_ACTION("ScheduledActionCommit", client_, 0, 1);
|
| @@ -2997,17 +3010,16 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) {
|
| EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 3);
|
| EXPECT_ACTION("ScheduledActionBeginMainFrameNotExpectedUntil", client_, 2, 3);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| - client_->Reset();
|
|
|
| // Not confirmed yet and no damage, since not drawn yet.
|
| // TODO(eseckler): In the future, |has_damage = false| will prevent us from
|
| // filtering this ack (in CompositorExternalBeginFrameSource) and instead
|
| // forwarding the one attached to the later submitted CompositorFrame.
|
| has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
|
|
| // Android onDraw.
|
| scheduler_->SetNeedsRedraw();
|
| @@ -3024,14 +3036,13 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) {
|
| EXPECT_ACTION("RemoveObserver(this)", client_, 2, 4);
|
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 3, 4);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| - client_->Reset();
|
|
|
| latest_confirmed_sequence_number = args.sequence_number;
|
| has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest, SynchronousCompositorDoubleCommitWithoutDraw) {
|
| @@ -3465,16 +3476,9 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) {
|
| // Sets up scheduler and sends two BeginFrames, both finished.
|
| SetUpScheduler(EXTERNAL_BFS);
|
|
|
| - // Expect the last ack to be for last BeginFrame, which didn't cause damage.
|
| - uint64_t last_begin_frame_number =
|
| + // The last BeginFrame was confirmed.
|
| + uint64_t latest_confirmed_sequence_number =
|
| fake_external_begin_frame_source_->next_begin_frame_number() - 1;
|
| - uint64_t latest_confirmed_sequence_number = last_begin_frame_number;
|
| - bool has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(fake_external_begin_frame_source_->source_id(),
|
| - last_begin_frame_number, latest_confirmed_sequence_number,
|
| - has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
|
|
| // Run a successful redraw and verify that a new ack is sent.
|
| scheduler_->SetNeedsRedraw();
|
| @@ -3492,15 +3496,14 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) {
|
| EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| EXPECT_TRUE(scheduler_->begin_frames_expected());
|
| - client_->Reset();
|
|
|
| // Successful draw caused damage.
|
| latest_confirmed_sequence_number = args.sequence_number;
|
| - has_damage = true;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + bool has_damage = true;
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
|
|
| // Request another redraw, but fail it. Verify that a new ack is sent, but
|
| // that its |latest_confirmed_sequence_number| didn't change.
|
| @@ -3522,14 +3525,13 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) {
|
| EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| EXPECT_TRUE(scheduler_->begin_frames_expected());
|
| - client_->Reset();
|
|
|
| // Failed draw: no damage and unconfirmed frame.
|
| has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) {
|
| @@ -3555,15 +3557,14 @@ TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) {
|
| EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| EXPECT_TRUE(scheduler_->begin_frames_expected());
|
| - client_->Reset();
|
|
|
| // Successful draw caused damage.
|
| uint64_t latest_confirmed_sequence_number = args.sequence_number;
|
| bool has_damage = true;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
|
|
| // Request another redraw that will be skipped because the swap ack is still
|
| // missing. Verify that a new BeginFrameAck is sent.
|
| @@ -3575,14 +3576,13 @@ TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) {
|
| EXPECT_NO_ACTION(client_);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| EXPECT_TRUE(scheduler_->begin_frames_expected());
|
| - client_->Reset();
|
|
|
| // Skipped draw: no damage and unconfirmed frame.
|
| has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest, BeginFrameAckForBeginFrameBeforeLastDeadline) {
|
| @@ -3610,17 +3610,16 @@ TEST_F(SchedulerTest, BeginFrameAckForBeginFrameBeforeLastDeadline) {
|
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| EXPECT_FALSE(scheduler_->begin_frames_expected());
|
| - client_->Reset();
|
|
|
| // Latest ack should be for the dropped BeginFrame. Since we don't have
|
| // further updates, its |latest_confirmed_sequence_number| should be for the
|
| // dropped BeginFrame, too.
|
| uint64_t latest_confirmed_sequence_number = args.sequence_number;
|
| bool has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest, BeginFrameAckForDroppedBeginFrame) {
|
| @@ -3651,27 +3650,25 @@ TEST_F(SchedulerTest, BeginFrameAckForDroppedBeginFrame) {
|
| // not expecting any BeginFrames.
|
| BeginFrameArgs second_args = SendNextBeginFrame();
|
| EXPECT_NO_ACTION(client_);
|
| - client_->Reset();
|
|
|
| // Latest ack should be for the dropped (and unconfirmed) BeginFrame.
|
| bool has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(second_args.source_id, second_args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(second_args.source_id, second_args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
|
|
| task_runner().RunPendingTasks(); // Run deadline of prior BeginFrame.
|
| EXPECT_ACTION("RemoveObserver(this)", client_, 0, 2);
|
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2);
|
| - client_->Reset();
|
|
|
| // We'd expect an out-of-order ack for the prior BeginFrame, confirming it.
|
| latest_confirmed_sequence_number = first_args.sequence_number;
|
| has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(first_args.source_id, first_args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(first_args.source_id, first_args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest, BeginFrameAckForLateMissedBeginFrame) {
|
| @@ -3695,15 +3692,14 @@ TEST_F(SchedulerTest, BeginFrameAckForLateMissedBeginFrame) {
|
|
|
| EXPECT_NO_ACTION(client_);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| - client_->Reset();
|
|
|
| // Latest ack should be for the missed BeginFrame that was too late: no damage
|
| // and unconfirmed frame.
|
| bool has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest, BeginFrameAckForFinishedBeginFrameWithNewSourceId) {
|
| @@ -3729,15 +3725,14 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedBeginFrameWithNewSourceId) {
|
| EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| EXPECT_TRUE(scheduler_->begin_frames_expected());
|
| - client_->Reset();
|
|
|
| // Successful draw caused damage.
|
| uint64_t latest_confirmed_sequence_number = args.sequence_number;
|
| bool has_damage = true;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| TEST_F(SchedulerTest,
|
| @@ -3759,7 +3754,6 @@ TEST_F(SchedulerTest,
|
|
|
| EXPECT_NO_ACTION(client_);
|
| EXPECT_FALSE(client_->IsInsideBeginImplFrame());
|
| - client_->Reset();
|
|
|
| // Latest ack should be for the missed BeginFrame that was too late: no damage
|
| // and unconfirmed frame. Because the source_id changed, the
|
| @@ -3767,10 +3761,10 @@ TEST_F(SchedulerTest,
|
| uint64_t latest_confirmed_sequence_number =
|
| BeginFrameArgs::kInvalidFrameNumber;
|
| bool has_damage = false;
|
| - EXPECT_EQ(
|
| - BeginFrameAck(args.source_id, args.sequence_number,
|
| - latest_confirmed_sequence_number, has_damage),
|
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
|
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number,
|
| + latest_confirmed_sequence_number, has_damage),
|
| + client_->last_begin_frame_ack());
|
| + client_->Reset();
|
| }
|
|
|
| } // namespace
|
|
|