| // Copyright 2013 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_TREES_SWAP_PROMISE_H_ |
| #define CC_TREES_SWAP_PROMISE_H_ |
| |
| #include <stdint.h> |
| |
| #include "cc/cc_export.h" |
| #include "components/viz/common/quads/compositor_frame_metadata.h" |
| |
| namespace cc { |
| |
| // When a change to the compositor's state/invalidation/whatever happens, a |
| // Swap Promise can be inserted into LayerTreeHost/LayerTreeImpl, to track |
| // whether the compositor's reply to the new state/invaliadtion/whatever is |
| // completed in the compositor, i.e. the compositor knows it has been sent |
| // to its output or not. |
| // |
| // If the commit results in a successful activation of the pending layer tree, |
| // SwapPromise::DidActivate() will be called. |
| // |
| // If the new compositor state is goint to be sent to the output, |
| // SwapPromise::WillSwap() will be called before the swap and |
| // SwapPromise::DidSwap() will be called once the swap is over. |
| // |
| // If the scheduler fails to activate the pending tree, or the compositor |
| // fails to send its new state to the output, SwapPromise::DidNotSwap() will |
| // be called. Note that it is possible to activate, and subsequently not swap. |
| // |
| // Promises complete afer either DidSwap() or DidNotSwap() is called, thus |
| // there are three possible call sequences: |
| // DidNotSwap() |
| // DidActivate() ; WillSwap(); DidSwap() |
| // DidActivate() ; DidNotSwap() |
| // |
| // Clients that wish to use SwapPromise should have a subclass that defines |
| // the behavior of DidActivate(), WillSwap(), DidSwap() and DidNotSwap(). Notice |
| // that the promise can be broken at either main or impl thread, e.g. commit |
| // fails on main thread, new frame data has no actual damage so |
| // LayerTreeHostImpl::SwapBuffers() bails out early on impl thread, so don't |
| // assume that DidNotSwap() method is called at a particular thread. It is |
| // better to let the subclass carry thread-safe member data and operate on that |
| // member data in DidNotSwap(). |
| class CC_EXPORT SwapPromise { |
| public: |
| enum DidNotSwapReason { |
| SWAP_FAILS, |
| COMMIT_FAILS, |
| COMMIT_NO_UPDATE, |
| ACTIVATION_FAILS, |
| }; |
| |
| SwapPromise() {} |
| virtual ~SwapPromise() {} |
| |
| virtual void DidActivate() = 0; |
| virtual void WillSwap(viz::CompositorFrameMetadata* metadata) = 0; |
| virtual void DidSwap() = 0; |
| virtual void DidNotSwap(DidNotSwapReason reason) = 0; |
| // This is called when the main thread starts a (blocking) commit |
| virtual void OnCommit() {} |
| |
| // A non-zero trace id identifies a trace flow object that is embedded in the |
| // swap promise. This can be used for registering additional flow steps to |
| // visualize the object's path through the system. |
| virtual int64_t TraceId() const = 0; |
| }; |
| |
| } // namespace cc |
| |
| #endif // CC_TREES_SWAP_PROMISE_H_ |