Revert of Make ui::Compositor use ui::Scheduler (patchset #2 id:20001 of https://codereview.chromium.org/638653003/)

This reverts commit 36b7fc7f8b05ea627873e58a162c1c26784e472d.

Reason for revert:
Speculatively reverting as I suspect it may be the cause of test failures like this:

[16079:16079:1009/052004:FATAL:compositor.cc(303)] Check failed: !IsLocked().

http://build.chromium.org/p/chromium.linux/builders/Linux%20Tests%20%28dbg%29%281%29%2832%29/builds/6451

Original issue's description:
> Make ui::Compositor use ui::Scheduler
>
> Taken from enne's CL 535733002 and rebased. It has been taken out of CL 134623005.
>
> BUG=329552
>
> Committed: https://crrev.com/36b7fc7f8b05ea627873e58a162c1c26784e472d
> Cr-Commit-Position: refs/heads/master@{#298779}

[email protected],[email protected],[email protected],[email protected]
NOTREECHECKS=true
NOTRY=true
BUG=329552

Review URL: https://codereview.chromium.org/640293003

Cr-Commit-Position: refs/heads/master@{#298919}
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 19cf689..1b6f342 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -62,6 +62,12 @@
   compositor_ = NULL;
 }
 
+}  // namespace ui
+
+namespace {}  // namespace
+
+namespace ui {
+
 Compositor::Compositor(gfx::AcceleratedWidget widget,
                        ui::ContextFactory* context_factory,
                        scoped_refptr<base::SingleThreadTaskRunner> task_runner)
@@ -72,9 +78,16 @@
       task_runner_(task_runner),
       vsync_manager_(new CompositorVSyncManager()),
       device_scale_factor_(0.0f),
+      last_started_frame_(0),
+      last_ended_frame_(0),
       disable_schedule_composite_(false),
       compositor_lock_(NULL),
-      layer_animator_collection_(this) {
+      defer_draw_scheduling_(false),
+      waiting_on_compositing_end_(false),
+      draw_on_compositing_end_(false),
+      swap_state_(SWAP_NONE),
+      layer_animator_collection_(this),
+      schedule_draw_factory_(this) {
   root_web_layer_ = cc::Layer::Create();
 
   CommandLine* command_line = CommandLine::ForCurrentProcess();
@@ -122,6 +135,7 @@
 
   settings.impl_side_painting = IsUIImplSidePaintingEnabled();
   settings.use_zero_copy = IsUIZeroCopyEnabled();
+  settings.single_thread_proxy_scheduler = false;
 
   base::TimeTicks before_create = base::TimeTicks::Now();
   if (compositor_thread_loop_.get()) {
@@ -162,7 +176,14 @@
 }
 
 void Compositor::ScheduleDraw() {
-  host_->SetNeedsCommit();
+  if (compositor_thread_loop_.get()) {
+    host_->SetNeedsCommit();
+  } else if (!defer_draw_scheduling_) {
+    defer_draw_scheduling_ = true;
+    task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&Compositor::Draw, schedule_draw_factory_.GetWeakPtr()));
+  }
 }
 
 void Compositor::SetRootLayer(Layer* root_layer) {
@@ -183,19 +204,44 @@
   host_->set_has_transparent_background(host_has_transparent_background);
 }
 
+void Compositor::Draw() {
+  DCHECK(!compositor_thread_loop_.get());
+
+  defer_draw_scheduling_ = false;
+  if (waiting_on_compositing_end_) {
+    draw_on_compositing_end_ = true;
+    return;
+  }
+  if (!root_layer_)
+    return;
+
+  TRACE_EVENT_ASYNC_BEGIN0("ui", "Compositor::Draw", last_started_frame_ + 1);
+
+  DCHECK_NE(swap_state_, SWAP_POSTED);
+  swap_state_ = SWAP_NONE;
+
+  waiting_on_compositing_end_ = true;
+  last_started_frame_++;
+  if (!IsLocked()) {
+    // TODO(nduca): Temporary while compositor calls
+    // compositeImmediately() directly.
+    cc::BeginFrameArgs args =
+        cc::BeginFrameArgs::Create(gfx::FrameTime::Now(),
+                                   base::TimeTicks(),
+                                   cc::BeginFrameArgs::DefaultInterval());
+    BeginMainFrame(args);
+    host_->Composite(args.frame_time);
+  }
+  if (swap_state_ == SWAP_NONE)
+    NotifyEnd();
+}
+
 void Compositor::ScheduleFullRedraw() {
-  // TODO(enne): Some callers (mac) call this function expecting that it
-  // will also commit.  This should probably just redraw the screen
-  // from damage and not commit.  ScheduleDraw/ScheduleRedraw need
-  // better names.
   host_->SetNeedsRedraw();
-  host_->SetNeedsCommit();
 }
 
 void Compositor::ScheduleRedrawRect(const gfx::Rect& damage_rect) {
-  // TODO(enne): Make this not commit.  See ScheduleFullRedraw.
   host_->SetNeedsRedrawRect(damage_rect);
-  host_->SetNeedsCommit();
 }
 
 void Compositor::FinishAllRendering() {
@@ -307,30 +353,45 @@
 }
 
 void Compositor::DidCommitAndDrawFrame() {
-}
-
-void Compositor::DidCompleteSwapBuffers() {
-  // DidPostSwapBuffers is a SingleThreadProxy-only feature.  Synthetically
-  // generate OnCompositingStarted messages for the threaded case so that
-  // OnCompositingStarted/OnCompositingEnded messages match.
-  if (compositor_thread_loop_.get()) {
-    base::TimeTicks start_time = gfx::FrameTime::Now();
-    FOR_EACH_OBSERVER(CompositorObserver,
-                      observer_list_,
-                      OnCompositingStarted(this, start_time));
-  }
-  FOR_EACH_OBSERVER(
-      CompositorObserver, observer_list_, OnCompositingEnded(this));
-}
-
-void Compositor::DidPostSwapBuffers() {
   base::TimeTicks start_time = gfx::FrameTime::Now();
   FOR_EACH_OBSERVER(CompositorObserver,
                     observer_list_,
                     OnCompositingStarted(this, start_time));
 }
 
+void Compositor::DidCompleteSwapBuffers() {
+  if (compositor_thread_loop_.get()) {
+    NotifyEnd();
+  } else {
+    DCHECK_EQ(swap_state_, SWAP_POSTED);
+    NotifyEnd();
+    swap_state_ = SWAP_COMPLETED;
+  }
+}
+
+void Compositor::ScheduleComposite() {
+  if (!disable_schedule_composite_)
+    ScheduleDraw();
+}
+
+void Compositor::ScheduleAnimation() {
+  ScheduleComposite();
+}
+
+void Compositor::DidPostSwapBuffers() {
+  DCHECK(!compositor_thread_loop_.get());
+  DCHECK_EQ(swap_state_, SWAP_NONE);
+  swap_state_ = SWAP_POSTED;
+}
+
 void Compositor::DidAbortSwapBuffers() {
+  if (!compositor_thread_loop_.get()) {
+    if (swap_state_ == SWAP_POSTED) {
+      NotifyEnd();
+      swap_state_ = SWAP_COMPLETED;
+    }
+  }
+
   FOR_EACH_OBSERVER(CompositorObserver,
                     observer_list_,
                     OnCompositingAborted(this));
@@ -348,7 +409,8 @@
 scoped_refptr<CompositorLock> Compositor::GetCompositorLock() {
   if (!compositor_lock_) {
     compositor_lock_ = new CompositorLock(this);
-    host_->SetDeferCommits(true);
+    if (compositor_thread_loop_.get())
+      host_->SetDeferCommits(true);
     FOR_EACH_OBSERVER(CompositorObserver,
                       observer_list_,
                       OnCompositingLockStateChanged(this));
@@ -359,7 +421,8 @@
 void Compositor::UnlockCompositor() {
   DCHECK(compositor_lock_);
   compositor_lock_ = NULL;
-  host_->SetDeferCommits(false);
+  if (compositor_thread_loop_.get())
+    host_->SetDeferCommits(false);
   FOR_EACH_OBSERVER(CompositorObserver,
                     observer_list_,
                     OnCompositingLockStateChanged(this));
@@ -370,4 +433,20 @@
     compositor_lock_->CancelLock();
 }
 
+void Compositor::NotifyEnd() {
+  last_ended_frame_++;
+  TRACE_EVENT_ASYNC_END0("ui", "Compositor::Draw", last_ended_frame_);
+  waiting_on_compositing_end_ = false;
+  if (draw_on_compositing_end_) {
+    draw_on_compositing_end_ = false;
+
+    // Call ScheduleDraw() instead of Draw() in order to allow other
+    // CompositorObservers to be notified before starting another
+    // draw cycle.
+    ScheduleDraw();
+  }
+  FOR_EACH_OBSERVER(
+      CompositorObserver, observer_list_, OnCompositingEnded(this));
+}
+
 }  // namespace ui