diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-21 01:26:20 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-21 01:26:20 +0000 |
commit | 3b6085517f7d4f277005f9262ab18c16af0228da (patch) | |
tree | ead374a0eec34f53ca63a8312a49728de14dba39 /ui | |
parent | 39f0d78efeadbfc81432a33a9ac2a1bea3abac1f (diff) | |
download | chromium_src-3b6085517f7d4f277005f9262ab18c16af0228da.zip chromium_src-3b6085517f7d4f277005f9262ab18c16af0228da.tar.gz chromium_src-3b6085517f7d4f277005f9262ab18c16af0228da.tar.bz2 |
CrOS: Schedule renderer drawing to hardware vsync.
Before this patch, the renderer scheduled drawing assuming a 60Hz refresh rate
at an arbitrary timebase. With this patch, we send a hardware vsync signal to
the renderer. The timbase is offset slightly so that the browser UI and
renderer do not draw at the same time.
BUG=157223
Review URL: https://chromiumcodereview.appspot.com/12218055
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@183696 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/aura/bench/bench_main.cc | 8 | ||||
-rw-r--r-- | ui/aura/root_window.cc | 8 | ||||
-rw-r--r-- | ui/aura/root_window.h | 6 | ||||
-rw-r--r-- | ui/compositor/compositor.cc | 10 | ||||
-rw-r--r-- | ui/compositor/compositor.h | 7 | ||||
-rw-r--r-- | ui/compositor/compositor_observer.h | 9 | ||||
-rw-r--r-- | ui/compositor/layer_unittest.cc | 8 |
7 files changed, 49 insertions, 7 deletions
diff --git a/ui/aura/bench/bench_main.cc b/ui/aura/bench/bench_main.cc index a0c3d1c..3daedeb 100644 --- a/ui/aura/bench/bench_main.cc +++ b/ui/aura/bench/bench_main.cc @@ -95,7 +95,8 @@ class BenchCompositorObserver : public ui::CompositorObserver { virtual void OnCompositingDidCommit(ui::Compositor* compositor) OVERRIDE {} - virtual void OnCompositingStarted(Compositor* compositor) OVERRIDE {} + virtual void OnCompositingStarted(Compositor* compositor, + base::TimeTicks start_time) OVERRIDE {} virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE { if (start_time_.is_null()) { @@ -121,6 +122,11 @@ class BenchCompositorObserver : public ui::CompositorObserver { virtual void OnCompositingLockStateChanged( Compositor* compositor) OVERRIDE {} + virtual void OnUpdateVSyncParameters(ui::Compositor* compositor, + base::TimeTicks timebase, + base::TimeDelta interval) OVERRIDE { + } + virtual void Draw() {} int frames() const { return frames_; } diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc index 4013173..7305ca7 100644 --- a/ui/aura/root_window.cc +++ b/ui/aura/root_window.cc @@ -476,7 +476,8 @@ void RootWindow::ScheduleDraw() { void RootWindow::OnCompositingDidCommit(ui::Compositor*) { } -void RootWindow::OnCompositingStarted(ui::Compositor*) { +void RootWindow::OnCompositingStarted(ui::Compositor*, + base::TimeTicks start_time) { } void RootWindow::OnCompositingEnded(ui::Compositor*) { @@ -499,6 +500,11 @@ void RootWindow::OnCompositingAborted(ui::Compositor*) { void RootWindow::OnCompositingLockStateChanged(ui::Compositor*) { } +void RootWindow::OnUpdateVSyncParameters(ui::Compositor* compositor, + base::TimeTicks timebase, + base::TimeDelta interval) { +} + //////////////////////////////////////////////////////////////////////////////// // RootWindow, ui::LayerDelegate implementation: diff --git a/ui/aura/root_window.h b/ui/aura/root_window.h index 0a54f1a..6102302 100644 --- a/ui/aura/root_window.h +++ b/ui/aura/root_window.h @@ -244,10 +244,14 @@ class AURA_EXPORT RootWindow : public ui::CompositorDelegate, // Overridden from ui::CompositorObserver: virtual void OnCompositingDidCommit(ui::Compositor*) OVERRIDE; - virtual void OnCompositingStarted(ui::Compositor*) OVERRIDE; + virtual void OnCompositingStarted(ui::Compositor*, + base::TimeTicks start_time) OVERRIDE; virtual void OnCompositingEnded(ui::Compositor*) OVERRIDE; virtual void OnCompositingAborted(ui::Compositor*) OVERRIDE; virtual void OnCompositingLockStateChanged(ui::Compositor*) OVERRIDE; + virtual void OnUpdateVSyncParameters(ui::Compositor* compositor, + base::TimeTicks timebase, + base::TimeDelta interval) OVERRIDE; // Overridden from ui::LayerDelegate: virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE; diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index 923d10d..372a039 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc @@ -442,6 +442,13 @@ void Compositor::OnSwapBuffersAborted() { OnCompositingAborted(this)); } +void Compositor::OnUpdateVSyncParameters(base::TimeTicks timebase, + base::TimeDelta interval) { + FOR_EACH_OBSERVER(CompositorObserver, + observer_list_, + OnUpdateVSyncParameters(this, timebase, interval)); +} + void Compositor::willBeginFrame() { } @@ -495,9 +502,10 @@ void Compositor::didCommit() { } void Compositor::didCommitAndDrawFrame() { + base::TimeTicks start_time = base::TimeTicks::Now(); FOR_EACH_OBSERVER(CompositorObserver, observer_list_, - OnCompositingStarted(this)); + OnCompositingStarted(this, start_time)); } void Compositor::didCompleteSwapBuffers() { diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 2352be2..5cc806d 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h @@ -9,6 +9,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/observer_list.h" +#include "base/time.h" #include "cc/layer_tree_host_client.h" #include "ui/compositor/compositor_export.h" #include "ui/gfx/native_widget_types.h" @@ -174,7 +175,8 @@ class COMPOSITOR_EXPORT CompositorLock // appropriately transformed texture for each transformed view in the widget's // view hierarchy. class COMPOSITOR_EXPORT Compositor - : NON_EXPORTED_BASE(public cc::LayerTreeHostClient) { + : NON_EXPORTED_BASE(public cc::LayerTreeHostClient), + public base::SupportsWeakPtr<Compositor> { public: Compositor(CompositorDelegate* delegate, gfx::AcceleratedWidget widget); @@ -250,6 +252,9 @@ class COMPOSITOR_EXPORT Compositor // Signals swap has aborted (e.g. lost context). void OnSwapBuffersAborted(); + void OnUpdateVSyncParameters(base::TimeTicks timebase, + base::TimeDelta interval); + // LayerTreeHostClient implementation. virtual void willBeginFrame() OVERRIDE; virtual void didBeginFrame() OVERRIDE; diff --git a/ui/compositor/compositor_observer.h b/ui/compositor/compositor_observer.h index 4157453..ec93988 100644 --- a/ui/compositor/compositor_observer.h +++ b/ui/compositor/compositor_observer.h @@ -5,6 +5,7 @@ #ifndef UI_COMPOSITOR_COMPOSITOR_OBSERVER_H_ #define UI_COMPOSITOR_COMPOSITOR_OBSERVER_H_ +#include "base/time.h" #include "ui/compositor/compositor_export.h" namespace ui { @@ -25,7 +26,8 @@ class COMPOSITOR_EXPORT CompositorObserver { // Called when compositing started: it has taken all the layer changes into // account and has issued the graphics commands. - virtual void OnCompositingStarted(Compositor* compositor) = 0; + virtual void OnCompositingStarted(Compositor* compositor, + base::TimeTicks start_time) = 0; // Called when compositing completes: the present to screen has completed. virtual void OnCompositingEnded(Compositor* compositor) = 0; @@ -36,6 +38,11 @@ class COMPOSITOR_EXPORT CompositorObserver { // Called when the compositor lock state changes. virtual void OnCompositingLockStateChanged(Compositor* compositor) = 0; + // Called when the compositor has received updated VSync parameters. + virtual void OnUpdateVSyncParameters(Compositor* compositor, + base::TimeTicks timebase, + base::TimeDelta interval) = 0; + protected: virtual ~CompositorObserver() {} }; diff --git a/ui/compositor/layer_unittest.cc b/ui/compositor/layer_unittest.cc index c641e8f..1e75c71 100644 --- a/ui/compositor/layer_unittest.cc +++ b/ui/compositor/layer_unittest.cc @@ -277,7 +277,8 @@ class TestCompositorObserver : public CompositorObserver { virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE { } - virtual void OnCompositingStarted(Compositor* compositor) OVERRIDE { + virtual void OnCompositingStarted(Compositor* compositor, + base::TimeTicks start_time) OVERRIDE { started_ = true; } @@ -292,6 +293,11 @@ class TestCompositorObserver : public CompositorObserver { virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE { } + virtual void OnUpdateVSyncParameters(Compositor* compositor, + base::TimeTicks timebase, + base::TimeDelta interval) OVERRIDE { + } + bool started_; bool ended_; bool aborted_; |