Index: cc/scheduler_state_machine.h |
diff --git a/cc/scheduler_state_machine.h b/cc/scheduler_state_machine.h |
index 638cbb270ce9b24689d5095baf174ade4f4d1a13..092231f59c345d1fa0486a4202907abc812db69e 100644 |
--- a/cc/scheduler_state_machine.h |
+++ b/cc/scheduler_state_machine.h |
@@ -1,3 +1,161 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
+// 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. |
+ |
+#ifndef CCSchedulerStateMachine_h |
+#define CCSchedulerStateMachine_h |
+ |
+#include <string> |
+ |
+#include "base/basictypes.h" |
+ |
+namespace cc { |
+ |
+// The CCSchedulerStateMachine decides how to coordinate main thread activites |
+// like painting/running javascript with rendering and input activities on the |
+// impl thread. |
+// |
+// The state machine tracks internal state but is also influenced by external state. |
+// Internal state includes things like whether a frame has been requested, while |
+// external state includes things like the current time being near to the vblank time. |
+// |
+// The scheduler seperates "what to do next" from the updating of its internal state to |
+// make testing cleaner. |
+class CCSchedulerStateMachine { |
+public: |
+ CCSchedulerStateMachine(); |
+ |
+ enum CommitState { |
+ COMMIT_STATE_IDLE, |
+ COMMIT_STATE_FRAME_IN_PROGRESS, |
+ COMMIT_STATE_READY_TO_COMMIT, |
+ COMMIT_STATE_WAITING_FOR_FIRST_DRAW, |
+ }; |
+ |
+ enum TextureState { |
+ LAYER_TEXTURE_STATE_UNLOCKED, |
+ LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD, |
+ LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD, |
+ }; |
+ |
+ enum ContextState { |
+ CONTEXT_ACTIVE, |
+ CONTEXT_LOST, |
+ CONTEXT_RECREATING, |
+ }; |
+ |
+ bool commitPending() const |
+ { |
+ return m_commitState != COMMIT_STATE_IDLE; |
+ } |
+ |
+ bool redrawPending() const { return m_needsRedraw; } |
+ |
+ enum Action { |
+ ACTION_NONE, |
+ ACTION_BEGIN_FRAME, |
+ ACTION_COMMIT, |
+ ACTION_DRAW_IF_POSSIBLE, |
+ ACTION_DRAW_FORCED, |
+ ACTION_BEGIN_CONTEXT_RECREATION, |
+ ACTION_ACQUIRE_LAYER_TEXTURES_FOR_MAIN_THREAD, |
+ }; |
+ Action nextAction() const; |
+ void updateState(Action); |
+ |
+ // Indicates whether the scheduler needs a vsync callback in order to make |
+ // progress. |
+ bool vsyncCallbackNeeded() const; |
+ |
+ // Indicates that the system has entered and left a vsync callback. |
+ // The scheduler will not draw more than once in a given vsync callback. |
+ void didEnterVSync(); |
+ void didLeaveVSync(); |
+ |
+ // Indicates whether the LayerTreeHostImpl is visible. |
+ void setVisible(bool); |
+ |
+ // Indicates that a redraw is required, either due to the impl tree changing |
+ // or the screen being damaged and simply needing redisplay. |
+ void setNeedsRedraw(); |
+ |
+ // As setNeedsRedraw(), but ensures the draw will definitely happen even if |
+ // we are not visible. |
+ void setNeedsForcedRedraw(); |
+ |
+ // Indicates whether ACTION_DRAW_IF_POSSIBLE drew to the screen or not. |
+ void didDrawIfPossibleCompleted(bool success); |
+ |
+ // 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 |
+ // thread to main. |
+ void setNeedsCommit(); |
+ |
+ // As setNeedsCommit(), but ensures the beginFrame will definitely happen even if |
+ // we are not visible. |
+ void setNeedsForcedCommit(); |
+ |
+ // Call this only in response to receiving an ACTION_BEGIN_FRAME |
+ // from nextState. Indicates that all painting is complete. |
+ void beginFrameComplete(); |
+ |
+ // Call this only in response to receiving an ACTION_BEGIN_FRAME |
+ // from nextState if the client rejects the beginFrame message. |
+ void beginFrameAborted(); |
+ |
+ // Request exclusive access to the textures that back single buffered |
+ // layers on behalf of the main thread. Upon acqusition, |
+ // ACTION_DRAW_IF_POSSIBLE will not draw until the main thread releases the |
+ // textures to the impl thread by committing the layers. |
+ void setMainThreadNeedsLayerTextures(); |
+ |
+ // Indicates whether we can successfully begin a frame at this time. |
+ void setCanBeginFrame(bool can) { m_canBeginFrame = can; } |
+ |
+ // Indicates whether drawing would, at this time, make sense. |
+ // canDraw can be used to supress flashes or checkerboarding |
+ // when such behavior would be undesirable. |
+ void setCanDraw(bool can) { m_canDraw = can; } |
+ |
+ void didLoseContext(); |
+ void didRecreateContext(); |
+ |
+ // Exposed for testing purposes. |
+ void setMaximumNumberOfFailedDrawsBeforeDrawIsForced(int); |
+ |
+ std::string toString(); |
+ |
+protected: |
+ bool shouldDrawForced() const; |
+ bool drawSuspendedUntilCommit() const; |
+ bool scheduledToDraw() const; |
+ bool shouldDraw() const; |
+ bool shouldAcquireLayerTexturesForMainThread() const; |
+ bool hasDrawnThisFrame() const; |
+ |
+ CommitState m_commitState; |
+ |
+ int m_currentFrameNumber; |
+ int m_lastFrameNumberWhereDrawWasCalled; |
+ int m_consecutiveFailedDraws; |
+ int m_maximumNumberOfFailedDrawsBeforeDrawIsForced; |
+ bool m_needsRedraw; |
+ bool m_needsForcedRedraw; |
+ bool m_needsForcedRedrawAfterNextCommit; |
+ bool m_needsCommit; |
+ bool m_needsForcedCommit; |
+ bool m_mainThreadNeedsLayerTextures; |
+ bool m_insideVSync; |
+ bool m_visible; |
+ bool m_canBeginFrame; |
+ bool m_canDraw; |
+ bool m_drawIfPossibleFailed; |
+ TextureState m_textureState; |
+ ContextState m_contextState; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CCSchedulerStateMachine); |
+}; |
+ |
+} |
+ |
+#endif // CCSchedulerStateMachine_h |