| Index: ui/compositor/compositor.cc
|
| diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
|
| index f3a3c8bd74c6830c0db843127f5beefd70db0e18..91e550344182a924ded8f8ba601f6e3cd95b546b 100644
|
| --- a/ui/compositor/compositor.cc
|
| +++ b/ui/compositor/compositor.cc
|
| @@ -8,9 +8,11 @@
|
| #include <deque>
|
|
|
| #include "base/bind.h"
|
| +#include "base/cancelable_callback.h"
|
| #include "base/command_line.h"
|
| #include "base/memory/singleton.h"
|
| #include "base/message_loop.h"
|
| +#include "base/run_loop.h"
|
| #include "base/string_util.h"
|
| #include "base/threading/thread.h"
|
| #include "base/threading/thread_restrictions.h"
|
| @@ -104,6 +106,51 @@ void ResetImplicitFactory() {
|
|
|
| namespace ui {
|
|
|
| +class DrawWaiter : public ui::CompositorObserver {
|
| + public:
|
| + DrawWaiter() : did_draw_(false) {}
|
| +
|
| + bool Wait(ui::Compositor* compositor) {
|
| + did_draw_ = false;
|
| + compositor->AddObserver(this);
|
| + wait_run_loop_.reset(new base::RunLoop());
|
| + base::CancelableClosure timeout(
|
| + base::Bind(&DrawWaiter::TimedOutWhileWaiting,
|
| + base::Unretained(this)));
|
| + MessageLoop::current()->PostDelayedTask(
|
| + FROM_HERE, timeout.callback(),
|
| + base::TimeDelta::FromMilliseconds(compositor->kDrawWaitTimeOutMs));
|
| + wait_run_loop_->Run();
|
| + compositor->RemoveObserver(this);
|
| + return did_draw_;
|
| + }
|
| +
|
| + private:
|
| + void TimedOutWhileWaiting() {
|
| + LOG(ERROR) << "Timed out waiting for draw.";
|
| + wait_run_loop_->Quit();
|
| + }
|
| +
|
| + // ui::CompositorObserver implementation.
|
| + virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE {}
|
| + virtual void OnCompositingStarted(Compositor* compositor,
|
| + base::TimeTicks start_time) OVERRIDE {}
|
| + virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE {
|
| + did_draw_ = true;
|
| + wait_run_loop_->Quit();
|
| + }
|
| + virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE {}
|
| + virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE {}
|
| + virtual void OnUpdateVSyncParameters(Compositor* compositor,
|
| + base::TimeTicks timebase,
|
| + base::TimeDelta interval) OVERRIDE {}
|
| +
|
| + scoped_ptr<base::RunLoop> wait_run_loop_;
|
| + bool did_draw_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DrawWaiter);
|
| +};
|
| +
|
| // static
|
| ContextFactory* ContextFactory::GetInstance() {
|
| if (!g_context_factory)
|
| @@ -697,6 +744,11 @@ scoped_refptr<CompositorLock> Compositor::GetCompositorLock() {
|
| return compositor_lock_;
|
| }
|
|
|
| +bool Compositor::WaitForDraw() {
|
| + DrawWaiter draw_waiter;
|
| + return draw_waiter.Wait(this);
|
| +}
|
| +
|
| void Compositor::UnlockCompositor() {
|
| DCHECK(compositor_lock_);
|
| compositor_lock_ = NULL;
|
|
|