[go: nahoru, domu]

Allow cc to depend on viz/client, instead of vice-versa.

After this viz/client/ does not use cc/ (only cc/base/), and does not
include any mojo-bindings-specific code. We add a negative DEPS rule for
them with a comment, as well as mentioning it in the viz/README.md for
the client/ directory.

The ClientLayerTreeFrameSink from viz/client/ moves to cc/mojo_embedder/
which is a separate component from cc that is able to depend on mojo
bindings. This keeps viz/client/ and cc/ agnostic to the means for
communicating with viz, as webview uses classic IPC to get to the viz
process, and deprecated browser compositor uses in-process communication
with viz.

The public viz mojoms had dependencies on cc/ in their typemaps but they
were incorrect as the types have all moved to the viz component, so these
DEPS are updated to reflect that.

After this, allowed dependencies look like:
aura,content -> cc/mojo_embedder -> cc,mojo-bindings
cc -> viz/client,viz/common

R=kylechar@chromium.org
TBR=dcheng

Bug: 722935
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: Iec542fcc20f7b2bd2a42737c51dc30e0a4180de6
Reviewed-on: https://chromium-review.googlesource.com/1072314
Commit-Queue: danakj <danakj@chromium.org>
Reviewed-by: kylechar <kylechar@chromium.org>
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#561965}
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 4f6b936..af63935 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -369,7 +369,7 @@
     "//base",
     "//base/third_party/dynamic_annotations",
     "//components/ukm",
-    "//components/viz/common",
+    "//components/viz/client",
     "//gpu",
     "//gpu/command_buffer/client:gles2_interface",
     "//gpu/command_buffer/client:raster_interface",
@@ -536,6 +536,7 @@
     "//cc/paint",
     "//components/ukm",
     "//components/ukm:test_support",
+    "//components/viz/client",
     "//components/viz/common",
     "//components/viz/service",
     "//components/viz/test:test_support",
@@ -618,6 +619,7 @@
     "layers/video_frame_provider_client_impl_unittest.cc",
     "layers/video_layer_impl_unittest.cc",
     "layers/viewport_unittest.cc",
+    "mojo_embedder/async_layer_tree_frame_sink_unittest.cc",
     "paint/discardable_image_map_unittest.cc",
     "paint/display_item_list_unittest.cc",
     "paint/filter_operations_unittest.cc",
@@ -729,8 +731,10 @@
     ":cc",
     ":test_support",
     "//base/test:test_support",
+    "//cc/mojo_embedder",
     "//cc/paint",
     "//components/ukm:test_support",
+    "//components/viz/client",
     "//components/viz/common",
     "//components/viz/service",
     "//components/viz/test:test_support",
diff --git a/cc/DEPS b/cc/DEPS
index 2e684073..cd44e0c 100644
--- a/cc/DEPS
+++ b/cc/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+components/ukm/test_ukm_recorder.h",
+  "+components/viz/client",
   "+components/viz/common",
   "+gpu/GLES2",
   "+gpu/command_buffer/client/context_support.h",
@@ -31,6 +32,10 @@
   "+ui/latency/latency_info.h",
   "+ui/gfx",
   "+ui/gl",
+
+  # Do not use mojo bindings in cc/. This library should be agnostic about how
+  # to communicate with viz.
+  "-mojo/public/cpp/bindings",
 ]
 
 specific_include_rules = {
diff --git a/cc/mojo_embedder/BUILD.gn b/cc/mojo_embedder/BUILD.gn
new file mode 100644
index 0000000..3abdc4c
--- /dev/null
+++ b/cc/mojo_embedder/BUILD.gn
@@ -0,0 +1,24 @@
+# Copyright 2017 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.
+
+import("//cc/cc.gni")
+
+cc_component("mojo_embedder") {
+  output_name = "cc_mojo_embedder"
+  sources = [
+    "async_layer_tree_frame_sink.cc",
+    "async_layer_tree_frame_sink.h",
+  ]
+
+  defines = [ "CC_MOJO_EMBEDDER_IMPLEMENTATION" ]
+
+  deps = [
+    "//base",
+    "//cc",
+    "//components/viz/client",
+    "//components/viz/common",
+    "//mojo/public/cpp/bindings",
+    "//services/viz/public/interfaces",
+  ]
+}
diff --git a/cc/mojo_embedder/DEPS b/cc/mojo_embedder/DEPS
new file mode 100644
index 0000000..d5c8e6fc
--- /dev/null
+++ b/cc/mojo_embedder/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+mojo/public/cpp/bindings",
+  "+services/viz/public/interfaces/compositing",
+]
diff --git a/cc/mojo_embedder/README.md b/cc/mojo_embedder/README.md
new file mode 100644
index 0000000..2585c58
--- /dev/null
+++ b/cc/mojo_embedder/README.md
@@ -0,0 +1,4 @@
+# cc/mojo_embedder/
+
+This directory contains mojo bindings for connecting cc to viz via mojo.
+
diff --git a/components/viz/client/client_layer_tree_frame_sink.cc b/cc/mojo_embedder/async_layer_tree_frame_sink.cc
similarity index 68%
rename from components/viz/client/client_layer_tree_frame_sink.cc
rename to cc/mojo_embedder/async_layer_tree_frame_sink.cc
index c779823..b705f42 100644
--- a/components/viz/client/client_layer_tree_frame_sink.cc
+++ b/cc/mojo_embedder/async_layer_tree_frame_sink.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/viz/client/client_layer_tree_frame_sink.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 
 #include <utility>
 
@@ -15,33 +15,32 @@
 #include "components/viz/common/hit_test/hit_test_region_list.h"
 #include "components/viz/common/quads/compositor_frame.h"
 
