diff options
author | simonhong@chromium.org <simonhong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-12 04:26:02 +0000 |
---|---|---|
committer | simonhong@chromium.org <simonhong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-12 04:26:02 +0000 |
commit | 30d82149616dafe805d5fb22b1ddfcddfeee5a22 (patch) | |
tree | 7cb1d3ddc1559fd6ea094542343c768968433b67 /cc/scheduler | |
parent | 370948a602ec072f7f5f0f6c285c88f49c4abd15 (diff) | |
download | chromium_src-30d82149616dafe805d5fb22b1ddfcddfeee5a22.zip chromium_src-30d82149616dafe805d5fb22b1ddfcddfeee5a22.tar.gz chromium_src-30d82149616dafe805d5fb22b1ddfcddfeee5a22.tar.bz2 |
cc: Unify use of DidSwapBuffers() and did_request_swap
Use OutputSurface::DidSwapBuffers() as the source of whether
we swapped or not.
R=brianderson@chromium.org
BUG=363414
TEST=cc_unittests
Review URL: https://codereview.chromium.org/246753008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269738 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/scheduler')
-rw-r--r-- | cc/scheduler/draw_result.h | 22 | ||||
-rw-r--r-- | cc/scheduler/draw_swap_readback_result.h | 38 | ||||
-rw-r--r-- | cc/scheduler/scheduler.cc | 22 | ||||
-rw-r--r-- | cc/scheduler/scheduler.h | 10 | ||||
-rw-r--r-- | cc/scheduler/scheduler_state_machine.cc | 53 | ||||
-rw-r--r-- | cc/scheduler/scheduler_state_machine.h | 6 | ||||
-rw-r--r-- | cc/scheduler/scheduler_state_machine_unittest.cc | 91 | ||||
-rw-r--r-- | cc/scheduler/scheduler_unittest.cc | 49 |
8 files changed, 146 insertions, 145 deletions
diff --git a/cc/scheduler/draw_result.h b/cc/scheduler/draw_result.h new file mode 100644 index 0000000..e63303c --- /dev/null +++ b/cc/scheduler/draw_result.h @@ -0,0 +1,22 @@ +// Copyright 2014 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. + +#ifndef CC_SCHEDULER_DRAW_RESULT_H_ +#define CC_SCHEDULER_DRAW_RESULT_H_ + +namespace cc { + +enum DrawResult { + INVALID_RESULT, + DRAW_SUCCESS, + DRAW_ABORTED_CHECKERBOARD_ANIMATIONS, + DRAW_ABORTED_MISSING_HIGH_RES_CONTENT, + DRAW_ABORTED_CANT_READBACK, + DRAW_ABORTED_CONTEXT_LOST, + DRAW_ABORTED_CANT_DRAW, +}; + +} // namespace cc + +#endif // CC_SCHEDULER_DRAW_RESULT_H_ diff --git a/cc/scheduler/draw_swap_readback_result.h b/cc/scheduler/draw_swap_readback_result.h deleted file mode 100644 index 852b897..0000000 --- a/cc/scheduler/draw_swap_readback_result.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 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. - -#ifndef CC_SCHEDULER_DRAW_SWAP_READBACK_RESULT_H_ -#define CC_SCHEDULER_DRAW_SWAP_READBACK_RESULT_H_ - -namespace cc { - -struct DrawSwapReadbackResult { - enum DrawResult { - INVALID_RESULT, - DRAW_SUCCESS, - DRAW_ABORTED_CHECKERBOARD_ANIMATIONS, - DRAW_ABORTED_MISSING_HIGH_RES_CONTENT, - DRAW_ABORTED_CANT_READBACK, - DRAW_ABORTED_CONTEXT_LOST, - DRAW_ABORTED_CANT_DRAW, - }; - - DrawSwapReadbackResult() - : draw_result(INVALID_RESULT), - did_request_swap(false), - did_readback(false) {} - DrawSwapReadbackResult(DrawResult draw_result, - bool did_request_swap, - bool did_readback) - : draw_result(draw_result), - did_request_swap(did_request_swap), - did_readback(did_readback) {} - DrawResult draw_result; - bool did_request_swap; - bool did_readback; -}; - -} // namespace cc - -#endif // CC_SCHEDULER_DRAW_SWAP_READBACK_RESULT_H_ diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index 9345561..7dea302 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc @@ -195,6 +195,10 @@ void Scheduler::SetMaxSwapsPending(int max) { void Scheduler::DidSwapBuffers() { state_machine_.DidSwapBuffers(); + + // Swap should not occur inside readback operation. + DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_DRAW_AND_READBACK)); + // There is no need to call ProcessScheduledActions here because // swapping should not trigger any new actions. if (!inside_process_scheduled_actions_) { @@ -604,18 +608,8 @@ bool Scheduler::IsBeginMainFrameSent() const { } void Scheduler::DrawAndSwapIfPossible() { - DrawSwapReadbackResult result = - client_->ScheduledActionDrawAndSwapIfPossible(); - state_machine_.DidDrawIfPossibleCompleted(result.draw_result); -} - -void Scheduler::DrawAndSwapForced() { - client_->ScheduledActionDrawAndSwapForced(); -} - -void Scheduler::DrawAndReadback() { - DrawSwapReadbackResult result = client_->ScheduledActionDrawAndReadback(); - DCHECK(!result.did_request_swap); + DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); + state_machine_.DidDrawIfPossibleCompleted(result); } void Scheduler::ProcessScheduledActions() { @@ -659,14 +653,14 @@ void Scheduler::ProcessScheduledActions() { DrawAndSwapIfPossible(); break; case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: - DrawAndSwapForced(); + client_->ScheduledActionDrawAndSwapForced(); break; case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: // No action is actually performed, but this allows the state machine to // advance out of its waiting to draw state without actually drawing. break; case SchedulerStateMachine::ACTION_DRAW_AND_READBACK: - DrawAndReadback(); + client_->ScheduledActionDrawAndReadback(); break; case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION: client_->ScheduledActionBeginOutputSurfaceCreation(); diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h index b30f06e..5bf83fc 100644 --- a/cc/scheduler/scheduler.h +++ b/cc/scheduler/scheduler.h @@ -14,7 +14,7 @@ #include "base/time/time.h" #include "cc/base/cc_export.h" #include "cc/output/begin_frame_args.h" -#include "cc/scheduler/draw_swap_readback_result.h" +#include "cc/scheduler/draw_result.h" #include "cc/scheduler/scheduler_settings.h" #include "cc/scheduler/scheduler_state_machine.h" #include "cc/scheduler/time_source.h" @@ -30,9 +30,9 @@ class SchedulerClient { virtual void SetNeedsBeginFrame(bool enable) = 0; virtual void WillBeginImplFrame(const BeginFrameArgs& args) = 0; virtual void ScheduledActionSendBeginMainFrame() = 0; - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() = 0; - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapForced() = 0; - virtual DrawSwapReadbackResult ScheduledActionDrawAndReadback() = 0; + virtual DrawResult ScheduledActionDrawAndSwapIfPossible() = 0; + virtual DrawResult ScheduledActionDrawAndSwapForced() = 0; + virtual DrawResult ScheduledActionDrawAndReadback() = 0; virtual void ScheduledActionAnimate() = 0; virtual void ScheduledActionCommit() = 0; virtual void ScheduledActionUpdateVisibleTiles() = 0; @@ -166,8 +166,6 @@ class CC_EXPORT Scheduler { void SetupPollingMechanisms(bool needs_begin_frame); void ActivatePendingTree(); void DrawAndSwapIfPossible(); - void DrawAndSwapForced(); - void DrawAndReadback(); void ProcessScheduledActions(); bool CanCommitAndActivateBeforeDeadline() const; diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 3ed18f6..84a6185 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -24,6 +24,7 @@ SchedulerStateMachine::SchedulerStateMachine(const SchedulerSettings& settings) current_frame_number_(0), last_frame_number_animate_performed_(-1), last_frame_number_swap_performed_(-1), + last_frame_number_swap_requested_(-1), last_frame_number_begin_main_frame_sent_(-1), last_frame_number_update_visible_tiles_was_called_(-1), manage_tiles_funnel_(0), @@ -224,6 +225,8 @@ scoped_ptr<base::Value> SchedulerStateMachine::AsValue() const { last_frame_number_animate_performed_); minor_state->SetInteger("last_frame_number_swap_performed", last_frame_number_swap_performed_); + minor_state->SetInteger("last_frame_number_swap_requested", + last_frame_number_swap_requested_); minor_state->SetInteger( "last_frame_number_begin_main_frame_sent", last_frame_number_begin_main_frame_sent_); @@ -292,6 +295,10 @@ bool SchedulerStateMachine::HasSwappedThisFrame() const { return current_frame_number_ == last_frame_number_swap_performed_; } +bool SchedulerStateMachine::HasRequestedSwapThisFrame() const { + return current_frame_number_ == last_frame_number_swap_requested_; +} + bool SchedulerStateMachine::PendingDrawsShouldBeAborted() const { // These are all the cases where we normally cannot or do not want to draw // but, if needs_redraw_ is true and we do not draw to make forward progress, @@ -370,8 +377,8 @@ bool SchedulerStateMachine::ShouldDraw() const { if (PendingDrawsShouldBeAborted()) return active_tree_needs_first_draw_; - // After this line, we only want to swap once per frame. - if (HasSwappedThisFrame()) + // After this line, we only want to send a swap request once per frame. + if (HasRequestedSwapThisFrame()) return false; // Do not queue too many swaps. @@ -793,7 +800,7 @@ void SchedulerStateMachine::UpdateStateOnDraw(bool did_request_swap) { active_tree_needs_first_draw_ = false; if (did_request_swap) - last_frame_number_swap_performed_ = current_frame_number_; + last_frame_number_swap_requested_ = current_frame_number_; } void SchedulerStateMachine::UpdateStateOnManageTiles() { @@ -901,12 +908,12 @@ bool SchedulerStateMachine::ProactiveBeginFrameWanted() const { if (needs_manage_tiles_) return true; - // If we just swapped, it's likely that we are going to produce another - // frame soon. This helps avoid negative glitches in our + // If we just sent a swap request, it's likely that we are going to produce + // another frame soon. This helps avoid negative glitches in our // SetNeedsBeginFrame requests, which may propagate to the BeginImplFrame // provider and get sampled at an inopportune time, delaying the next // BeginImplFrame. - if (last_frame_number_swap_performed_ == current_frame_number_) + if (HasRequestedSwapThisFrame()) return true; return false; @@ -987,7 +994,7 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { // If we just sent a BeginMainFrame and haven't hit the deadline yet, the main // thread is in a low latency mode. - if (last_frame_number_begin_main_frame_sent_ == current_frame_number_ && + if (HasSentBeginMainFrameThisFrame() && (begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING || begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)) return false; @@ -995,9 +1002,7 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { // If there's a commit in progress it must either be from the previous frame // or it started after the impl thread's deadline. In either case the main // thread is in high latency mode. - if (commit_state_ == COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || - commit_state_ == COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED || - commit_state_ == COMMIT_STATE_READY_TO_COMMIT) + if (CommitPending()) return true; // Similarly, if there's a pending tree the main thread is in high latency @@ -1011,11 +1016,10 @@ bool SchedulerStateMachine::MainThreadIsInHighLatencyMode() const { if (begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { // Even if there's a new active tree to draw at the deadline or we've just - // drawn it, it may have been triggered by a previous BeginImplFrame, in + // swapped it, it may have been triggered by a previous BeginImplFrame, in // which case the main thread is in a high latency mode. - return (active_tree_needs_first_draw_ || - last_frame_number_swap_performed_ == current_frame_number_) && - last_frame_number_begin_main_frame_sent_ != current_frame_number_; + return (active_tree_needs_first_draw_ || HasSwappedThisFrame()) && + !HasSentBeginMainFrameThisFrame(); } // If the active tree needs its first draw in any other state, we know the @@ -1057,6 +1061,8 @@ void SchedulerStateMachine::SetMaxSwapsPending(int max) { void SchedulerStateMachine::DidSwapBuffers() { pending_swaps_++; DCHECK_LE(pending_swaps_, max_pending_swaps_); + + last_frame_number_swap_performed_ = current_frame_number_; } void SchedulerStateMachine::SetSwapUsedIncompleteTile( @@ -1074,23 +1080,22 @@ void SchedulerStateMachine::SetSmoothnessTakesPriority( smoothness_takes_priority_ = smoothness_takes_priority; } -void SchedulerStateMachine::DidDrawIfPossibleCompleted( - DrawSwapReadbackResult::DrawResult result) { +void SchedulerStateMachine::DidDrawIfPossibleCompleted(DrawResult result) { switch (result) { - case DrawSwapReadbackResult::INVALID_RESULT: - NOTREACHED() << "Uninitialized DrawSwapReadbackResult."; + case INVALID_RESULT: + NOTREACHED() << "Uninitialized DrawResult."; break; - case DrawSwapReadbackResult::DRAW_ABORTED_CANT_DRAW: - case DrawSwapReadbackResult::DRAW_ABORTED_CANT_READBACK: - case DrawSwapReadbackResult::DRAW_ABORTED_CONTEXT_LOST: + case DRAW_ABORTED_CANT_DRAW: + case DRAW_ABORTED_CANT_READBACK: + case DRAW_ABORTED_CONTEXT_LOST: NOTREACHED() << "Invalid return value from DrawAndSwapIfPossible:" << result; break; - case DrawSwapReadbackResult::DRAW_SUCCESS: + case DRAW_SUCCESS: consecutive_checkerboard_animations_ = 0; forced_redraw_state_ = FORCED_REDRAW_STATE_IDLE; break; - case DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: + case DRAW_ABORTED_CHECKERBOARD_ANIMATIONS: needs_redraw_ = true; // If we're already in the middle of a redraw, we don't need to @@ -1109,7 +1114,7 @@ void SchedulerStateMachine::DidDrawIfPossibleCompleted( forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; } break; - case DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: + case DRAW_ABORTED_MISSING_HIGH_RES_CONTENT: // It's not clear whether this missing content is because of missing // pictures (which requires a commit) or because of memory pressure // removing textures (which might not). To be safe, request a commit diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h index ff032b6..9df9c08 100644 --- a/cc/scheduler/scheduler_state_machine.h +++ b/cc/scheduler/scheduler_state_machine.h @@ -12,7 +12,7 @@ #include "base/time/time.h" #include "cc/base/cc_export.h" #include "cc/output/begin_frame_args.h" -#include "cc/scheduler/draw_swap_readback_result.h" +#include "cc/scheduler/draw_result.h" #include "cc/scheduler/scheduler_settings.h" namespace base { @@ -193,7 +193,7 @@ class CC_EXPORT SchedulerStateMachine { bool smoothness_takes_priority() const { return smoothness_takes_priority_; } // Indicates whether ACTION_DRAW_AND_SWAP_IF_POSSIBLE drew to the screen. - void DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DrawResult result); + void DidDrawIfPossibleCompleted(DrawResult result); // Indicates that a new commit flow needs to be performed, either to pull // updates from the main thread to the impl, or to push deltas from the impl @@ -271,6 +271,7 @@ class CC_EXPORT SchedulerStateMachine { void AdvanceCurrentFrameNumber(); bool HasSentBeginMainFrameThisFrame() const; bool HasUpdatedVisibleTilesThisFrame() const; + bool HasRequestedSwapThisFrame() const; bool HasSwappedThisFrame() const; void UpdateStateOnCommit(bool commit_was_aborted); @@ -292,6 +293,7 @@ class CC_EXPORT SchedulerStateMachine { int current_frame_number_; int last_frame_number_animate_performed_; int last_frame_number_swap_performed_; + int last_frame_number_swap_requested_; int last_frame_number_begin_main_frame_sent_; int last_frame_number_update_visible_tiles_was_called_; diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index 64d1c25..b39d50d 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc @@ -255,6 +255,8 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeDrawDisabled) { state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); @@ -327,6 +329,8 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { 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_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); @@ -352,14 +356,15 @@ TEST(SchedulerStateMachineTest, // 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( - DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); + state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); EXPECT_ACTION_UPDATE_STATE( @@ -386,13 +391,14 @@ TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) { 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( - DrawSwapReadbackResult::DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); + state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT); state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); @@ -421,6 +427,8 @@ TEST(SchedulerStateMachineTest, // 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()); @@ -431,8 +439,7 @@ TEST(SchedulerStateMachineTest, EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); // Failing the draw for animation checkerboards makes us require a commit. - state.DidDrawIfPossibleCompleted( - DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); + state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); state.OnBeginImplFrame(CreateBeginFrameArgsForTesting()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); EXPECT_ACTION_UPDATE_STATE( @@ -470,8 +477,7 @@ void TestFailedDrawsEventuallyForceDrawAfterNextCommit( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); // Fail the draw. - state.DidDrawIfPossibleCompleted( - DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); + state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); EXPECT_TRUE(state.BeginFrameNeeded()); EXPECT_TRUE(state.RedrawPending()); @@ -497,6 +503,8 @@ void TestFailedDrawsEventuallyForceDrawAfterNextCommit( state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); } TEST(SchedulerStateMachineTest, @@ -544,10 +552,8 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { // 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( - DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); - } + 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()); @@ -569,10 +575,8 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { // 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( - DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); - } + 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); @@ -599,8 +603,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); // Failing the draw for animation checkerboards makes us require a commit. - state.DidDrawIfPossibleCompleted( - DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); + state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); @@ -617,6 +620,8 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); } @@ -639,7 +644,9 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); // Before the next BeginImplFrame, set needs redraw again. @@ -657,7 +664,9 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + 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. @@ -904,7 +913,9 @@ void TestSetNeedsCommitIsNotLost(bool main_frame_before_draw_enabled) { EXPECT_TRUE(state.active_tree_needs_first_draw()); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); if (!main_frame_before_draw_enabled) { EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); @@ -962,7 +973,9 @@ TEST(SchedulerStateMachineTest, TestFullCycle) { EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); // Should be synchronized, no draw needed, no action needed. EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); @@ -1014,7 +1027,9 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); // Should be synchronized, no draw needed, no action needed. EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); @@ -1125,6 +1140,8 @@ TEST(SchedulerStateMachineTest, AbortBeginMainFrameAndCancelCommit) { state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); // Verify another commit doesn't start on another frame either. EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); @@ -1281,6 +1298,8 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { 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. @@ -1346,6 +1365,8 @@ TEST(SchedulerStateMachineTest, 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. @@ -1404,6 +1425,8 @@ TEST(SchedulerStateMachineTest, 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); } @@ -1676,6 +1699,8 @@ void TestForceCommitWhenReplacementActivationInProgress( state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); if (!settings.main_frame_before_draw_enabled) { // New replacement commit is scheduled. EXPECT_ACTION_UPDATE_STATE( @@ -1715,6 +1740,8 @@ void TestForceCommitWhenReplacementActivationInProgress( state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); EXPECT_EQ(SchedulerStateMachine::READBACK_STATE_IDLE, state.readback_state()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); } @@ -1787,6 +1814,8 @@ TEST(SchedulerStateMachineTest, state.OnBeginImplFrameDeadline(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); + state.DidSwapBuffers(); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE( SchedulerStateMachine::ACTION_NONE); @@ -1856,7 +1885,9 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { EXPECT_TRUE(state.active_tree_needs_first_draw()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); @@ -1892,7 +1923,9 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { EXPECT_TRUE(state.active_tree_needs_first_draw()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); // Should be waiting for the normal BeginMainFrame. @@ -1926,7 +1959,9 @@ TEST(SchedulerStateMachineTest, ImmediateBeginMainFrameAbortedWhileInvisible) { EXPECT_TRUE(state.active_tree_needs_first_draw()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); // Should be waiting for BeginMainFrame. @@ -1967,7 +2002,9 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { EXPECT_TRUE(state.active_tree_needs_first_draw()); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); - state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); + state.DidSwapBuffers(); + state.DidDrawIfPossibleCompleted(DRAW_SUCCESS); + state.DidSwapBuffersComplete(); EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); } diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index d307f96..c3d9f38 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc @@ -114,16 +114,12 @@ class FakeSchedulerClient : public SchedulerClient { actions_.push_back("ScheduledActionAnimate"); states_.push_back(scheduler_->AsValue().release()); } - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() - OVERRIDE { + virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); states_.push_back(scheduler_->AsValue().release()); num_draws_++; - bool did_readback = false; - DrawSwapReadbackResult::DrawResult result = - draw_will_happen_ - ? DrawSwapReadbackResult::DRAW_SUCCESS - : DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; + DrawResult result = + draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; bool swap_will_happen = draw_will_happen_ && swap_will_happen_if_draw_happens_; if (swap_will_happen) { @@ -131,26 +127,17 @@ class FakeSchedulerClient : public SchedulerClient { if (automatic_swap_ack_) scheduler_->DidSwapBuffersComplete(); } - return DrawSwapReadbackResult( - result, - draw_will_happen_ && swap_will_happen_if_draw_happens_, - did_readback); + return result; } - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapForced() OVERRIDE { + virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { actions_.push_back("ScheduledActionDrawAndSwapForced"); states_.push_back(scheduler_->AsValue().release()); - bool did_request_swap = swap_will_happen_if_draw_happens_; - bool did_readback = false; - return DrawSwapReadbackResult( - DrawSwapReadbackResult::DRAW_SUCCESS, did_request_swap, did_readback); + return DRAW_SUCCESS; } - virtual DrawSwapReadbackResult ScheduledActionDrawAndReadback() OVERRIDE { + virtual DrawResult ScheduledActionDrawAndReadback() OVERRIDE { actions_.push_back("ScheduledActionDrawAndReadback"); states_.push_back(scheduler_->AsValue().release()); - bool did_request_swap = false; - bool did_readback = true; - return DrawSwapReadbackResult( - DrawSwapReadbackResult::DRAW_SUCCESS, did_request_swap, did_readback); + return DRAW_SUCCESS; } virtual void ScheduledActionCommit() OVERRIDE { actions_.push_back("ScheduledActionCommit"); @@ -395,7 +382,7 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { public: virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() + virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { // Only SetNeedsRedraw the first time this is called if (!num_draws_) @@ -403,12 +390,9 @@ class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); } - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapForced() OVERRIDE { + virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { NOTREACHED(); - bool did_request_swap = true; - bool did_readback = false; - return DrawSwapReadbackResult( - DrawSwapReadbackResult::DRAW_SUCCESS, did_request_swap, did_readback); + return DRAW_SUCCESS; } virtual void ScheduledActionCommit() OVERRIDE {} @@ -509,7 +493,7 @@ class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { : set_needs_commit_on_next_draw_(false) {} virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() + virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { // Only SetNeedsCommit the first time this is called if (set_needs_commit_on_next_draw_) { @@ -519,12 +503,9 @@ class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); } - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapForced() OVERRIDE { + virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { NOTREACHED(); - bool did_request_swap = false; - bool did_readback = false; - return DrawSwapReadbackResult( - DrawSwapReadbackResult::DRAW_SUCCESS, did_request_swap, did_readback); + return DRAW_SUCCESS; } virtual void ScheduledActionCommit() OVERRIDE {} @@ -713,7 +694,7 @@ TEST(SchedulerTest, BackToBackReadbackAllowed) { class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { public: - virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() + virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { scheduler_->SetNeedsManageTiles(); return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |