Index: ui/compositor/compositor.h |
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h |
index 99e30e965a33334f4179a716654b0e675596682d..fe85a4e2e150cc040e2ab2437d21f1ccc194b240 100644 |
--- a/ui/compositor/compositor.h |
+++ b/ui/compositor/compositor.h |
@@ -24,6 +24,7 @@ |
#include "third_party/skia/include/core/SkColor.h" |
#include "ui/compositor/compositor_animation_observer.h" |
#include "ui/compositor/compositor_export.h" |
+#include "ui/compositor/compositor_lock.h" |
#include "ui/compositor/compositor_observer.h" |
#include "ui/compositor/layer_animator_collection.h" |
#include "ui/gfx/color_space.h" |
@@ -68,7 +69,7 @@ class Layer; |
class Reflector; |
class ScopedAnimationDurationScaleMode; |
-const int kCompositorLockTimeoutMs = 67; |
+constexpr int kCompositorLockTimeoutMs = 67; |
class COMPOSITOR_EXPORT ContextFactoryObserver { |
public: |
@@ -167,32 +168,6 @@ class COMPOSITOR_EXPORT ContextFactory { |
virtual void RemoveObserver(ContextFactoryObserver* observer) = 0; |
}; |
-// This class represents a lock on the compositor, that can be used to prevent |
-// commits to the compositor tree while we're waiting for an asynchronous |
-// event. The typical use case is when waiting for a renderer to produce a frame |
-// at the right size. The caller keeps a reference on this object, and drops the |
-// reference once it desires to release the lock. |
-// By default, the lock will be cancelled after a short timeout to ensure |
-// responsiveness of the UI, so the compositor tree should be kept in a |
-// "reasonable" state while the lock is held. If the compositor sets |
-// locks to not time out, then the lock will remain in effect until destroyed. |
-// Don't instantiate this class directly, use Compositor::GetCompositorLock. |
-class COMPOSITOR_EXPORT CompositorLock |
- : public base::RefCounted<CompositorLock>, |
- public base::SupportsWeakPtr<CompositorLock> { |
- private: |
- friend class base::RefCounted<CompositorLock>; |
- friend class Compositor; |
- |
- explicit CompositorLock(Compositor* compositor); |
- ~CompositorLock(); |
- |
- void CancelLock(); |
- |
- Compositor* compositor_; |
- DISALLOW_COPY_AND_ASSIGN(CompositorLock); |
-}; |
- |
// Compositor object to take care of GPU painting. |
// A Browser compositor object is responsible for generating the final |
// displayable form of pixels comprising a single widget's contents. It draws an |
@@ -200,7 +175,8 @@ class COMPOSITOR_EXPORT CompositorLock |
// view hierarchy. |
class COMPOSITOR_EXPORT Compositor |
: NON_EXPORTED_BASE(public cc::LayerTreeHostClient), |
- NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { |
+ NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient), |
+ NON_EXPORTED_BASE(public CompositorLockDelegate) { |
public: |
Compositor(const cc::FrameSinkId& frame_sink_id, |
ui::ContextFactory* context_factory, |
@@ -325,16 +301,13 @@ class COMPOSITOR_EXPORT Compositor |
void RemoveAnimationObserver(CompositorAnimationObserver* observer); |
bool HasAnimationObserver(const CompositorAnimationObserver* observer) const; |
- // Change the timeout behavior for all future locks that are created. Locks |
- // should time out if there is an expectation that the compositor will be |
- // responsive. |
- void SetLocksWillTimeOut(bool locks_will_time_out) { |
- locks_will_time_out_ = locks_will_time_out; |
- } |
- |
// Creates a compositor lock. Returns NULL if it is not possible to lock at |
- // this time (i.e. we're waiting to complete a previous unlock). |
- scoped_refptr<CompositorLock> GetCompositorLock(); |
+ // this time (i.e. we're waiting to complete a previous unlock). If the |
+ // timeout is null, then no timeout is used. |
+ std::unique_ptr<CompositorLock> GetCompositorLock( |
+ CompositorLockClient* client, |
+ base::TimeDelta timeout = |
+ base::TimeDelta::FromMilliseconds(kCompositorLockTimeoutMs)); |
// Internal functions, called back by command-buffer contexts on swap buffer |
// events. |
@@ -374,7 +347,7 @@ class COMPOSITOR_EXPORT Compositor |
void DidSubmitCompositorFrame() override; |
void DidLoseCompositorFrameSink() override {} |
- bool IsLocked() { return compositor_lock_ != NULL; } |
+ bool IsLocked() { return !active_locks_.empty(); } |
void SetOutputIsSecure(bool output_is_secure); |
@@ -392,13 +365,12 @@ class COMPOSITOR_EXPORT Compositor |
private: |
friend class base::RefCounted<Compositor>; |
- friend class CompositorLock; |
- // Called by CompositorLock. |
- void UnlockCompositor(); |
+ // CompositorLockDelegate implementation. |
+ void RemoveCompositorLock(CompositorLock* lock) override; |
- // Called to release any pending CompositorLock |
- void CancelCompositorLock(); |
+ // Causes all active CompositorLocks to be timed out. |
+ void TimeoutLocks(); |
gfx::Size size_; |
@@ -406,22 +378,22 @@ class COMPOSITOR_EXPORT Compositor |
ui::ContextFactoryPrivate* context_factory_private_; |
// The root of the Layer tree drawn by this compositor. |
- Layer* root_layer_; |
+ Layer* root_layer_ = nullptr; |
base::ObserverList<CompositorObserver, true> observer_list_; |
base::ObserverList<CompositorAnimationObserver> animation_observer_list_; |
- gfx::AcceleratedWidget widget_; |
+ gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget; |
// A sequence number of a current compositor frame for use with metrics. |
- int activated_frame_count_; |
+ int activated_frame_count_ = 0; |
- // current VSYNC refresh rate per second. |
- float refresh_rate_; |
+ // Current vsync refresh rate per second. |
+ float refresh_rate_ = 0.f; |
// A map from child id to parent id. |
std::unordered_set<cc::FrameSinkId, cc::FrameSinkIdHash> child_frame_sinks_; |
- bool widget_valid_; |
- bool compositor_frame_sink_requested_; |
+ bool widget_valid_ = false; |
+ bool compositor_frame_sink_requested_ = false; |
const cc::FrameSinkId frame_sink_id_; |
scoped_refptr<cc::Layer> root_web_layer_; |
std::unique_ptr<cc::AnimationHost> animation_host_; |
@@ -433,10 +405,9 @@ class COMPOSITOR_EXPORT Compositor |
// The device scale factor of the monitor that this compositor is compositing |
// layers on. |
- float device_scale_factor_; |
+ float device_scale_factor_ = 0.f; |
- bool locks_will_time_out_; |
- CompositorLock* compositor_lock_; |
+ std::vector<CompositorLock*> active_locks_; |
LayerAnimatorCollection layer_animator_collection_; |
scoped_refptr<cc::AnimationTimeline> animation_timeline_; |
@@ -446,6 +417,7 @@ class COMPOSITOR_EXPORT Compositor |
gfx::ColorSpace blending_color_space_; |
base::WeakPtrFactory<Compositor> weak_ptr_factory_; |
+ base::WeakPtrFactory<Compositor> lock_timeout_weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(Compositor); |
}; |