-namespace viz {
+namespace cc {
+namespace mojo_embedder {
 
-ClientLayerTreeFrameSink::InitParams::InitParams() = default;
+AsyncLayerTreeFrameSink::InitParams::InitParams() = default;
+AsyncLayerTreeFrameSink::InitParams::~InitParams() = default;
 
-ClientLayerTreeFrameSink::InitParams::~InitParams() = default;
+AsyncLayerTreeFrameSink::UnboundMessagePipes::UnboundMessagePipes() = default;
+AsyncLayerTreeFrameSink::UnboundMessagePipes::~UnboundMessagePipes() = default;
 
-ClientLayerTreeFrameSink::UnboundMessagePipes::UnboundMessagePipes() = default;
-
-ClientLayerTreeFrameSink::UnboundMessagePipes::~UnboundMessagePipes() = default;
-
-bool ClientLayerTreeFrameSink::UnboundMessagePipes::HasUnbound() const {
+bool AsyncLayerTreeFrameSink::UnboundMessagePipes::HasUnbound() const {
   return client_request.is_pending() &&
          (compositor_frame_sink_info.is_valid() ^
           compositor_frame_sink_associated_info.is_valid());
 }
 
-ClientLayerTreeFrameSink::UnboundMessagePipes::UnboundMessagePipes(
+AsyncLayerTreeFrameSink::UnboundMessagePipes::UnboundMessagePipes(
     UnboundMessagePipes&& other) = default;
 
-ClientLayerTreeFrameSink::ClientLayerTreeFrameSink(
-    scoped_refptr<ContextProvider> context_provider,
-    scoped_refptr<RasterContextProvider> worker_context_provider,
+AsyncLayerTreeFrameSink::AsyncLayerTreeFrameSink(
+    scoped_refptr<viz::ContextProvider> context_provider,
+    scoped_refptr<viz::RasterContextProvider> worker_context_provider,
     InitParams* params)
-    : cc::LayerTreeFrameSink(std::move(context_provider),
-                             std::move(worker_context_provider),
-                             std::move(params->compositor_task_runner),
-                             params->gpu_memory_buffer_manager),
+    : LayerTreeFrameSink(std::move(context_provider),
+                         std::move(worker_context_provider),
+                         std::move(params->compositor_task_runner),
+                         params->gpu_memory_buffer_manager),
       hit_test_data_provider_(std::move(params->hit_test_data_provider)),
       local_surface_id_provider_(std::move(params->local_surface_id_provider)),
       synthetic_begin_frame_source_(
@@ -54,28 +53,27 @@
   DETACH_FROM_THREAD(thread_checker_);
 }
 
-ClientLayerTreeFrameSink::~ClientLayerTreeFrameSink() {}
+AsyncLayerTreeFrameSink::~AsyncLayerTreeFrameSink() {}
 
-bool ClientLayerTreeFrameSink::BindToClient(
-    cc::LayerTreeFrameSinkClient* client) {
+bool AsyncLayerTreeFrameSink::BindToClient(LayerTreeFrameSinkClient* client) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  if (!cc::LayerTreeFrameSink::BindToClient(client))
+  if (!LayerTreeFrameSink::BindToClient(client))
     return false;
 
   DCHECK(pipes_.HasUnbound());
   if (pipes_.compositor_frame_sink_info.is_valid()) {
     compositor_frame_sink_.Bind(std::move(pipes_.compositor_frame_sink_info));
     compositor_frame_sink_.set_connection_error_with_reason_handler(
-        base::Bind(&ClientLayerTreeFrameSink::OnMojoConnectionError,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&AsyncLayerTreeFrameSink::OnMojoConnectionError,
+                       weak_factory_.GetWeakPtr()));
     compositor_frame_sink_ptr_ = compositor_frame_sink_.get();
   } else if (pipes_.compositor_frame_sink_associated_info.is_valid()) {
     compositor_frame_sink_associated_.Bind(
         std::move(pipes_.compositor_frame_sink_associated_info));
     compositor_frame_sink_associated_.set_connection_error_with_reason_handler(
-        base::Bind(&ClientLayerTreeFrameSink::OnMojoConnectionError,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&AsyncLayerTreeFrameSink::OnMojoConnectionError,
+                       weak_factory_.GetWeakPtr()));
     compositor_frame_sink_ptr_ = compositor_frame_sink_associated_.get();
   }
   client_binding_.Bind(std::move(pipes_.client_request),
@@ -84,7 +82,7 @@
   if (synthetic_begin_frame_source_) {
     client->SetBeginFrameSource(synthetic_begin_frame_source_.get());
   } else {
-    begin_frame_source_ = std::make_unique<ExternalBeginFrameSource>(this);
+    begin_frame_source_ = std::make_unique<viz::ExternalBeginFrameSource>(this);
     begin_frame_source_->OnSetBeginFrameSourcePaused(begin_frames_paused_);
     client->SetBeginFrameSource(begin_frame_source_.get());
   }
@@ -95,7 +93,7 @@
   return true;
 }
 
-void ClientLayerTreeFrameSink::DetachFromClient() {
+void AsyncLayerTreeFrameSink::DetachFromClient() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   client_->SetBeginFrameSource(nullptr);
   begin_frame_source_.reset();
@@ -104,22 +102,23 @@
   compositor_frame_sink_.reset();
   compositor_frame_sink_associated_.reset();
   compositor_frame_sink_ptr_ = nullptr;
-  cc::LayerTreeFrameSink::DetachFromClient();
+  LayerTreeFrameSink::DetachFromClient();
 }
 
-void ClientLayerTreeFrameSink::SetLocalSurfaceId(
-    const LocalSurfaceId& local_surface_id) {
+void AsyncLayerTreeFrameSink::SetLocalSurfaceId(
+    const viz::LocalSurfaceId& local_surface_id) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(local_surface_id.is_valid());
   DCHECK(enable_surface_synchronization_);
   local_surface_id_ = local_surface_id;
 }
 
-void ClientLayerTreeFrameSink::SubmitCompositorFrame(CompositorFrame frame) {
+void AsyncLayerTreeFrameSink::SubmitCompositorFrame(
+    viz::CompositorFrame frame) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(compositor_frame_sink_ptr_);
   DCHECK(frame.metadata.begin_frame_ack.has_damage);
-  DCHECK_LE(BeginFrameArgs::kStartingFrameNumber,
+  DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber,
             frame.metadata.begin_frame_ack.sequence_number);
 
   if (!enable_surface_synchronization_) {
@@ -142,7 +141,7 @@
   TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("cc.debug.ipc"),
                                      &tracing_enabled);
 
-  base::Optional<HitTestRegionList> hit_test_region_list;
+  base::Optional<viz::HitTestRegionList> hit_test_region_list;
   if (hit_test_data_provider_)
     hit_test_region_list = hit_test_data_provider_->GetHitTestData(frame);
   else
@@ -158,33 +157,35 @@
                       : 0);
 }
 
-void ClientLayerTreeFrameSink::DidNotProduceFrame(const BeginFrameAck& ack) {
+void AsyncLayerTreeFrameSink::DidNotProduceFrame(
+    const viz::BeginFrameAck& ack) {
   DCHECK(compositor_frame_sink_ptr_);
   DCHECK(!ack.has_damage);
-  DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
+  DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
   compositor_frame_sink_ptr_->DidNotProduceFrame(ack);
 }
 
-void ClientLayerTreeFrameSink::DidAllocateSharedBitmap(
+void AsyncLayerTreeFrameSink::DidAllocateSharedBitmap(
     mojo::ScopedSharedBufferHandle buffer,
-    const SharedBitmapId& id) {
+    const viz::SharedBitmapId& id) {
   DCHECK(compositor_frame_sink_ptr_);
   compositor_frame_sink_ptr_->DidAllocateSharedBitmap(std::move(buffer), id);
 }
 
-void ClientLayerTreeFrameSink::DidDeleteSharedBitmap(const SharedBitmapId& id) {
+void AsyncLayerTreeFrameSink::DidDeleteSharedBitmap(
+    const viz::SharedBitmapId& id) {
   DCHECK(compositor_frame_sink_ptr_);
   compositor_frame_sink_ptr_->DidDeleteSharedBitmap(id);
 }
 
-void ClientLayerTreeFrameSink::DidReceiveCompositorFrameAck(
-    const std::vector<ReturnedResource>& resources) {
+void AsyncLayerTreeFrameSink::DidReceiveCompositorFrameAck(
+    const std::vector<viz::ReturnedResource>& resources) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   client_->ReclaimResources(resources);
   client_->DidReceiveCompositorFrameAck();
 }
 
-void ClientLayerTreeFrameSink::DidPresentCompositorFrame(
+void AsyncLayerTreeFrameSink::DidPresentCompositorFrame(
     uint32_t presentation_token,
     base::TimeTicks time,
     base::TimeDelta refresh,
@@ -193,42 +194,42 @@
   client_->DidPresentCompositorFrame(presentation_token, time, refresh, flags);
 }
 
-void ClientLayerTreeFrameSink::DidDiscardCompositorFrame(
+void AsyncLayerTreeFrameSink::DidDiscardCompositorFrame(
     uint32_t presentation_token) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   client_->DidDiscardCompositorFrame(presentation_token);
 }
 
-void ClientLayerTreeFrameSink::OnBeginFrame(const BeginFrameArgs& args) {
+void AsyncLayerTreeFrameSink::OnBeginFrame(const viz::BeginFrameArgs& args) {
   if (!needs_begin_frames_) {
     // We had a race with SetNeedsBeginFrame(false) and still need to let the
     // sink know that we didn't use this BeginFrame.
     DidNotProduceFrame(
-        BeginFrameAck(args.source_id, args.sequence_number, false));
+        viz::BeginFrameAck(args.source_id, args.sequence_number, false));
   }
   if (begin_frame_source_)
     begin_frame_source_->OnBeginFrame(args);
 }
 
-void ClientLayerTreeFrameSink::OnBeginFramePausedChanged(bool paused) {
+void AsyncLayerTreeFrameSink::OnBeginFramePausedChanged(bool paused) {
   begin_frames_paused_ = paused;
   if (begin_frame_source_)
     begin_frame_source_->OnSetBeginFrameSourcePaused(paused);
 }
 
-void ClientLayerTreeFrameSink::ReclaimResources(
-    const std::vector<ReturnedResource>& resources) {
+void AsyncLayerTreeFrameSink::ReclaimResources(
+    const std::vector<viz::ReturnedResource>& resources) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   client_->ReclaimResources(resources);
 }
 
-void ClientLayerTreeFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) {
+void AsyncLayerTreeFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) {
   DCHECK(compositor_frame_sink_ptr_);
   needs_begin_frames_ = needs_begin_frames;
   compositor_frame_sink_ptr_->SetNeedsBeginFrame(needs_begin_frames);
 }
 
-void ClientLayerTreeFrameSink::OnMojoConnectionError(
+void AsyncLayerTreeFrameSink::OnMojoConnectionError(
     uint32_t custom_reason,
     const std::string& description) {
   if (custom_reason)
@@ -237,4 +238,5 @@
     client_->DidLoseLayerTreeFrameSink();
 }
 
-}  // namespace viz
+}  // namespace mojo_embedder
+}  // namespace cc
diff --git a/cc/mojo_embedder/async_layer_tree_frame_sink.h b/cc/mojo_embedder/async_layer_tree_frame_sink.h
new file mode 100644
index 0000000..1810393
--- /dev/null
+++ b/cc/mojo_embedder/async_layer_tree_frame_sink.h
@@ -0,0 +1,151 @@
+// Copyright 2017 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_MOJO_EMBEDDER_ASYNC_LAYER_TREE_FRAME_SINK_H_
+#define CC_MOJO_EMBEDDER_ASYNC_LAYER_TREE_FRAME_SINK_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/single_thread_task_runner.h"
+#include "cc/mojo_embedder/mojo_embedder_export.h"
+#include "cc/trees/layer_tree_frame_sink.h"
+#include "components/viz/common/frame_sinks/begin_frame_source.h"
+#include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
+#include "components/viz/common/surfaces/surface_id.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
+
+namespace viz {
+class HitTestDataProvider;
+class LocalSurfaceIdProvider;
+}  // namespace viz
+
+namespace cc {
+namespace mojo_embedder {
+
+// A mojo-based implementation of LayerTreeFrameSink. The typically-used
+// implementation for cc instances that do not share a process with the viz
+// display compositor.
+class CC_MOJO_EMBEDDER_EXPORT AsyncLayerTreeFrameSink
+    : public LayerTreeFrameSink,
+      public viz::mojom::CompositorFrameSinkClient,
+      public viz::ExternalBeginFrameSourceClient {
+ public:
+  struct CC_MOJO_EMBEDDER_EXPORT UnboundMessagePipes {
+    UnboundMessagePipes();
+    ~UnboundMessagePipes();
+    UnboundMessagePipes(UnboundMessagePipes&& other);
+
+    bool HasUnbound() const;
+
+    // Only one of |compositor_frame_sink_info| or
+    // |compositor_frame_sink_associated_info| should be set.
+    viz::mojom::CompositorFrameSinkPtrInfo compositor_frame_sink_info;
+    viz::mojom::CompositorFrameSinkAssociatedPtrInfo
+        compositor_frame_sink_associated_info;
+    viz::mojom::CompositorFrameSinkClientRequest client_request;
+  };
+
+  struct CC_MOJO_EMBEDDER_EXPORT InitParams {
+    InitParams();
+    ~InitParams();
+
+    scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner;
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = nullptr;
+    std::unique_ptr<viz::SyntheticBeginFrameSource>
+        synthetic_begin_frame_source;
+    std::unique_ptr<viz::HitTestDataProvider> hit_test_data_provider;
+    std::unique_ptr<viz::LocalSurfaceIdProvider> local_surface_id_provider;
+    UnboundMessagePipes pipes;
+    bool enable_surface_synchronization = false;
+    bool wants_animate_only_begin_frames = false;
+  };
+
+  AsyncLayerTreeFrameSink(
+      scoped_refptr<viz::ContextProvider> context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
+      InitParams* params);
+
+  ~AsyncLayerTreeFrameSink() override;
+
+  const viz::HitTestDataProvider* hit_test_data_provider() const {
+    return hit_test_data_provider_.get();
+  }
+
+  const viz::LocalSurfaceId& local_surface_id() const {
+    return local_surface_id_;
+  }
+
+  // LayerTreeFrameSink implementation.
+  bool BindToClient(LayerTreeFrameSinkClient* client) override;
+  void DetachFromClient() override;
+  void SetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id) override;
+  void SubmitCompositorFrame(viz::CompositorFrame frame) override;
+  void DidNotProduceFrame(const viz::BeginFrameAck& ack) override;
+  void DidAllocateSharedBitmap(mojo::ScopedSharedBufferHandle buffer,
+                               const viz::SharedBitmapId& id) override;
+  void DidDeleteSharedBitmap(const viz::SharedBitmapId& id) override;
+
+ private:
+  // mojom::CompositorFrameSinkClient implementation:
+  void DidReceiveCompositorFrameAck(
+      const std::vector<viz::ReturnedResource>& resources) override;
+  void DidPresentCompositorFrame(uint32_t presentation_token,
+                                 base::TimeTicks time,
+                                 base::TimeDelta refresh,
+                                 uint32_t flags) override;
+  void DidDiscardCompositorFrame(uint32_t presentation_token) override;
+  void OnBeginFrame(const viz::BeginFrameArgs& begin_frame_args) override;
+  void OnBeginFramePausedChanged(bool paused) override;
+  void ReclaimResources(
+      const std::vector<viz::ReturnedResource>& resources) override;
+
+  // ExternalBeginFrameSourceClient implementation.
+  void OnNeedsBeginFrames(bool needs_begin_frames) override;
+
+  void OnMojoConnectionError(uint32_t custom_reason,
+                             const std::string& description);
+
+  bool begin_frames_paused_ = false;
+  bool needs_begin_frames_ = false;
+  viz::LocalSurfaceId local_surface_id_;
+  std::unique_ptr<viz::HitTestDataProvider> hit_test_data_provider_;
+  std::unique_ptr<viz::LocalSurfaceIdProvider> local_surface_id_provider_;
+  std::unique_ptr<viz::ExternalBeginFrameSource> begin_frame_source_;
+  std::unique_ptr<viz::SyntheticBeginFrameSource> synthetic_begin_frame_source_;
+
+  // Message pipes that will be bound when BindToClient() is called.
+  UnboundMessagePipes pipes_;
+
+  // One of |compositor_frame_sink_| or |compositor_frame_sink_associated_| will
+  // be bound after calling BindToClient(). |compositor_frame_sink_ptr_| will
+  // point to message pipe we want to use.
+  viz::mojom::CompositorFrameSink* compositor_frame_sink_ptr_ = nullptr;
+  viz::mojom::CompositorFrameSinkPtr compositor_frame_sink_;
+  viz::mojom::CompositorFrameSinkAssociatedPtr
+      compositor_frame_sink_associated_;
+  mojo::Binding<viz::mojom::CompositorFrameSinkClient> client_binding_;
+
+  THREAD_CHECKER(thread_checker_);
+  const bool enable_surface_synchronization_;
+  const bool wants_animate_only_begin_frames_;
+
+  viz::LocalSurfaceId last_submitted_local_surface_id_;
+  float last_submitted_device_scale_factor_ = 1.f;
+  gfx::Size last_submitted_size_in_pixels_;
+
+  base::WeakPtrFactory<AsyncLayerTreeFrameSink> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(AsyncLayerTreeFrameSink);
+};
+
+}  // namespace mojo_embedder
+}  // namespace cc
+
+#endif  // CC_MOJO_EMBEDDER_ASYNC_LAYER_TREE_FRAME_SINK_H_
diff --git a/components/viz/client/client_layer_tree_frame_sink_unittest.cc b/cc/mojo_embedder/async_layer_tree_frame_sink_unittest.cc
similarity index 72%
rename from components/viz/client/client_layer_tree_frame_sink_unittest.cc
rename to cc/mojo_embedder/async_layer_tree_frame_sink_unittest.cc
index a554f5c8..70643db 100644
--- a/components/viz/client/client_layer_tree_frame_sink_unittest.cc
+++ b/cc/mojo_embedder/async_layer_tree_frame_sink_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/viz/client/client_layer_tree_frame_sink.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 
 #include <memory>
 
@@ -19,13 +19,14 @@
 #include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace viz {
+namespace cc {
+namespace mojo_embedder {
 namespace {
 
 // Used to track the thread DidLoseLayerTreeFrameSink() is called on (and quit
 // a RunLoop).
 class ThreadTrackingLayerTreeFrameSinkClient
-    : public cc::FakeLayerTreeFrameSinkClient {
+    : public FakeLayerTreeFrameSinkClient {
  public:
   ThreadTrackingLayerTreeFrameSinkClient(
       base::PlatformThreadId* called_thread_id,
@@ -33,10 +34,10 @@
       : called_thread_id_(called_thread_id), run_loop_(run_loop) {}
   ~ThreadTrackingLayerTreeFrameSinkClient() override = default;
 
-  // cc::FakeLayerTreeFrameSinkClient:
+  // FakeLayerTreeFrameSinkClient:
   void DidLoseLayerTreeFrameSink() override {
     EXPECT_FALSE(did_lose_layer_tree_frame_sink_called());
-    cc::FakeLayerTreeFrameSinkClient::DidLoseLayerTreeFrameSink();
+    FakeLayerTreeFrameSinkClient::DidLoseLayerTreeFrameSink();
     *called_thread_id_ = base::PlatformThread::CurrentId();
     run_loop_->Quit();
   }
@@ -48,31 +49,32 @@
   DISALLOW_COPY_AND_ASSIGN(ThreadTrackingLayerTreeFrameSinkClient);
 };
 
-TEST(ClientLayerTreeFrameSinkTest,
+TEST(AsyncLayerTreeFrameSinkTest,
      DidLoseLayerTreeFrameSinkCalledOnConnectionError) {
   base::Thread bg_thread("BG Thread");
   bg_thread.Start();
 
-  scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
-  TestGpuMemoryBufferManager test_gpu_memory_buffer_manager;
+  scoped_refptr<viz::TestContextProvider> provider =
+      viz::TestContextProvider::Create();
+  viz::TestGpuMemoryBufferManager test_gpu_memory_buffer_manager;
 
-  mojom::CompositorFrameSinkPtrInfo sink_info;
-  mojom::CompositorFrameSinkRequest sink_request =
+  viz::mojom::CompositorFrameSinkPtrInfo sink_info;
+  viz::mojom::CompositorFrameSinkRequest sink_request =
       mojo::MakeRequest(&sink_info);
-  mojom::CompositorFrameSinkClientPtr client;
-  mojom::CompositorFrameSinkClientRequest client_request =
+  viz::mojom::CompositorFrameSinkClientPtr client;
+  viz::mojom::CompositorFrameSinkClientRequest client_request =
       mojo::MakeRequest(&client);
 
-  ClientLayerTreeFrameSink::InitParams init_params;
+  AsyncLayerTreeFrameSink::InitParams init_params;
   init_params.compositor_task_runner = bg_thread.task_runner();
   init_params.gpu_memory_buffer_manager = &test_gpu_memory_buffer_manager;
   init_params.pipes.compositor_frame_sink_info = std::move(sink_info);
   init_params.pipes.client_request = std::move(client_request);
   init_params.local_surface_id_provider =
-      std::make_unique<DefaultLocalSurfaceIdProvider>();
+      std::make_unique<viz::DefaultLocalSurfaceIdProvider>();
   init_params.enable_surface_synchronization = true;
-  ClientLayerTreeFrameSink layer_tree_frame_sink(std::move(provider), nullptr,
-                                                 &init_params);
+  AsyncLayerTreeFrameSink layer_tree_frame_sink(std::move(provider), nullptr,
+                                                &init_params);
 
   base::PlatformThreadId called_thread_id = base::kInvalidThreadId;
   base::RunLoop close_run_loop;
@@ -80,7 +82,7 @@
                                                            &close_run_loop);
 
   auto bind_in_background =
-      [](ClientLayerTreeFrameSink* layer_tree_frame_sink,
+      [](AsyncLayerTreeFrameSink* layer_tree_frame_sink,
          ThreadTrackingLayerTreeFrameSinkClient* frame_sink_client) {
         layer_tree_frame_sink->BindToClient(frame_sink_client);
       };
@@ -91,7 +93,7 @@
   // Closes the pipe, which should trigger calling DidLoseLayerTreeFrameSink()
   // (and quitting the RunLoop). There is no need to wait for BindToClient()
   // to complete as mojo::Binding error callbacks are processed asynchronously.
-  sink_request = mojom::CompositorFrameSinkRequest();
+  sink_request = viz::mojom::CompositorFrameSinkRequest();
   close_run_loop.Run();
 
   EXPECT_NE(base::kInvalidThreadId, called_thread_id);
@@ -99,12 +101,11 @@
 
   // DetachFromClient() has to be called on the background thread.
   base::RunLoop detach_run_loop;
-  auto detach_in_background =
-      [](ClientLayerTreeFrameSink* layer_tree_frame_sink,
-         base::RunLoop* detach_run_loop) {
-        layer_tree_frame_sink->DetachFromClient();
-        detach_run_loop->Quit();
-      };
+  auto detach_in_background = [](AsyncLayerTreeFrameSink* layer_tree_frame_sink,
+                                 base::RunLoop* detach_run_loop) {
+    layer_tree_frame_sink->DetachFromClient();
+    detach_run_loop->Quit();
+  };
   bg_thread.task_runner()->PostTask(
       FROM_HERE, base::BindOnce(detach_in_background,
                                 base::Unretained(&layer_tree_frame_sink),
@@ -113,4 +114,5 @@
 }
 
 }  // namespace
-}  // namespace viz
+}  // namespace mojo_embedder
+}  // namespace cc
diff --git a/cc/mojo_embedder/mojo_embedder_export.h b/cc/mojo_embedder/mojo_embedder_export.h
new file mode 100644
index 0000000..2eb16adb
--- /dev/null
+++ b/cc/mojo_embedder/mojo_embedder_export.h
@@ -0,0 +1,29 @@
+// Copyright 2017 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_MOJO_EMBEDDER_MOJO_EMBEDDER_EXPORT_H_
+#define CC_MOJO_EMBEDDER_MOJO_EMBEDDER_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(CC_MOJO_EMBEDDER_IMPLEMENTATION)
+#define CC_MOJO_EMBEDDER_EXPORT __declspec(dllexport)
+#else
+#define CC_MOJO_EMBEDDER_EXPORT __declspec(dllimport)
+#endif  // defined(CC_MOJO_EMBEDDER_IMPLEMENTATION)
+
+#else  // defined(WIN32)
+#if defined(CC_MOJO_EMBEDDER_IMPLEMENTATION)
+#define CC_MOJO_EMBEDDER_EXPORT __attribute__((visibility("default")))
+#else
+#define CC_MOJO_EMBEDDER_EXPORT
+#endif
+#endif
+
+#else  // defined(COMPONENT_BUILD)
+#define CC_MOJO_EMBEDDER_EXPORT
+#endif
+
+#endif  // CC_MOJO_EMBEDDER_MOJO_EMBEDDER_EXPORT_H_
diff --git a/components/viz/README.md b/components/viz/README.md
index c7b048b..74ed1c37 100644
--- a/components/viz/README.md
+++ b/components/viz/README.md
@@ -71,7 +71,10 @@
 
 ### client <a name="directory-structure-client"></a>
 Client library for accessing Viz services. May be used from privileged (eg
-browser) or unprivileged (eg renderer) processes.
+browser) or unprivileged (eg renderer) processes. The client library should
+remain agnostic about *how* to communicate with viz (in other words should not
+use mojo bindings), as some viz clients use mojo but others use it in-process
+or via other IPC mechanisms.
 
 | Can depend on: |
 |:---------------|
diff --git a/components/viz/client/BUILD.gn b/components/viz/client/BUILD.gn
index 4bbeeb8..7a70c1e 100644
--- a/components/viz/client/BUILD.gn
+++ b/components/viz/client/BUILD.gn
@@ -6,8 +6,6 @@
 
 viz_component("client") {
   sources = [
-    "client_layer_tree_frame_sink.cc",
-    "client_layer_tree_frame_sink.h",
     "frame_eviction_manager.cc",
     "frame_eviction_manager.h",
     "frame_evictor.cc",
@@ -23,17 +21,16 @@
 
   public_deps = [
     "//base",
-    "//cc",
     "//components/viz/common",
-    "//mojo/public/cpp/bindings",
-    "//services/viz/public/interfaces",
+  ]
+  deps = [
+    "//cc/base",
   ]
 }
 
 viz_source_set("unit_tests") {
   testonly = true
   sources = [
-    "client_layer_tree_frame_sink_unittest.cc",
     "hit_test_data_provider_draw_quad_unittest.cc",
   ]
 
@@ -41,7 +38,6 @@
     ":client",
     "//base",
     "//base/test:test_support",
-    "//cc:test_support",
     "//components/viz/client",
     "//components/viz/test:test_support",
     "//mojo/public/cpp/bindings",
diff --git a/components/viz/client/DEPS b/components/viz/client/DEPS
index db90fed94..8c795b8 100644
--- a/components/viz/client/DEPS
+++ b/components/viz/client/DEPS
@@ -1,19 +1,18 @@
 # Please consult components/viz/README.md about allowable dependencies.
 
 include_rules = [
-  "+cc",
-  "-cc/test",
   "-components/viz/common/features.h",
   "-components/viz/common/switches.h",
   "+components/viz/client",
-  "+mojo/public/cpp/bindings",
-  "+mojo/public/cpp/system",
-  "+services/viz/public/interfaces",
+
+  # Do not use mojo bindings in viz/client/. This library should be agnostic
+  # about how to communicate with viz.
+  "-mojo/public/cpp/bindings",
 ]
 
 specific_include_rules = {
   ".*unittest\.cc": [
-    "+cc/test",
     "+components/viz/test",
+    "+mojo/public/cpp",
   ],
 }
diff --git a/components/viz/client/client_layer_tree_frame_sink.h b/components/viz/client/client_layer_tree_frame_sink.h
deleted file mode 100644
index 33f06266..0000000
--- a/components/viz/client/client_layer_tree_frame_sink.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2017 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 COMPONENTS_VIZ_CLIENT_CLIENT_LAYER_TREE_FRAME_SINK_H_
-#define COMPONENTS_VIZ_CLIENT_CLIENT_LAYER_TREE_FRAME_SINK_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/single_thread_task_runner.h"
-#include "cc/trees/layer_tree_frame_sink.h"
-#include "components/viz/client/viz_client_export.h"
-#include "components/viz/common/frame_sinks/begin_frame_source.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "components/viz/common/surfaces/surface_id.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
-
-namespace viz {
-
-class HitTestDataProvider;
-class LocalSurfaceIdProvider;
-
-class VIZ_CLIENT_EXPORT ClientLayerTreeFrameSink
-    : public cc::LayerTreeFrameSink,
-      public mojom::CompositorFrameSinkClient,
-      public ExternalBeginFrameSourceClient {
- public:
-  struct VIZ_CLIENT_EXPORT UnboundMessagePipes {
-    UnboundMessagePipes();
-    ~UnboundMessagePipes();
-    UnboundMessagePipes(UnboundMessagePipes&& other);
-
-    bool HasUnbound() const;
-
-    // Only one of |compositor_frame_sink_info| or
-    // |compositor_frame_sink_associated_info| should be set.
-    mojom::CompositorFrameSinkPtrInfo compositor_frame_sink_info;
-    mojom::CompositorFrameSinkAssociatedPtrInfo
-        compositor_frame_sink_associated_info;
-    mojom::CompositorFrameSinkClientRequest client_request;
-  };
-
-  struct VIZ_CLIENT_EXPORT InitParams {
-    InitParams();
-    ~InitParams();
-
-    scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner;
-    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = nullptr;
-    std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source;
-    std::unique_ptr<HitTestDataProvider> hit_test_data_provider;
-    std::unique_ptr<LocalSurfaceIdProvider> local_surface_id_provider;
-    UnboundMessagePipes pipes;
-    bool enable_surface_synchronization = false;
-    bool wants_animate_only_begin_frames = false;
-  };
-
-  ClientLayerTreeFrameSink(
-      scoped_refptr<ContextProvider> context_provider,
-      scoped_refptr<RasterContextProvider> worker_context_provider,
-      InitParams* params);
-
-  ~ClientLayerTreeFrameSink() override;
-
-  const HitTestDataProvider* hit_test_data_provider() const {
-    return hit_test_data_provider_.get();
-  }
-
-  const LocalSurfaceId& local_surface_id() const { return local_surface_id_; }
-
-  // cc::LayerTreeFrameSink implementation.
-  bool BindToClient(cc::LayerTreeFrameSinkClient* client) override;
-  void DetachFromClient() override;
-  void SetLocalSurfaceId(const LocalSurfaceId& local_surface_id) override;
-  void SubmitCompositorFrame(CompositorFrame frame) override;
-  void DidNotProduceFrame(const BeginFrameAck& ack) override;
-  void DidAllocateSharedBitmap(mojo::ScopedSharedBufferHandle buffer,
-                               const SharedBitmapId& id) override;
-  void DidDeleteSharedBitmap(const SharedBitmapId& id) override;
-
- private:
-  // mojom::CompositorFrameSinkClient implementation:
-  void DidReceiveCompositorFrameAck(
-      const std::vector<ReturnedResource>& resources) override;
-  void DidPresentCompositorFrame(uint32_t presentation_token,
-                                 base::TimeTicks time,
-                                 base::TimeDelta refresh,
-                                 uint32_t flags) override;
-  void DidDiscardCompositorFrame(uint32_t presentation_token) override;
-  void OnBeginFrame(const BeginFrameArgs& begin_frame_args) override;
-  void OnBeginFramePausedChanged(bool paused) override;
-  void ReclaimResources(
-      const std::vector<ReturnedResource>& resources) override;
-
-  // ExternalBeginFrameSourceClient implementation.
-  void OnNeedsBeginFrames(bool needs_begin_frames) override;
-
-  void OnMojoConnectionError(uint32_t custom_reason,
-                             const std::string& description);
-
-  bool begin_frames_paused_ = false;
-  bool needs_begin_frames_ = false;
-  LocalSurfaceId local_surface_id_;
-  std::unique_ptr<HitTestDataProvider> hit_test_data_provider_;
-  std::unique_ptr<LocalSurfaceIdProvider> local_surface_id_provider_;
-  std::unique_ptr<ExternalBeginFrameSource> begin_frame_source_;
-  std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source_;
-
-  // Message pipes that will be bound when BindToClient() is called.
-  UnboundMessagePipes pipes_;
-
-  // One of |compositor_frame_sink_| or |compositor_frame_sink_associated_| will
-  // be bound after calling BindToClient(). |compositor_frame_sink_ptr_| will
-  // point to message pipe we want to use.
-  mojom::CompositorFrameSink* compositor_frame_sink_ptr_ = nullptr;
-  mojom::CompositorFrameSinkPtr compositor_frame_sink_;
-  mojom::CompositorFrameSinkAssociatedPtr compositor_frame_sink_associated_;
-  mojo::Binding<mojom::CompositorFrameSinkClient> client_binding_;
-
-  THREAD_CHECKER(thread_checker_);
-  const bool enable_surface_synchronization_;
-  const bool wants_animate_only_begin_frames_;
-
-  LocalSurfaceId last_submitted_local_surface_id_;
-  float last_submitted_device_scale_factor_ = 1.f;
-  gfx::Size last_submitted_size_in_pixels_;
-
-  base::WeakPtrFactory<ClientLayerTreeFrameSink> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ClientLayerTreeFrameSink);
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_CLIENT_CLIENT_LAYER_TREE_FRAME_SINK_H_
diff --git a/components/viz/client/hit_test_data_provider_draw_quad_unittest.cc b/components/viz/client/hit_test_data_provider_draw_quad_unittest.cc
index 2e27702b..e67bbd4 100644
--- a/components/viz/client/hit_test_data_provider_draw_quad_unittest.cc
+++ b/components/viz/client/hit_test_data_provider_draw_quad_unittest.cc
@@ -11,14 +11,13 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread.h"
-#include "cc/test/fake_layer_tree_frame_sink_client.h"
 #include "components/viz/client/local_surface_id_provider.h"
+#include "components/viz/common/hit_test/hit_test_region_list.h"
 #include "components/viz/common/quads/surface_draw_quad.h"
 #include "components/viz/test/compositor_frame_helpers.h"
 #include "components/viz/test/test_context_provider.h"
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
-#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace viz {
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn
index 34f30dd..26f76875 100644
--- a/components/viz/common/BUILD.gn
+++ b/components/viz/common/BUILD.gn
@@ -166,7 +166,6 @@
     "//gpu/command_buffer/client:raster_interface",
     "//gpu/vulkan:buildflags",
     "//mojo/public/cpp/bindings",
-    "//skia",
     "//third_party/libyuv",
     "//ui/gfx",
     "//ui/gfx:color_space",
@@ -200,6 +199,7 @@
     "//gpu/command_buffer/client",
     "//gpu/command_buffer/common",
     "//mojo/public/cpp/bindings",
+    "//skia",
   ]
 }
 
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index f211920..5aaa29c 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -39,6 +39,7 @@
     "//base/third_party/dynamic_annotations",
     "//cc",
     "//cc/animation",
+    "//cc/mojo_embedder",
     "//cc/paint",
     "//components/cbor",
     "//components/discardable_memory/common",
diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc
index 7f02b82..c87467e6 100644
--- a/content/browser/compositor/viz_process_transport_factory.cc
+++ b/content/browser/compositor/viz_process_transport_factory.cc
@@ -10,8 +10,8 @@
 #include "base/command_line.h"
 #include "base/debug/dump_without_crashing.h"
 #include "base/single_thread_task_runner.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "cc/raster/single_thread_task_graph_runner.h"
-#include "components/viz/client/client_layer_tree_frame_sink.h"
 #include "components/viz/client/hit_test_data_provider_draw_quad.h"
 #include "components/viz/client/local_surface_id_provider.h"
 #include "components/viz/common/gpu/context_provider.h"
@@ -513,7 +513,7 @@
       std::move(root_params));
 
   // Create LayerTreeFrameSink with the browser end of CompositorFrameSink.
-  viz::ClientLayerTreeFrameSink::InitParams params;
+  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
   params.compositor_task_runner = compositor->task_runner();
   params.gpu_memory_buffer_manager = GetGpuMemoryBufferManager();
   params.pipes.compositor_frame_sink_associated_info = std::move(sink_info);
@@ -533,7 +533,7 @@
     worker_context = worker_context_provider_;
   }
   compositor->SetLayerTreeFrameSink(
-      std::make_unique<viz::ClientLayerTreeFrameSink>(
+      std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
           std::move(compositor_context), std::move(worker_context), &params));
 
 #if defined(OS_WIN)
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 12b20bd..0e61cc5 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -34,11 +34,11 @@
 #include "cc/base/switches.h"
 #include "cc/input/input_handler.h"
 #include "cc/layers/layer.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "cc/raster/single_thread_task_graph_runner.h"
 #include "cc/resources/ui_resource_manager.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_settings.h"
-#include "components/viz/client/client_layer_tree_frame_sink.h"
 #include "components/viz/client/frame_eviction_manager.h"
 #include "components/viz/client/hit_test_data_provider_draw_quad.h"
 #include "components/viz/client/local_surface_id_provider.h"
@@ -1227,7 +1227,7 @@
       std::move(root_params));
 
   // Create LayerTreeFrameSink with the browser end of CompositorFrameSink.
-  viz::ClientLayerTreeFrameSink::InitParams params;
+  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
   params.compositor_task_runner = task_runner;
   params.gpu_memory_buffer_manager = BrowserMainLoop::GetInstance()
                                          ->gpu_channel_establish_factory()
@@ -1240,8 +1240,9 @@
   params.hit_test_data_provider =
       std::make_unique<viz::HitTestDataProviderDrawQuad>(
           /*should_ask_for_child_region=*/false);
-  auto layer_tree_frame_sink = std::make_unique<viz::ClientLayerTreeFrameSink>(
-      std::move(context_provider), nullptr, &params);
+  auto layer_tree_frame_sink =
+      std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
+          std::move(context_provider), nullptr, &params);
   host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink));
   CompositorDependencies::Get().display_private->SetDisplayVisible(true);
 }
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 4f9c35e6..6b75c9a 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -671,6 +671,7 @@
     "//base:i18n",
     "//cc",
     "//cc/animation",
+    "//cc/mojo_embedder",
     "//cc/paint",
     "//components/discardable_memory/client",
     "//components/metrics",
diff --git a/content/renderer/mus/BUILD.gn b/content/renderer/mus/BUILD.gn
index 718ad1c..297195a 100644
--- a/content/renderer/mus/BUILD.gn
+++ b/content/renderer/mus/BUILD.gn
@@ -21,6 +21,7 @@
   deps = [
     "//base",
     "//cc",
+    "//cc/mojo_embedder",
     "//components/viz/client",
     "//content/common",
     "//content/public/child:child_sources",
diff --git a/content/renderer/mus/mus_embedded_frame.cc b/content/renderer/mus/mus_embedded_frame.cc
index 25c6d8d..e0fdd26 100644
--- a/content/renderer/mus/mus_embedded_frame.cc
+++ b/content/renderer/mus/mus_embedded_frame.cc
@@ -9,7 +9,7 @@
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
 #include "cc/base/switches.h"
-#include "components/viz/client/client_layer_tree_frame_sink.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "components/viz/client/hit_test_data_provider.h"
 #include "components/viz/client/local_surface_id_provider.h"
 #include "content/renderer/mus/renderer_window_tree_client.h"
diff --git a/content/renderer/mus/renderer_window_tree_client.cc b/content/renderer/mus/renderer_window_tree_client.cc
index 77db183f..e91f34f 100644
--- a/content/renderer/mus/renderer_window_tree_client.cc
+++ b/content/renderer/mus/renderer_window_tree_client.cc
@@ -9,7 +9,7 @@
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
 #include "cc/base/switches.h"
-#include "components/viz/client/client_layer_tree_frame_sink.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "components/viz/client/hit_test_data_provider.h"
 #include "components/viz/client/hit_test_data_provider_draw_quad.h"
 #include "components/viz/client/local_surface_id_provider.h"
@@ -133,7 +133,7 @@
   viz::mojom::CompositorFrameSinkClientPtr client;
   viz::mojom::CompositorFrameSinkClientRequest client_request =
       mojo::MakeRequest(&client);
-  viz::ClientLayerTreeFrameSink::InitParams params;
+  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
   params.gpu_memory_buffer_manager = gpu_memory_buffer_manager;
   params.pipes.compositor_frame_sink_info = std::move(sink_info);
   params.pipes.client_request = std::move(client_request);
@@ -145,9 +145,10 @@
         std::make_unique<viz::HitTestDataProviderDrawQuad>(
             true /* should_ask_for_child_region */);
   }
-  auto frame_sink = std::make_unique<viz::ClientLayerTreeFrameSink>(
-      std::move(context_provider), nullptr /* worker_context_provider */,
-      &params);
+  auto frame_sink =
+      std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
+          std::move(context_provider), nullptr /* worker_context_provider */,
+          &params);
   tree_->AttachCompositorFrameSink(root_window_id_, std::move(sink_request),
                                    std::move(client));
   callback.Run(std::move(frame_sink));
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index eda23cc..adbef4b 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -42,6 +42,7 @@
 #include "build/build_config.h"
 #include "cc/base/histograms.h"
 #include "cc/base/switches.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "cc/raster/task_graph_runner.h"
 #include "cc/trees/layer_tree_frame_sink.h"
 #include "cc/trees/layer_tree_host_common.h"
@@ -49,7 +50,6 @@
 #include "components/discardable_memory/client/client_discardable_shared_memory_manager.h"
 #include "components/metrics/public/interfaces/single_sample_metrics.mojom.h"
 #include "components/metrics/single_sample_metrics.h"
-#include "components/viz/client/client_layer_tree_frame_sink.h"
 #include "components/viz/client/hit_test_data_provider.h"
 #include "components/viz/client/hit_test_data_provider_draw_quad.h"
 #include "components/viz/client/local_surface_id_provider.h"
@@ -172,7 +172,6 @@
 #include "ui/base/ui_base_switches.h"
 #include "ui/display/display_switches.h"
 
-
 #if defined(OS_ANDROID)
 #include <cpu-features.h>
 #include "content/renderer/android/synchronous_layer_tree_frame_sink.h"
@@ -1994,7 +1993,7 @@
 
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
-  viz::ClientLayerTreeFrameSink::InitParams params;
+  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
   params.compositor_task_runner = compositor_task_runner_;
   params.enable_surface_synchronization =
       features::IsSurfaceSynchronizationEnabled();
@@ -2055,7 +2054,7 @@
     frame_sink_provider_->RegisterRenderFrameMetadataObserver(
         routing_id, std::move(render_frame_metadata_observer_client_request),
         std::move(render_frame_metadata_observer_ptr));
-    callback.Run(std::make_unique<viz::ClientLayerTreeFrameSink>(
+    callback.Run(std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
         nullptr, nullptr, &params));
     return;
   }
@@ -2147,7 +2146,7 @@
       routing_id, std::move(render_frame_metadata_observer_client_request),
       std::move(render_frame_metadata_observer_ptr));
   params.gpu_memory_buffer_manager = GetGpuMemoryBufferManager();
-  callback.Run(std::make_unique<viz::ClientLayerTreeFrameSink>(
+  callback.Run(std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
       std::move(context_provider), std::move(worker_context_provider),
       &params));
 }
diff --git a/services/viz/BUILD.gn b/services/viz/BUILD.gn
index 9be502a..95a9913 100644
--- a/services/viz/BUILD.gn
+++ b/services/viz/BUILD.gn
@@ -25,7 +25,6 @@
 
   deps = [
     "//base",
-    "//cc",
     "//components/viz/service",
     "//components/viz/service/main",
     "//mojo/public/cpp/system",
diff --git a/services/viz/public/cpp/compositing/begin_frame_args_for_blink.typemap b/services/viz/public/cpp/compositing/begin_frame_args_for_blink.typemap
index 2f3eb95..57f42ce 100644
--- a/services/viz/public/cpp/compositing/begin_frame_args_for_blink.typemap
+++ b/services/viz/public/cpp/compositing/begin_frame_args_for_blink.typemap
@@ -3,13 +3,12 @@
 # found in the LICENSE file.
 
 mojom = "//services/viz/public/interfaces/compositing/begin_frame_args.mojom"
-
+deps = [
+  "//components/viz/common",
+]
 public_headers = [ "//components/viz/common/frame_sinks/begin_frame_args.h" ]
 traits_headers =
     [ "//services/viz/public/cpp/compositing/begin_frame_args_struct_traits.h" ]
-deps = [
-  "//cc",
-]
 type_mappings = [
   "viz.mojom.BeginFrameArgs=viz::BeginFrameArgs",
   "viz.mojom.BeginFrameAck=viz::BeginFrameAck",
diff --git a/services/viz/public/cpp/compositing/compositor_frame.typemap b/services/viz/public/cpp/compositing/compositor_frame.typemap
index 1f865796..2da5712 100644
--- a/services/viz/public/cpp/compositing/compositor_frame.typemap
+++ b/services/viz/public/cpp/compositing/compositor_frame.typemap
@@ -3,13 +3,13 @@
 # found in the LICENSE file.
 
 mojom = "//services/viz/public/interfaces/compositing/compositor_frame.mojom"
+deps = [
+  "//components/viz/common",
+]
 public_headers = [ "//components/viz/common/quads/compositor_frame.h" ]
 traits_headers =
     [ "//services/viz/public/cpp/compositing/compositor_frame_struct_traits.h" ]
 sources = [
   "//services/viz/public/cpp/compositing/compositor_frame_struct_traits.cc",
 ]
-deps = [
-  "//cc",
-]
 type_mappings = [ "viz.mojom.CompositorFrame=viz::CompositorFrame[move_only]" ]
diff --git a/services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap b/services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap
index aa213ad..0e3e6854 100644
--- a/services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap
+++ b/services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap
@@ -23,7 +23,7 @@
   "//ui/latency/mojo/latency_info_struct_traits.h",
 ]
 public_deps = [
-  "//cc",
+  "//components/viz/common",
   "//gpu/ipc/common:interfaces",
   "//services/viz/public/interfaces",
   "//skia/public/interfaces",
diff --git a/services/viz/public/cpp/compositing/copy_output_request.typemap b/services/viz/public/cpp/compositing/copy_output_request.typemap
index 972f50a..29c9b96f 100644
--- a/services/viz/public/cpp/compositing/copy_output_request.typemap
+++ b/services/viz/public/cpp/compositing/copy_output_request.typemap
@@ -3,8 +3,13 @@
 # found in the LICENSE file.
 
 mojom = "//services/viz/public/interfaces/compositing/copy_output_request.mojom"
+deps = [
+  "//components/viz/common",
+]
 public_headers = [ "//components/viz/common/frame_sinks/copy_output_request.h" ]
-traits_headers = [ "//services/viz/public/cpp/compositing/copy_output_request_struct_traits.h" ]
+traits_headers = [
+  "//services/viz/public/cpp/compositing/copy_output_request_struct_traits.h",
+]
 sources = [
   "//services/viz/public/cpp/compositing/copy_output_request_struct_traits.cc",
 ]
diff --git a/services/viz/public/cpp/compositing/copy_output_result.typemap b/services/viz/public/cpp/compositing/copy_output_result.typemap
index 60449c8e..7b1188ce 100644
--- a/services/viz/public/cpp/compositing/copy_output_result.typemap
+++ b/services/viz/public/cpp/compositing/copy_output_result.typemap
@@ -7,8 +7,7 @@
 traits_headers = [
   "//services/viz/public/cpp/compositing/copy_output_result_struct_traits.h",
 ]
-public_deps = [
-  "//cc",
+deps = [
   "//components/viz/common",
 ]
 sources = [
diff --git a/services/viz/public/cpp/compositing/filter_operation.typemap b/services/viz/public/cpp/compositing/filter_operation.typemap
index 8dc0a6f9..9e9dd65c 100644
--- a/services/viz/public/cpp/compositing/filter_operation.typemap
+++ b/services/viz/public/cpp/compositing/filter_operation.typemap
@@ -3,6 +3,9 @@
 # found in the LICENSE file.
 
 mojom = "//services/viz/public/interfaces/compositing/filter_operation.mojom"
+deps = [
+  "//cc/paint",
+]
 public_headers = [ "//cc/paint/filter_operation.h" ]
 traits_headers =
     [ "//services/viz/public/cpp/compositing/filter_operation_struct_traits.h" ]
diff --git a/services/viz/public/cpp/compositing/filter_operations.typemap b/services/viz/public/cpp/compositing/filter_operations.typemap
index 77b56b1..b85b129 100644
--- a/services/viz/public/cpp/compositing/filter_operations.typemap
+++ b/services/viz/public/cpp/compositing/filter_operations.typemap
@@ -3,6 +3,9 @@
 # found in the LICENSE file.
 
 mojom = "//services/viz/public/interfaces/compositing/filter_operations.mojom"
+deps = [
+  "//cc/paint",
+]
 public_headers = [ "//cc/paint/filter_operations.h" ]
 traits_headers = [
   "//services/viz/public/cpp/compositing/filter_operations_struct_traits.h",
diff --git a/services/viz/public/cpp/compositing/resource_settings.typemap b/services/viz/public/cpp/compositing/resource_settings.typemap
index 3969caa0..d15d93e 100644
--- a/services/viz/public/cpp/compositing/resource_settings.typemap
+++ b/services/viz/public/cpp/compositing/resource_settings.typemap
@@ -8,7 +8,7 @@
   "//services/viz/public/cpp/compositing/resource_settings_struct_traits.h",
 ]
 deps = [
-  "//cc",
+  "//components/viz/common",
   "//ui/gfx/mojo",
 ]
 sources = [
diff --git a/services/viz/public/interfaces/compositing/begin_frame_args.mojom b/services/viz/public/interfaces/compositing/begin_frame_args.mojom
index d440f60f..123a24a 100644
--- a/services/viz/public/interfaces/compositing/begin_frame_args.mojom
+++ b/services/viz/public/interfaces/compositing/begin_frame_args.mojom
@@ -13,7 +13,7 @@
   BEGIN_FRAME_ARGS_TYPE_MAX
 };
 
-// See cc/output/begin_frame_args.h.
+// See components/viz/common/frame_sinks/begin_frame_args.h.
 struct BeginFrameArgs {
   mojo_base.mojom.TimeTicks frame_time;
   mojo_base.mojom.TimeTicks deadline;
@@ -25,7 +25,7 @@
   bool animate_only;
 };
 
-// See cc/output/begin_frame_args.h.
+// See components/viz/common/frame_sinks/begin_frame_args.h.
 struct BeginFrameAck {
   uint64 source_id;
   uint64 sequence_number;
diff --git a/services/viz/public/interfaces/compositing/transferable_resource.mojom b/services/viz/public/interfaces/compositing/transferable_resource.mojom
index 41dfede5..e2aed0f 100644
--- a/services/viz/public/interfaces/compositing/transferable_resource.mojom
+++ b/services/viz/public/interfaces/compositing/transferable_resource.mojom
@@ -24,7 +24,7 @@
   R16_EXT,
 };
 
-// See cc/resources/transferable_resource.h.
+// See components/viz/common/resources/transferable_resource.h.
 struct TransferableResource {
   uint32 id;
   ResourceFormat format;
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index c5eb719e..5c31061d 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -156,6 +156,7 @@
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
     "//cc",
+    "//cc/mojo_embedder",
     "//components/discardable_memory/client",
     "//components/discardable_memory/public/interfaces",
     "//components/viz/client",
@@ -391,6 +392,7 @@
   deps = [
     ":test_support",
     "//base/test:test_support",
+    "//cc/mojo_embedder",
     "//components/viz/client",
     "//mojo/edk",
     "//net",
diff --git a/ui/aura/mus/DEPS b/ui/aura/mus/DEPS
index a79ec49..9e4ff45 100644
--- a/ui/aura/mus/DEPS
+++ b/ui/aura/mus/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+cc/base/switches.h",
+  "+cc/mojo_embedder/async_layer_tree_frame_sink.h",
   "+cc/trees/layer_tree_frame_sink_client.h",
   "+cc/trees/layer_tree_frame_sink.h",
   "+cc/scheduler/begin_frame_source.h",
diff --git a/ui/aura/mus/mus_context_factory.cc b/ui/aura/mus/mus_context_factory.cc
index 73badbb..ab80166 100644
--- a/ui/aura/mus/mus_context_factory.cc
+++ b/ui/aura/mus/mus_context_factory.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "cc/base/switches.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/host/renderer_settings_creation.h"
 #include "services/ui/public/cpp/gpu/gpu.h"
diff --git a/ui/aura/mus/window_port_mus.cc b/ui/aura/mus/window_port_mus.cc
index e09b18b6..074d5453 100644
--- a/ui/aura/mus/window_port_mus.cc
+++ b/ui/aura/mus/window_port_mus.cc
@@ -4,6 +4,7 @@
 
 #include "ui/aura/mus/window_port_mus.h"
 
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "components/viz/client/local_surface_id_provider.h"
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "ui/aura/client/aura_constants.h"
@@ -110,7 +111,7 @@
                                        std::move(callback));
 }
 
-std::unique_ptr<viz::ClientLayerTreeFrameSink>
+std::unique_ptr<cc::mojo_embedder::AsyncLayerTreeFrameSink>
 WindowPortMus::RequestLayerTreeFrameSink(
     scoped_refptr<viz::ContextProvider> context_provider,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager) {
@@ -121,7 +122,7 @@
   viz::mojom::CompositorFrameSinkClientRequest client_request =
       mojo::MakeRequest(&client);
 
-  viz::ClientLayerTreeFrameSink::InitParams params;
+  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
   params.gpu_memory_buffer_manager = gpu_memory_buffer_manager;
   params.pipes.compositor_frame_sink_info = std::move(sink_info);
   params.pipes.client_request = std::move(client_request);
@@ -131,9 +132,10 @@
       std::make_unique<viz::DefaultLocalSurfaceIdProvider>();
   params.enable_surface_synchronization = true;
 
-  auto layer_tree_frame_sink = std::make_unique<viz::ClientLayerTreeFrameSink>(
-      std::move(context_provider), nullptr /* worker_context_provider */,
-      &params);
+  auto layer_tree_frame_sink =
+      std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
+          std::move(context_provider), nullptr /* worker_context_provider */,
+          &params);
   window_tree_client_->AttachCompositorFrameSink(
       server_id(), std::move(sink_request), std::move(client));
   return layer_tree_frame_sink;
diff --git a/ui/aura/mus/window_port_mus.h b/ui/aura/mus/window_port_mus.h
index b4ac32f..a23afac 100644
--- a/ui/aura/mus/window_port_mus.h
+++ b/ui/aura/mus/window_port_mus.h
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "components/viz/client/client_layer_tree_frame_sink.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
 #include "components/viz/common/surfaces/surface_info.h"
 #include "services/ui/public/interfaces/cursor/cursor.mojom.h"
 #include "services/ui/public/interfaces/window_tree.mojom.h"
@@ -27,12 +27,14 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/platform_window/mojo/text_input_state.mojom.h"
 
-namespace gfx {
-class Insets;
+namespace cc {
+namespace mojo_embedder {
+class AsyncLayerTreeFrameSink;
+}
 }
 
-namespace viz {
-class ClientLayerTreeFrameSink;
+namespace gfx {
+class Insets;
 }
 
 namespace aura {
@@ -98,7 +100,8 @@
                        uint32_t flags,
                        ui::mojom::WindowTree::EmbedCallback callback);
 
-  std::unique_ptr<viz::ClientLayerTreeFrameSink> RequestLayerTreeFrameSink(
+  std::unique_ptr<cc::mojo_embedder::AsyncLayerTreeFrameSink>
+  RequestLayerTreeFrameSink(
       scoped_refptr<viz::ContextProvider> context_provider,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager);
 
diff --git a/ui/aura/mus/window_port_mus_unittest.cc b/ui/aura/mus/window_port_mus_unittest.cc
index cec1293c..c6e5312 100644
--- a/ui/aura/mus/window_port_mus_unittest.cc
+++ b/ui/aura/mus/window_port_mus_unittest.cc
@@ -4,7 +4,7 @@
 
 #include "ui/aura/mus/window_port_mus.h"
 
-#include "components/viz/client/client_layer_tree_frame_sink.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/local/layer_tree_frame_sink_local.h"
 #include "ui/aura/mus/client_surface_embedder.h"
@@ -49,7 +49,8 @@
   auto mus_frame_sink = GetFrameSinkFor(&window);
   ASSERT_TRUE(mus_frame_sink);
   auto frame_sink_local_surface_id =
-      static_cast<viz::ClientLayerTreeFrameSink*>(mus_frame_sink.get())
+      static_cast<cc::mojo_embedder::AsyncLayerTreeFrameSink*>(
+          mus_frame_sink.get())
           ->local_surface_id();
   EXPECT_TRUE(frame_sink_local_surface_id.is_valid());
   EXPECT_EQ(frame_sink_local_surface_id, local_surface_id);
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index 264368d..e7675de1 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -81,13 +81,14 @@
 
   defines = [ "COMPOSITOR_IMPLEMENTATION" ]
 
+  public_deps = [
+    "//cc",
+  ]
   deps = [
     "//base",
     "//base/third_party/dynamic_annotations",
-    "//cc",
     "//cc/animation",
     "//cc/paint",
-    "//components/viz/common",
     "//components/viz/host",
     "//components/viz/service",
     "//gpu/command_buffer/common",