| Index: cc/scheduler/scheduler_state_machine_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| deleted file mode 100644
|
| index 4c2c267a5a493ebbbe734017265f2af8b8f7325b..0000000000000000000000000000000000000000
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1850 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/scheduler/scheduler_state_machine.h"
|
| -
|
| -#include "base/trace_event/trace_event.h"
|
| -#include "cc/scheduler/scheduler.h"
|
| -#include "cc/test/begin_frame_args_test.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -// Macro to compare two enum values and get nice output.
|
| -// Without:
|
| -// Value of: actual() Actual: 7
|
| -// Expected: expected() Which is: 0
|
| -// With:
|
| -// Value of: actual() Actual: "ACTION_ANIMATE"
|
| -// Expected: expected() Which is: "ACTION_NONE"
|
| -#define EXPECT_ENUM_EQ(enum_tostring, expected, actual) \
|
| - EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \
|
| - SchedulerStateMachine::enum_tostring(actual))
|
| -
|
| -#define EXPECT_IMPL_FRAME_STATE(expected) \
|
| - EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \
|
| - state.begin_impl_frame_state()) \
|
| - << state.AsValue()->ToString()
|
| -
|
| -#define EXPECT_COMMIT_STATE(expected) \
|
| - EXPECT_ENUM_EQ(CommitStateToString, expected, state.CommitState())
|
| -
|
| -#define EXPECT_ACTION(expected) \
|
| - EXPECT_ENUM_EQ(ActionToString, expected, state.NextAction()) \
|
| - << state.AsValue()->ToString()
|
| -
|
| -#define EXPECT_ACTION_UPDATE_STATE(action) \
|
| - EXPECT_ACTION(action); \
|
| - if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE || \
|
| - action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) { \
|
| - EXPECT_IMPL_FRAME_STATE( \
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE); \
|
| - } \
|
| - state.UpdateState(action); \
|
| - if (action == SchedulerStateMachine::ACTION_NONE) { \
|
| - if (state.begin_impl_frame_state() == \
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \
|
| - state.OnBeginImplFrameDeadlinePending(); \
|
| - if (state.begin_impl_frame_state() == \
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) \
|
| - state.OnBeginImplFrameIdle(); \
|
| - }
|
| -
|
| -#define SET_UP_STATE(state) \
|
| - state.SetCanStart(); \
|
| - state.UpdateState(state.NextAction()); \
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); \
|
| - state.SetVisible(true); \
|
| - state.SetCanDraw(true);
|
| -
|
| -namespace cc {
|
| -
|
| -namespace {
|
| -
|
| -const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] =
|
| - {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME,
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, };
|
| -
|
| -const SchedulerStateMachine::CommitState all_commit_states[] = {
|
| - SchedulerStateMachine::COMMIT_STATE_IDLE,
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT,
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED,
|
| - SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT,
|
| - SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION,
|
| - SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW};
|
| -
|
| -// Exposes the protected state fields of the SchedulerStateMachine for testing
|
| -class StateMachine : public SchedulerStateMachine {
|
| - public:
|
| - explicit StateMachine(const SchedulerSettings& scheduler_settings)
|
| - : SchedulerStateMachine(scheduler_settings) {}
|
| -
|
| - void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
|
| - DidCreateAndInitializeOutputSurface();
|
| - output_surface_state_ = OUTPUT_SURFACE_ACTIVE;
|
| - }
|
| -
|
| - void SetCommitState(CommitState cs) { commit_state_ = cs; }
|
| - CommitState CommitState() const { return commit_state_; }
|
| -
|
| - ForcedRedrawOnTimeoutState ForcedRedrawState() const {
|
| - return forced_redraw_state_;
|
| - }
|
| -
|
| - void SetBeginImplFrameState(BeginImplFrameState bifs) {
|
| - begin_impl_frame_state_ = bifs;
|
| - }
|
| -
|
| - BeginImplFrameState begin_impl_frame_state() const {
|
| - return begin_impl_frame_state_;
|
| - }
|
| -
|
| - OutputSurfaceState output_surface_state() const {
|
| - return output_surface_state_;
|
| - }
|
| -
|
| - bool NeedsCommit() const { return needs_commit_; }
|
| -
|
| - void SetNeedsRedraw(bool b) { needs_redraw_ = b; }
|
| -
|
| - void SetNeedsForcedRedrawForTimeout(bool b) {
|
| - forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
|
| - active_tree_needs_first_draw_ = true;
|
| - }
|
| - bool NeedsForcedRedrawForTimeout() const {
|
| - return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE;
|
| - }
|
| -
|
| - void SetActiveTreeNeedsFirstDraw(bool needs_first_draw) {
|
| - active_tree_needs_first_draw_ = needs_first_draw;
|
| - }
|
| -
|
| - bool CanDraw() const { return can_draw_; }
|
| - bool Visible() const { return visible_; }
|
| -
|
| - bool PendingActivationsShouldBeForced() const {
|
| - return SchedulerStateMachine::PendingActivationsShouldBeForced();
|
| - }
|
| -
|
| - void SetHasPendingTree(bool has_pending_tree) {
|
| - has_pending_tree_ = has_pending_tree;
|
| - }
|
| -
|
| - using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately;
|
| - using SchedulerStateMachine::ProactiveBeginFrameWanted;
|
| - using SchedulerStateMachine::UpdateStateOnCommit;
|
| -};
|
| -
|
| -TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| - SchedulerSettings default_scheduler_settings;
|
| -
|
| - // If no commit needed, do nothing.
|
| - {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION)
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - state.SetNeedsRedraw(false);
|
| - state.SetVisible(true);
|
| -
|
| - EXPECT_FALSE(state.BeginFrameNeeded());
|
| -
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| -
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - }
|
| -
|
| - // If commit requested but can_start is still false, do nothing.
|
| - {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - state.SetNeedsRedraw(false);
|
| - state.SetVisible(true);
|
| - state.SetNeedsCommit();
|
| -
|
| - EXPECT_FALSE(state.BeginFrameNeeded());
|
| -
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - }
|
| -
|
| - // If commit requested, begin a main frame.
|
| - {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetNeedsRedraw(false);
|
| - state.SetVisible(true);
|
| - state.SetNeedsCommit();
|
| -
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - }
|
| -
|
| - // Begin the frame, make sure needs_commit and commit_state update correctly.
|
| - {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetVisible(true);
|
| - state.UpdateState(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - }
|
| -}
|
| -
|
| -// Explicitly test main_frame_before_activation_enabled = true
|
| -TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) {
|
| - SchedulerSettings scheduler_settings;
|
| - scheduler_settings.impl_side_painting = true;
|
| - scheduler_settings.main_frame_before_activation_enabled = true;
|
| - StateMachine state(scheduler_settings);
|
| - state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsRedraw(false);
|
| - state.SetNeedsCommit();
|
| -
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| - // Commit to the pending tree.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify that the next commit starts while there is still a pending tree.
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify the pending commit doesn't overwrite the pending
|
| - // tree until the pending tree has been activated.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify NotifyReadyToActivate unblocks activation, draw, and
|
| - // commit in that order.
|
| - state.NotifyReadyToActivate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| -
|
| - // We're drawing now.
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| -
|
| - // Failing the draw makes us require a commit.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.CommitPending());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| -
|
| - // Missing high res content requires a commit (but not a redraw)
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_TRUE(state.CommitPending());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| -
|
| - // We're drawing now.
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| -
|
| - // While still in the same BeginMainFrame callback on the main thread,
|
| - // set needs redraw again. This should not redraw.
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Failing the draw for animation checkerboards makes us require a commit.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestFailedDrawsEventuallyForceDrawAfterNextCommit) {
|
| - SchedulerSettings scheduler_settings;
|
| - scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start a commit.
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Then initiate a draw.
|
| - state.SetNeedsRedraw(true);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -
|
| - // Fail the draw.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - // But the commit is ongoing.
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Finish the commit. Note, we should not yet be forcing a draw, but should
|
| - // continue the commit as usual.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| -
|
| - // The redraw should be forced at the end of the next BeginImplFrame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
|
| - SchedulerSettings scheduler_settings;
|
| - int draw_limit = 1;
|
| - scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ =
|
| - draw_limit;
|
| - scheduler_settings.impl_side_painting = true;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start a commit.
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.CommitPending());
|
| -
|
| - // Then initiate a draw.
|
| - state.SetNeedsRedraw(true);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -
|
| - // Fail the draw enough times to force a redraw,
|
| - // then once more for good measure.
|
| - for (int i = 0; i < draw_limit + 1; ++i)
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - // But the commit is ongoing.
|
| - EXPECT_TRUE(state.CommitPending());
|
| - EXPECT_TRUE(state.ForcedRedrawState() ==
|
| - SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT);
|
| -
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_FALSE(state.CommitPending());
|
| -
|
| - // Now force redraw should be in waiting for activation
|
| - EXPECT_TRUE(state.ForcedRedrawState() ==
|
| - SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
|
| -
|
| - // After failing additional draws, we should still be in a forced
|
| - // redraw, but not back in WAITING_FOR_COMMIT.
|
| - for (int i = 0; i < draw_limit + 1; ++i)
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_TRUE(state.ForcedRedrawState() ==
|
| - SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start a draw.
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -
|
| - // Failing the draw for animation checkerboards makes us require a commit.
|
| - state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.RedrawPending());
|
| -
|
| - // We should not be trying to draw again now, but we have a commit pending.
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // We should try to draw again at the end of the next BeginImplFrame on
|
| - // the impl thread.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsRedraw(true);
|
| -
|
| - // Draw the first frame.
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Before the next BeginImplFrame, set needs redraw again.
|
| - // This should not redraw until the next BeginImplFrame.
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Move to another frame. This should now draw.
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - state.OnBeginImplFrame();
|
| -
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // We just swapped, so we should proactively request another BeginImplFrame.
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) {
|
| - SchedulerSettings default_scheduler_settings;
|
| -
|
| - // When not in BeginImplFrame deadline, or in BeginImplFrame deadline
|
| - // but not visible, don't draw.
|
| - size_t num_commit_states =
|
| - sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
|
| - size_t num_begin_impl_frame_states =
|
| - sizeof(all_begin_impl_frame_states) /
|
| - sizeof(SchedulerStateMachine::BeginImplFrameState);
|
| - for (size_t i = 0; i < num_commit_states; ++i) {
|
| - for (size_t j = 0; j < num_begin_impl_frame_states; ++j) {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetCommitState(all_commit_states[i]);
|
| - state.SetBeginImplFrameState(all_begin_impl_frame_states[j]);
|
| - bool visible =
|
| - (all_begin_impl_frame_states[j] !=
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
|
| - state.SetVisible(visible);
|
| -
|
| - // Case 1: needs_commit=false
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| - state.NextAction());
|
| -
|
| - // Case 2: needs_commit=true
|
| - state.SetNeedsCommit();
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| - state.NextAction())
|
| - << state.AsValue()->ToString();
|
| - }
|
| - }
|
| -
|
| - // When in BeginImplFrame deadline we should always draw for SetNeedsRedraw
|
| - // except if we're ready to commit, in which case we expect a commit first.
|
| - for (size_t i = 0; i < num_commit_states; ++i) {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetCanDraw(true);
|
| - state.SetCommitState(all_commit_states[i]);
|
| - state.SetBeginImplFrameState(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
|
| -
|
| - state.SetNeedsRedraw(true);
|
| - state.SetVisible(true);
|
| -
|
| - SchedulerStateMachine::Action expected_action;
|
| - if (all_commit_states[i] ==
|
| - SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) {
|
| - expected_action = SchedulerStateMachine::ACTION_COMMIT;
|
| - } else {
|
| - expected_action = SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_ANIMATE);
|
| - state.UpdateState(state.NextAction());
|
| - }
|
| -
|
| - // Case 1: needs_commit=false.
|
| - EXPECT_ACTION(expected_action);
|
| -
|
| - // Case 2: needs_commit=true.
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION(expected_action);
|
| - }
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) {
|
| - SchedulerSettings default_scheduler_settings;
|
| -
|
| - size_t num_commit_states =
|
| - sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
|
| - for (size_t i = 0; i < num_commit_states; ++i) {
|
| - // There shouldn't be any drawing regardless of BeginImplFrame.
|
| - for (size_t j = 0; j < 2; ++j) {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetCommitState(all_commit_states[i]);
|
| - state.SetVisible(false);
|
| - state.SetNeedsRedraw(true);
|
| - if (j == 1) {
|
| - state.SetBeginImplFrameState(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
|
| - }
|
| -
|
| - // Case 1: needs_commit=false.
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| - state.NextAction());
|
| -
|
| - // Case 2: needs_commit=true.
|
| - state.SetNeedsCommit();
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| - state.NextAction())
|
| - << state.AsValue()->ToString();
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) {
|
| - SchedulerSettings default_scheduler_settings;
|
| -
|
| - size_t num_commit_states =
|
| - sizeof(all_commit_states) / sizeof(SchedulerStateMachine::CommitState);
|
| - for (size_t i = 0; i < num_commit_states; ++i) {
|
| - // There shouldn't be any drawing regardless of BeginImplFrame.
|
| - for (size_t j = 0; j < 2; ++j) {
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetCommitState(all_commit_states[i]);
|
| - state.SetVisible(false);
|
| - state.SetNeedsRedraw(true);
|
| - if (j == 1)
|
| - state.OnBeginImplFrame();
|
| -
|
| - state.SetCanDraw(false);
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE,
|
| - state.NextAction());
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestCanRedrawWithWaitingForFirstDrawMakesProgress) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| -
|
| - state.SetActiveTreeNeedsFirstDraw(true);
|
| - state.SetNeedsCommit();
|
| - state.SetNeedsRedraw(true);
|
| - state.SetVisible(true);
|
| - state.SetCanDraw(false);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) {
|
| - SchedulerSettings scheduler_settings;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsCommit();
|
| -
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| - // Begin the frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| -
|
| - // Now, while the frame is in progress, set another commit.
|
| - state.SetNeedsCommit();
|
| - EXPECT_TRUE(state.NeedsCommit());
|
| -
|
| - // Let the frame finish.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT);
|
| -
|
| - // Expect to commit regardless of BeginImplFrame state.
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - state.OnBeginImplFrameDeadlinePending();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - state.OnBeginImplFrameIdle();
|
| - EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - // Finish the commit, then make sure we start the next commit immediately
|
| - // and draw on the next BeginImplFrame.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| -
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFullCycle) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start clean and set commit.
|
| - state.SetNeedsCommit();
|
| -
|
| - // Begin the frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Tell the scheduler the frame finished.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT);
|
| -
|
| - // Commit.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_TRUE(state.needs_redraw());
|
| -
|
| - // Expect to do nothing until BeginImplFrame deadline
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // At BeginImplFrame deadline, draw.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Should be synchronized, no draw needed, no action needed.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_FALSE(state.needs_redraw());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFullCycleWithMainThreadLowLatencyMode) {
|
| - SchedulerSettings scheduler_settings;
|
| - scheduler_settings.main_thread_should_always_be_low_latency = true;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start clean and set commit.
|
| - state.SetNeedsCommit();
|
| -
|
| - // Begin the frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Tell the scheduler the frame finished.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT);
|
| -
|
| - // Commit.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_TRUE(state.needs_redraw());
|
| -
|
| - // Now commit should wait for draw.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW);
|
| -
|
| - // Swap throttled. Do not draw.
|
| - state.DidSwapBuffers();
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Haven't draw since last commit, do not begin new main frame.
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // At BeginImplFrame deadline, draw.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Now will be able to start main frame.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_FALSE(state.needs_redraw());
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestFullCycleWithMainThreadLowLatencyMode_ImplSidePaint) {
|
| - SchedulerSettings scheduler_settings;
|
| - scheduler_settings.main_thread_should_always_be_low_latency = true;
|
| - scheduler_settings.impl_side_painting = true;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start clean and set commit.
|
| - state.SetNeedsCommit();
|
| -
|
| - // Begin the frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Tell the scheduler the frame finished.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT);
|
| -
|
| - // Commit.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - // Now commit should wait for activation.
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION);
|
| -
|
| - // No activation yet, so this commit is not drawn yet. Force to draw this
|
| - // frame, and still block BeginMainFrame.
|
| - state.SetNeedsRedraw(true);
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Cannot BeginMainFrame yet since last commit is not yet activated and drawn.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Now activate sync tree.
|
| - state.NotifyReadyToActivate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_TRUE(state.needs_redraw());
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_DRAW);
|
| -
|
| - // Swap throttled. Do not draw.
|
| - state.DidSwapBuffers();
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Haven't draw since last commit, do not begin new main frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // At BeginImplFrame deadline, draw. This draws unblocks BeginMainFrame.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Now will be able to start main frame.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_FALSE(state.needs_redraw());
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start clean and set commit.
|
| - state.SetNeedsCommit();
|
| -
|
| - // Begin the frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Request another commit while the commit is in flight.
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Tell the scheduler the frame finished.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT);
|
| -
|
| - // First commit.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_TRUE(state.needs_redraw());
|
| -
|
| - // Expect to do nothing until BeginImplFrame deadline.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // At BeginImplFrame deadline, draw.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Should be synchronized, no draw needed, no action needed.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_FALSE(state.needs_redraw());
|
| -
|
| - // Next BeginImplFrame should initiate second commit.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -// See ThreadProxy::BeginMainFrame "EarlyOut_NotVisible" /
|
| -// "EarlyOut_OutputSurfaceLost" cases.
|
| -TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Start clean and set commit.
|
| - state.SetNeedsCommit();
|
| -
|
| - // Begin the frame while visible.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Become invisible and abort BeginMainFrame.
|
| - state.SetVisible(false);
|
| - state.BeginMainFrameAborted(CommitEarlyOutReason::ABORTED_NOT_VISIBLE);
|
| -
|
| - // NeedsCommit should now be true again because we never actually did a
|
| - // commit.
|
| - EXPECT_TRUE(state.NeedsCommit());
|
| -
|
| - // We should now be back in the idle state as if we never started the frame.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // We shouldn't do anything on the BeginImplFrame deadline.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Become visible again.
|
| - state.SetVisible(true);
|
| -
|
| - // Although we have aborted on this frame and haven't cancelled the commit
|
| - // (i.e. need another), don't send another BeginMainFrame yet.
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.NeedsCommit());
|
| -
|
| - // Start a new frame.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -
|
| - // We should be starting the commit now.
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -// See ThreadProxy::BeginMainFrame "EarlyOut_NoUpdates" case.
|
| -TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| - state.SetVisible(true);
|
| - state.SetCanDraw(true);
|
| -
|
| - // Get into a begin frame / commit state.
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Abort the commit, true means that the BeginMainFrame was sent but there
|
| - // was no work to do on the main thread.
|
| - state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
|
| -
|
| - // NeedsCommit should now be false because the commit was actually handled.
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| -
|
| - // Even though the commit was aborted, we still expect to draw the new frame.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify another commit doesn't start on another frame either.
|
| - EXPECT_FALSE(state.NeedsCommit());
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify another commit can start if requested, though.
|
| - state.SetNeedsCommit();
|
| - EXPECT_COMMIT_STATE(SchedulerStateMachine::COMMIT_STATE_IDLE);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.SetVisible(true);
|
| - state.SetCanDraw(true);
|
| -
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Check that the first init does not SetNeedsCommit.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Check that a needs commit initiates a BeginMainFrame.
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| - state.NextAction());
|
| - state.DidLoseOutputSurface();
|
| -
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| - state.UpdateState(state.NextAction());
|
| -
|
| - // Once context recreation begins, nothing should happen.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Recreate the context.
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| -
|
| - // When the context is recreated, we should begin a commit.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestContextLostWhenIdleAndCommitRequestedWhileRecreating) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - // We use impl side painting because it's the more complicated version.
|
| - default_scheduler_settings.impl_side_painting = true;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - EXPECT_NE(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
|
| - state.NextAction());
|
| - state.DidLoseOutputSurface();
|
| - EXPECT_EQ(state.output_surface_state(),
|
| - SchedulerStateMachine::OUTPUT_SURFACE_LOST);
|
| -
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Once context recreation begins, nothing should happen.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // While context is recreating, commits shouldn't begin.
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Recreate the context
|
| - state.DidCreateAndInitializeOutputSurface();
|
| - EXPECT_EQ(state.output_surface_state(),
|
| - SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| -
|
| - // When the context is recreated, we wait until the next BeginImplFrame
|
| - // before starting.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // When the BeginFrame comes in we should begin a commit
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_COMMIT_STATE(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| -
|
| - // Until that commit finishes, we shouldn't be drawing or animate.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Finish the commit, which should make the surface active.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_EQ(state.output_surface_state(),
|
| - SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_ACTIVATION);
|
| - state.NotifyReadyToActivate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_EQ(state.output_surface_state(),
|
| - SchedulerStateMachine::OUTPUT_SURFACE_ACTIVE);
|
| -
|
| - // Finishing the first commit after initializing an output surface should
|
| - // automatically cause a redraw.
|
| - EXPECT_TRUE(state.RedrawPending());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.RedrawPending());
|
| -
|
| - // Next frame as no work to do.
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Once the context is recreated, whether we draw should be based on
|
| - // SetCanDraw if waiting on first draw after activate.
|
| - state.SetNeedsRedraw(true);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.SetCanDraw(false);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| - state.SetCanDraw(true);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Once the context is recreated, whether we draw should be based on
|
| - // SetCanDraw if waiting on first draw after activate.
|
| - state.SetNeedsRedraw(true);
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - // Activate so we need the first draw
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - state.NotifyReadyToActivate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_TRUE(state.needs_redraw());
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.SetCanDraw(false);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| - state.SetCanDraw(true);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
|
| - SchedulerSettings scheduler_settings;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Get a commit in flight.
|
| - state.SetNeedsCommit();
|
| -
|
| - // Set damage and expect a draw.
|
| - state.SetNeedsRedraw(true);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Cause a lost context while the BeginMainFrame is in flight.
|
| - state.DidLoseOutputSurface();
|
| -
|
| - // Ask for another draw. Expect nothing happens.
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Finish the frame, and commit.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - // We will abort the draw when the output surface is lost if we are
|
| - // waiting for the first draw to unblock the main thread.
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| -
|
| - // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE
|
| - EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadlinePending();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestContextLostWhileCommitInProgressAndAnotherCommitRequested) {
|
| - SchedulerSettings scheduler_settings;
|
| - StateMachine state(scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Get a commit in flight.
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Set damage and expect a draw.
|
| - state.SetNeedsRedraw(true);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Cause a lost context while the BeginMainFrame is in flight.
|
| - state.DidLoseOutputSurface();
|
| -
|
| - // Ask for another draw and also set needs commit. Expect nothing happens.
|
| - state.SetNeedsRedraw(true);
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Finish the frame, and commit.
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| -
|
| - // Because the output surface is missing, we expect the draw to abort.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| -
|
| - // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE
|
| - EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadlinePending();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_IMPL_FRAME_STATE(
|
| - SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameIdle();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| -
|
| - // After we get a new output surface, the commit flow should start.
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, DontDrawBeforeCommitAfterLostOutputSurface) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - state.SetNeedsRedraw(true);
|
| -
|
| - // Cause a lost output surface, and restore it.
|
| - state.DidLoseOutputSurface();
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| - state.UpdateState(state.NextAction());
|
| - state.DidCreateAndInitializeOutputSurface();
|
| -
|
| - EXPECT_FALSE(state.RedrawPending());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestPendingActivationsShouldBeForcedAfterLostOutputSurface) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - state.SetCommitState(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| -
|
| - // Cause a lost context.
|
| - state.DidLoseOutputSurface();
|
| -
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - EXPECT_TRUE(state.PendingActivationsShouldBeForced());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| -
|
| - EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestNoBeginMainFrameWhenInvisible) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetVisible(false);
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - state.SetCanStart();
|
| - state.UpdateState(state.NextAction());
|
| - state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
|
| - state.SetVisible(false);
|
| - state.SetCommitState(
|
| - SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT);
|
| - state.SetNeedsCommit();
|
| -
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
|
| - state.UpdateState(state.NextAction());
|
| -
|
| - EXPECT_TRUE(state.active_tree_needs_first_draw());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestInitialActionsWhenContextLost) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - state.SetNeedsCommit();
|
| - state.DidLoseOutputSurface();
|
| -
|
| - // When we are visible, we normally want to begin output surface creation
|
| - // as soon as possible.
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION);
|
| -
|
| - state.DidCreateAndInitializeOutputSurface();
|
| - EXPECT_EQ(state.output_surface_state(),
|
| - SchedulerStateMachine::OUTPUT_SURFACE_WAITING_FOR_FIRST_COMMIT);
|
| -
|
| - // We should not send a BeginMainFrame when we are invisible, even if we've
|
| - // lost the output surface and are trying to get the first commit, since the
|
| - // main thread will just abort anyway.
|
| - state.SetVisible(false);
|
| - EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, ReportIfNotDrawing) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| - EXPECT_FALSE(state.PendingDrawsShouldBeAborted());
|
| -
|
| - state.SetCanDraw(false);
|
| - state.SetVisible(true);
|
| - EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
|
| -
|
| - state.SetCanDraw(true);
|
| - state.SetVisible(false);
|
| - EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
|
| -
|
| - state.SetCanDraw(false);
|
| - state.SetVisible(false);
|
| - EXPECT_TRUE(state.PendingDrawsShouldBeAborted());
|
| -
|
| - state.SetCanDraw(true);
|
| - state.SetVisible(true);
|
| - EXPECT_FALSE(state.PendingDrawsShouldBeAborted());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestTriggerDeadlineImmediatelyAfterAbortedCommit) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // This test mirrors what happens during the first frame of a scroll gesture.
|
| - // First we get the input event and a BeginFrame.
|
| - state.OnBeginImplFrame();
|
| -
|
| - // As a response the compositor requests a redraw and a commit to tell the
|
| - // main thread about the new scroll offset.
|
| - state.SetNeedsRedraw(true);
|
| - state.SetNeedsCommit();
|
| -
|
| - // We should start the commit normally.
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Since only the scroll offset changed, the main thread will abort the
|
| - // commit.
|
| - state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
|
| -
|
| - // Since the commit was aborted, we should draw right away instead of waiting
|
| - // for the deadline.
|
| - EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| -}
|
| -
|
| -void FinishPreviousCommitAndDrawWithoutExitingDeadline(
|
| - StateMachine* state_ptr) {
|
| - // Gross, but allows us to use macros below.
|
| - StateMachine& state = *state_ptr;
|
| -
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.NotifyReadyToActivate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // This test ensures that impl-draws are prioritized over main thread updates
|
| - // in prefer impl latency mode.
|
| - state.SetNeedsRedraw(true);
|
| - state.SetNeedsCommit();
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify the deadline is not triggered early until we enter
|
| - // prefer impl latency mode.
|
| - EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| - state.SetImplLatencyTakesPriority(true);
|
| - EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| -
|
| - // Trigger the deadline.
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| - state.DidSwapBuffers();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.DidSwapBuffersComplete();
|
| -
|
| - // Request a new commit and finish the previous one.
|
| - state.SetNeedsCommit();
|
| - FinishPreviousCommitAndDrawWithoutExitingDeadline(&state);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.DidSwapBuffersComplete();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Finish the previous commit and draw it.
|
| - FinishPreviousCommitAndDrawWithoutExitingDeadline(&state);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - // Verify we do not send another BeginMainFrame if was are swap throttled
|
| - // and did not just swap.
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest,
|
| - TestTriggerDeadlineImmediatelyOnLostOutputSurface) {
|
| - SchedulerSettings default_scheduler_settings;
|
| - StateMachine state(default_scheduler_settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - state.SetNeedsCommit();
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| -
|
| - state.DidLoseOutputSurface();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - // The deadline should be triggered immediately when output surface is lost.
|
| - EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestSetNeedsAnimate) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Test requesting an animation that, when run, causes us to draw.
|
| - state.SetNeedsAnimate();
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| -
|
| - state.OnBeginImplFrameDeadlinePending();
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestAnimateBeforeCommit) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Check that animations are updated before we start a commit.
|
| - state.SetNeedsAnimate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -
|
| - state.OnBeginImplFrameDeadlinePending();
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestAnimateAfterCommitBeforeDraw) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Check that animations are updated before we start a commit.
|
| - state.SetNeedsAnimate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - state.SetNeedsCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -
|
| - state.NotifyBeginMainFrameStarted();
|
| - state.NotifyReadyToCommit();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| -
|
| - state.OnBeginImplFrameDeadlinePending();
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestSetNeedsAnimateAfterAnimate) {
|
| - SchedulerSettings settings;
|
| - settings.impl_side_painting = true;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - // Test requesting an animation after we have already animated during this
|
| - // frame.
|
| - state.SetNeedsRedraw(true);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
|
| -
|
| - state.SetNeedsAnimate();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestForwardBeginFramesToChildren) {
|
| - SchedulerSettings settings;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - EXPECT_FALSE(state.BeginFrameNeeded());
|
| - state.SetChildrenNeedBeginFrames(true);
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, TestDeferCommit) {
|
| - SchedulerSettings settings;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state)
|
| -
|
| - state.SetDeferCommits(true);
|
| -
|
| - state.SetNeedsCommit();
|
| - EXPECT_TRUE(state.BeginFrameNeeded());
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.OnBeginImplFrameDeadline();
|
| - EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| -
|
| - state.SetDeferCommits(false);
|
| - state.OnBeginImplFrame();
|
| - EXPECT_ACTION_UPDATE_STATE(
|
| - SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| -}
|
| -
|
| -TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) {
|
| - SchedulerSettings settings;
|
| - StateMachine state(settings);
|
| - SET_UP_STATE(state);
|
| -
|
| - EXPECT_FALSE(state.ProactiveBeginFrameWanted());
|
| - bool commit_has_no_updates = true;
|
| - state.UpdateStateOnCommit(commit_has_no_updates);
|
| - EXPECT_TRUE(state.ProactiveBeginFrameWanted());
|
| - state.OnBeginImplFrame();
|
| - EXPECT_FALSE(state.ProactiveBeginFrameWanted());
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace cc
|
|
|