[go: nahoru, domu]

oop: Split viz::ContextProvider interface into GL and Raster interfaces.

viz::ContextProviders currently support both GL and Raster interfaces.
This change splits those interfaces into GL (viz::ContextProvider) and
Raster (viz::RasterContextProvider) interfaces, to prevent invalid
run-time usage of the wrong interface on a 3d context.

All worker contexts in FrameSinks and code below them have been switched to
viz::RasterContextProviders.  Also cleaned up related header includes.

BUG=757607

Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
Change-Id: I7cce7a545f3c77938e0a97570cb468a75d7cb945
Reviewed-on: https://chromium-review.googlesource.com/828079
Reviewed-by: Antoine Labour <piman@chromium.org>
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Reviewed-by: Tao Bai <michaelbai@chromium.org>
Reviewed-by: danakj <danakj@chromium.org>
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Victor Miura <vmiura@chromium.org>
Cr-Commit-Position: refs/heads/master@{#525126}
diff --git a/android_webview/browser/aw_render_thread_context_provider.cc b/android_webview/browser/aw_render_thread_context_provider.cc
index 6c6ac9b5..36ab732 100644
--- a/android_webview/browser/aw_render_thread_context_provider.cc
+++ b/android_webview/browser/aw_render_thread_context_provider.cc
@@ -95,6 +95,14 @@
   return GL_RGBA;
 }
 
+void AwRenderThreadContextProvider::AddRef() const {
+  base::RefCountedThreadSafe<AwRenderThreadContextProvider>::AddRef();
+}
+
+void AwRenderThreadContextProvider::Release() const {
+  base::RefCountedThreadSafe<AwRenderThreadContextProvider>::Release();
+}
+
 gpu::ContextResult AwRenderThreadContextProvider::BindToCurrentThread() {
   // This is called on the thread the context will be used.
   DCHECK(main_thread_checker_.CalledOnValidThread());
@@ -121,11 +129,6 @@
   return context_->GetImplementation();
 }
 
-gpu::raster::RasterInterface* AwRenderThreadContextProvider::RasterContext() {
-  NOTIMPLEMENTED();
-  return nullptr;
-}
-
 gpu::ContextSupport* AwRenderThreadContextProvider::ContextSupport() {
   DCHECK(main_thread_checker_.CalledOnValidThread());
 
diff --git a/android_webview/browser/aw_render_thread_context_provider.h b/android_webview/browser/aw_render_thread_context_provider.h
index e2b2f3a..58a32e4 100644
--- a/android_webview/browser/aw_render_thread_context_provider.h
+++ b/android_webview/browser/aw_render_thread_context_provider.h
@@ -30,7 +30,9 @@
 
 namespace android_webview {
 
-class AwRenderThreadContextProvider : public viz::ContextProvider {
+class AwRenderThreadContextProvider
+    : public base::RefCountedThreadSafe<AwRenderThreadContextProvider>,
+      public viz::ContextProvider {
  public:
   static scoped_refptr<AwRenderThreadContextProvider> Create(
       scoped_refptr<gl::GLSurface> surface,
@@ -40,18 +42,13 @@
   // on the default framebuffer.
   uint32_t GetCopyTextureInternalFormat();
 
- private:
-  AwRenderThreadContextProvider(
-      scoped_refptr<gl::GLSurface> surface,
-      scoped_refptr<gpu::InProcessCommandBuffer::Service> service);
-  ~AwRenderThreadContextProvider() override;
-
-  // viz::ContextProvider:
+  // viz::ContextProvider implementation.
+  void AddRef() const override;
+  void Release() const override;
   gpu::ContextResult BindToCurrentThread() override;
   const gpu::Capabilities& ContextCapabilities() const override;
   const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override;
   gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::raster::RasterInterface* RasterContext() override;
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   viz::ContextCacheController* CacheController() override;
@@ -60,6 +57,15 @@
   void AddObserver(viz::ContextLostObserver* obs) override;
   void RemoveObserver(viz::ContextLostObserver* obs) override;
 
+ protected:
+  friend class base::RefCountedThreadSafe<AwRenderThreadContextProvider>;
+
+  AwRenderThreadContextProvider(
+      scoped_refptr<gl::GLSurface> surface,
+      scoped_refptr<gpu::InProcessCommandBuffer::Service> service);
+  ~AwRenderThreadContextProvider() override;
+
+ private:
   void OnLostContext();
 
   base::ThreadChecker main_thread_checker_;
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index ccb58e7..d9816d60 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -22,6 +22,7 @@
 #include "cc/trees/layer_tree_host_impl.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/quads/texture_draw_quad.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "skia/ext/platform_canvas.h"
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc
index e946142f..998ee16 100644
--- a/cc/layers/texture_layer_unittest.cc
+++ b/cc/layers/texture_layer_unittest.cc
@@ -38,6 +38,7 @@
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/single_thread_proxy.h"
 #include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "components/viz/common/resources/returned_resource.h"
 #include "components/viz/common/resources/transferable_resource.h"
 #include "components/viz/test/test_layer_tree_frame_sink.h"
@@ -493,7 +494,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     constexpr bool disable_display_vsync = false;
     bool synchronous_composite =
         !HasImplThread() &&
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index 75694d32..3b12a6c3 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -19,6 +19,8 @@
 #include "cc/raster/raster_source.h"
 #include "cc/raster/scoped_gpu_raster.h"
 #include "cc/resources/resource.h"
+#include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/raster_interface.h"
@@ -39,11 +41,11 @@
     const gfx::Rect& playback_rect,
     const gfx::AxisTransform2d& transform,
     const RasterSource::PlaybackSettings& playback_settings,
-    viz::ContextProvider* context_provider,
+    viz::RasterContextProvider* context_provider,
     ResourceProvider::ScopedWriteLockRaster* resource_lock,
     bool use_distance_field_text,
     int msaa_sample_count) {
-  gpu::raster::RasterInterface* ri = context_provider->RasterContext();
+  gpu::raster::RasterInterface* ri = context_provider->RasterInterface();
   GLuint texture_id = resource_lock->ConsumeTexture(ri);
 
   ri->BeginRasterCHROMIUM(texture_id, raster_source->background_color(),
@@ -68,21 +70,21 @@
 // SkCanvases with a GrContext on a RasterInterface enabled context.
 class ScopedGrContextAccess {
  public:
-  explicit ScopedGrContextAccess(viz::ContextProvider* context_provider)
+  explicit ScopedGrContextAccess(viz::RasterContextProvider* context_provider)
       : context_provider_(context_provider) {
-    gpu::raster::RasterInterface* ri = context_provider_->RasterContext();
+    gpu::raster::RasterInterface* ri = context_provider_->RasterInterface();
     ri->BeginGpuRaster();
 
     class GrContext* gr_context = context_provider_->GrContext();
     gr_context->resetContext();
   }
   ~ScopedGrContextAccess() {
-    gpu::raster::RasterInterface* ri = context_provider_->RasterContext();
+    gpu::raster::RasterInterface* ri = context_provider_->RasterInterface();
     ri->EndGpuRaster();
   }
 
  private:
-  viz::ContextProvider* context_provider_;
+  viz::RasterContextProvider* context_provider_;
 };
 
 static void RasterizeSource(
@@ -93,13 +95,13 @@
     const gfx::Rect& playback_rect,
     const gfx::AxisTransform2d& transform,
     const RasterSource::PlaybackSettings& playback_settings,
-    viz::ContextProvider* context_provider,
+    viz::RasterContextProvider* context_provider,
     ResourceProvider::ScopedWriteLockRaster* resource_lock,
     bool use_distance_field_text,
     int msaa_sample_count) {
   ScopedGrContextAccess gr_context_access(context_provider);
 
-  gpu::raster::RasterInterface* ri = context_provider->RasterContext();
+  gpu::raster::RasterInterface* ri = context_provider->RasterInterface();
   GLuint texture_id = resource_lock->ConsumeTexture(ri);
 
   {
@@ -165,7 +167,7 @@
 
 GpuRasterBufferProvider::GpuRasterBufferProvider(
     viz::ContextProvider* compositor_context_provider,
-    viz::ContextProvider* worker_context_provider,
+    viz::RasterContextProvider* worker_context_provider,
     LayerTreeResourceProvider* resource_provider,
     bool use_distance_field_text,
     int gpu_rasterization_msaa_sample_count,
@@ -296,9 +298,9 @@
     uint64_t new_content_id,
     const gfx::AxisTransform2d& transform,
     const RasterSource::PlaybackSettings& playback_settings) {
-  viz::ContextProvider::ScopedContextLock scoped_context(
+  viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
       worker_context_provider_);
-  gpu::raster::RasterInterface* ri = scoped_context.RasterContext();
+  gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
   DCHECK(ri);
 
   // Synchronize with compositor. Nop if sync token is empty.
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h
index 57d75fba5..c3e9b6b 100644
--- a/cc/raster/gpu_raster_buffer_provider.h
+++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -14,14 +14,15 @@
 
 namespace viz {
 class ContextProvider;
-}
+class RasterContextProvider;
+}  // namespace viz
 
 namespace cc {
 
 class CC_EXPORT GpuRasterBufferProvider : public RasterBufferProvider {
  public:
   GpuRasterBufferProvider(viz::ContextProvider* compositor_context_provider,
-                          viz::ContextProvider* worker_context_provider,
+                          viz::RasterContextProvider* worker_context_provider,
                           LayerTreeResourceProvider* resource_provider,
                           bool use_distance_field_text,
                           int gpu_rasterization_msaa_sample_count,
@@ -91,7 +92,7 @@
   };
 
   viz::ContextProvider* const compositor_context_provider_;
-  viz::ContextProvider* const worker_context_provider_;
+  viz::RasterContextProvider* const worker_context_provider_;
   LayerTreeResourceProvider* const resource_provider_;
   const bool use_distance_field_text_;
   const int msaa_sample_count_;
diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc
index ea3487eb..821eff2f4 100644
--- a/cc/raster/one_copy_raster_buffer_provider.cc
+++ b/cc/raster/one_copy_raster_buffer_provider.cc
@@ -18,6 +18,8 @@
 #include "cc/base/math_util.h"
 #include "cc/resources/resource_util.h"
 #include "cc/resources/scoped_resource.h"
+#include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "components/viz/common/resources/platform_color.h"
 #include "components/viz/common/resources/resource_format.h"
 #include "gpu/GLES2/gl2extchromium.h"
@@ -70,7 +72,7 @@
 OneCopyRasterBufferProvider::OneCopyRasterBufferProvider(
     base::SequencedTaskRunner* task_runner,
     viz::ContextProvider* compositor_context_provider,
-    viz::ContextProvider* worker_context_provider,
+    viz::RasterContextProvider* worker_context_provider,
     LayerTreeResourceProvider* resource_provider,
     int max_copy_texture_chromium_size,
     bool use_partial_raster,
@@ -229,9 +231,9 @@
 
 void OneCopyRasterBufferProvider::WaitSyncToken(
     const gpu::SyncToken& sync_token) {
-  viz::ContextProvider::ScopedContextLock scoped_context(
+  viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
       worker_context_provider_);
-  gpu::raster::RasterInterface* ri = scoped_context.RasterContext();
+  gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
   DCHECK(ri);
   // Synchronize with compositor. Nop if sync token is empty.
   ri->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
@@ -304,9 +306,9 @@
     ResourceProvider::ScopedWriteLockRaster* resource_lock,
     const RasterSource* raster_source,
     const gfx::Rect& rect_to_copy) {
-  viz::ContextProvider::ScopedContextLock scoped_context(
+  viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
       worker_context_provider_);
-  gpu::raster::RasterInterface* ri = scoped_context.RasterContext();
+  gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
   DCHECK(ri);
 
   GLuint texture_id = resource_lock->ConsumeTexture(ri);
diff --git a/cc/raster/one_copy_raster_buffer_provider.h b/cc/raster/one_copy_raster_buffer_provider.h
index 14b41721e..c9ceaae6 100644
--- a/cc/raster/one_copy_raster_buffer_provider.h
+++ b/cc/raster/one_copy_raster_buffer_provider.h
@@ -11,24 +11,29 @@
 #include "cc/raster/raster_buffer_provider.h"
 #include "cc/raster/staging_buffer_pool.h"
 #include "cc/resources/layer_tree_resource_provider.h"
-#include "components/viz/common/gpu/context_provider.h"
 #include "gpu/command_buffer/common/sync_token.h"
 
+namespace viz {
+class ContextProvider;
+class RasterContextProvider;
+}  // namespace viz
+
 namespace cc {
 struct StagingBuffer;
 class StagingBufferPool;
 
 class CC_EXPORT OneCopyRasterBufferProvider : public RasterBufferProvider {
  public:
-  OneCopyRasterBufferProvider(base::SequencedTaskRunner* task_runner,
-                              viz::ContextProvider* compositor_context_provider,
-                              viz::ContextProvider* worker_context_provider,
-                              LayerTreeResourceProvider* resource_provider,
-                              int max_copy_texture_chromium_size,
-                              bool use_partial_raster,
-                              int max_staging_buffer_usage_in_bytes,
-                              viz::ResourceFormat preferred_tile_format,
-                              bool async_worker_context_enabled);
+  OneCopyRasterBufferProvider(
+      base::SequencedTaskRunner* task_runner,
+      viz::ContextProvider* compositor_context_provider,
+      viz::RasterContextProvider* worker_context_provider,
+      LayerTreeResourceProvider* resource_provider,
+      int max_copy_texture_chromium_size,
+      bool use_partial_raster,
+      int max_staging_buffer_usage_in_bytes,
+      viz::ResourceFormat preferred_tile_format,
+      bool async_worker_context_enabled);
   ~OneCopyRasterBufferProvider() override;
 
   // Overridden from RasterBufferProvider:
@@ -114,7 +119,7 @@
   gfx::BufferUsage StagingBufferUsage() const;
 
   viz::ContextProvider* const compositor_context_provider_;
-  viz::ContextProvider* const worker_context_provider_;
+  viz::RasterContextProvider* const worker_context_provider_;
   LayerTreeResourceProvider* const resource_provider_;
   const int max_bytes_per_copy_operation_;
   const bool use_partial_raster_;
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index 7877a52..66bad93 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -79,7 +79,10 @@
   }
 };
 
-class PerfContextProvider : public viz::ContextProvider {
+class PerfContextProvider
+    : public base::RefCountedThreadSafe<PerfContextProvider>,
+      public viz::ContextProvider,
+      public viz::RasterContextProvider {
  public:
   PerfContextProvider()
       : context_gl_(new PerfGLES2Interface),
@@ -90,6 +93,14 @@
         context_gl_.get(), capabilities_);
   }
 
+  // viz::ContextProvider implementation.
+  void AddRef() const override {
+    base::RefCountedThreadSafe<PerfContextProvider>::AddRef();
+  }
+  void Release() const override {
+    base::RefCountedThreadSafe<PerfContextProvider>::Release();
+  }
+
   gpu::ContextResult BindToCurrentThread() override {
     return gpu::ContextResult::kSuccess;
   }
@@ -100,7 +111,7 @@
     return gpu_feature_info_;
   }
   gpu::gles2::GLES2Interface* ContextGL() override { return context_gl_.get(); }
-  gpu::raster::RasterInterface* RasterContext() override {
+  gpu::raster::RasterInterface* RasterInterface() override {
     return raster_context_.get();
   }
   gpu::ContextSupport* ContextSupport() override { return &support_; }
@@ -125,6 +136,8 @@
   void RemoveObserver(viz::ContextLostObserver* obs) override {}
 
  private:
+  friend class base::RefCountedThreadSafe<PerfContextProvider>;
+
   ~PerfContextProvider() override = default;
 
   std::unique_ptr<PerfGLES2Interface> context_gl_;
@@ -314,7 +327,7 @@
 
  protected:
   scoped_refptr<viz::ContextProvider> compositor_context_provider_;
-  scoped_refptr<viz::ContextProvider> worker_context_provider_;
+  scoped_refptr<viz::RasterContextProvider> worker_context_provider_;
   std::unique_ptr<LayerTreeResourceProvider> resource_provider_;
   scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
   std::unique_ptr<SynchronousTaskGraphRunner> task_graph_runner_;
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc
index 7cde8ce..c0e7c2e 100644
--- a/cc/raster/raster_buffer_provider_unittest.cc
+++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -38,6 +38,7 @@
 #include "components/viz/common/resources/platform_color.h"
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
 #include "gpu/GLES2/gl2extchromium.h"
+#include "gpu/command_buffer/client/raster_interface.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/axis_transform2d.h"
 
@@ -286,6 +287,15 @@
     context_provider->ContextGL()->Flush();
   }
 
+  void LoseContext(viz::RasterContextProvider* context_provider) {
+    if (!context_provider)
+      return;
+    viz::RasterContextProvider::ScopedRasterContextLock lock(context_provider);
+    context_provider->RasterInterface()->LoseContextCHROMIUM(
+        GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
+    context_provider->RasterInterface()->Flush();
+  }
+
   void OnRasterTaskCompleted(unsigned id, bool was_canceled) override {
     RasterTaskResult result;
     result.id = id;
@@ -386,8 +396,9 @@
 }
 
 TEST_P(RasterBufferProviderTest, LostContext) {
-  LoseContext(context_provider_.get());
-  LoseContext(worker_context_provider_.get());
+  LoseContext(static_cast<viz::ContextProvider*>(context_provider_.get()));
+  LoseContext(
+      static_cast<viz::RasterContextProvider*>(worker_context_provider_.get()));
 
   AppendTask(0u);
   AppendTask(1u);
diff --git a/cc/raster/scoped_gpu_raster.cc b/cc/raster/scoped_gpu_raster.cc
index c388007..9c0752c 100644
--- a/cc/raster/scoped_gpu_raster.cc
+++ b/cc/raster/scoped_gpu_raster.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "cc/raster/scoped_gpu_raster.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "third_party/khronos/GLES2/gl2ext.h"
diff --git a/cc/raster/scoped_gpu_raster.h b/cc/raster/scoped_gpu_raster.h
index 90aca8d..9f4e0c84 100644
--- a/cc/raster/scoped_gpu_raster.h
+++ b/cc/raster/scoped_gpu_raster.h
@@ -10,7 +10,10 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "cc/cc_export.h"
-#include "components/viz/common/gpu/context_provider.h"
+
+namespace viz {
+class ContextProvider;
+}  // namespace viz
 
 namespace cc {
 
diff --git a/cc/raster/staging_buffer_pool.cc b/cc/raster/staging_buffer_pool.cc
index dd7c829..a6346f5 100644
--- a/cc/raster/staging_buffer_pool.cc
+++ b/cc/raster/staging_buffer_pool.cc
@@ -13,6 +13,7 @@
 #include "base/trace_event/memory_dump_manager.h"
 #include "cc/base/container_util.h"
 #include "cc/resources/scoped_resource.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/client/raster_interface.h"
 
 using base::trace_event::MemoryAllocatorDump;
@@ -127,7 +128,7 @@
 
 StagingBufferPool::StagingBufferPool(
     base::SequencedTaskRunner* task_runner,
-    viz::ContextProvider* worker_context_provider,
+    viz::RasterContextProvider* worker_context_provider,
     ResourceProvider* resource_provider,
     bool use_partial_raster,
     int max_staging_buffer_usage_in_bytes)
@@ -251,10 +252,10 @@
 
   std::unique_ptr<StagingBuffer> staging_buffer;
 
-  viz::ContextProvider::ScopedContextLock scoped_context(
+  viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
       worker_context_provider_);
 
-  gpu::raster::RasterInterface* ri = scoped_context.RasterContext();
+  gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
   DCHECK(ri);
 
   // Check if any busy buffers have become available.
@@ -398,10 +399,10 @@
   lock_.AssertAcquired();
 
   {
-    viz::ContextProvider::ScopedContextLock scoped_context(
+    viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
         worker_context_provider_);
 
-    gpu::raster::RasterInterface* ri = scoped_context.RasterContext();
+    gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
     DCHECK(ri);
 
     // Note: Front buffer is guaranteed to be LRU so we can stop releasing
diff --git a/cc/raster/staging_buffer_pool.h b/cc/raster/staging_buffer_pool.h
index 34f5140..72b55f4 100644
--- a/cc/raster/staging_buffer_pool.h
+++ b/cc/raster/staging_buffer_pool.h
@@ -19,13 +19,16 @@
 #include "base/trace_event/memory_dump_provider.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/resources/resource_provider.h"
-#include "components/viz/common/gpu/context_provider.h"
 
 namespace gpu {
 namespace raster {
 class RasterInterface;
 }
-}
+}  // namespace gpu
+
+namespace viz {
+class RasterContextProvider;
+}  // namespace viz
 
 namespace cc {
 class Resource;
@@ -56,7 +59,7 @@
   ~StagingBufferPool() final;
 
   StagingBufferPool(base::SequencedTaskRunner* task_runner,
-                    viz::ContextProvider* worker_context_provider,
+                    viz::RasterContextProvider* worker_context_provider,
                     ResourceProvider* resource_provider,
                     bool use_partial_raster,
                     int max_staging_buffer_usage_in_bytes);
@@ -92,7 +95,7 @@
   void OnPurgeMemory() override;
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
-  viz::ContextProvider* const worker_context_provider_;
+  viz::RasterContextProvider* const worker_context_provider_;
   ResourceProvider* const resource_provider_;
   const bool use_partial_raster_;
 
diff --git a/cc/resources/display_resource_provider.cc b/cc/resources/display_resource_provider.cc
index b4df9e74..c80df4d4 100644
--- a/cc/resources/display_resource_provider.cc
+++ b/cc/resources/display_resource_provider.cc
@@ -5,6 +5,7 @@
 #include "cc/resources/display_resource_provider.h"
 
 #include "base/trace_event/trace_event.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "components/viz/common/resources/shared_bitmap_manager.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
diff --git a/cc/resources/layer_tree_resource_provider.cc b/cc/resources/layer_tree_resource_provider.cc
index 69a5a82b..67803bb 100644
--- a/cc/resources/layer_tree_resource_provider.cc
+++ b/cc/resources/layer_tree_resource_provider.cc
@@ -6,6 +6,7 @@
 
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 4eaf66238..d05cf7f 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -25,6 +25,7 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "cc/resources/resource_util.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/resources/platform_color.h"
 #include "components/viz/common/resources/returned_resource.h"
 #include "components/viz/common/resources/shared_bitmap_manager.h"
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index 268857f..4fbf80c0 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -26,7 +26,6 @@
 #include "cc/cc_export.h"
 #include "cc/resources/return_callback.h"
 #include "components/viz/common/display/renderer_settings.h"
-#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/quads/shared_bitmap.h"
 #include "components/viz/common/resources/release_callback.h"
 #include "components/viz/common/resources/resource.h"
@@ -51,7 +50,7 @@
 
 namespace gpu {
 class GpuMemoryBufferManager;
-namespace gles {
+namespace gles2 {
 class GLES2Interface;
 }
 namespace raster {
@@ -60,6 +59,7 @@
 }
 
 namespace viz {
+class ContextProvider;
 class SharedBitmapManager;
 }  // namespace viz
 
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc
index 9adc6a6..139088d 100644
--- a/cc/resources/resource_provider_unittest.cc
+++ b/cc/resources/resource_provider_unittest.cc
@@ -3519,7 +3519,7 @@
                                      kWidth, kHeight, 0, GLDataFormat(format),
                                      GLDataType(format), nullptr));
     EXPECT_EQ(kWorkerTextureId,
-              lock.ConsumeTexture(context_provider->RasterContext()));
+              lock.ConsumeTexture(context_provider->RasterInterface()));
     Mock::VerifyAndClearExpectations(context);
 
     EXPECT_CALL(*context, RetireTextureId(kWorkerTextureId));
@@ -3536,14 +3536,14 @@
     EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_))
         .WillOnce(Return(kWorkerTextureId));
     EXPECT_EQ(kWorkerTextureId,
-              lock.ConsumeTexture(context_provider->RasterContext()));
+              lock.ConsumeTexture(context_provider->RasterInterface()));
     Mock::VerifyAndClearExpectations(context);
 
     EXPECT_CALL(*context, RetireTextureId(kWorkerTextureId));
     context_provider->ContextGL()->DeleteTextures(1, &kWorkerTextureId);
 
     sync_token = ResourceProvider::GenerateSyncTokenHelper(
-        context_provider->RasterContext());
+        context_provider->RasterInterface());
     lock.set_sync_token(sync_token);
     Mock::VerifyAndClearExpectations(context);
   }
@@ -3604,7 +3604,7 @@
                                                     GL_SCANOUT_CHROMIUM, kWidth,
                                                     kHeight));
     EXPECT_EQ(kWorkerTextureId,
-              lock.ConsumeTexture(context_provider->RasterContext()));
+              lock.ConsumeTexture(context_provider->RasterInterface()));
     Mock::VerifyAndClearExpectations(context);
 
     EXPECT_CALL(*context, RetireTextureId(kWorkerTextureId));
@@ -3621,11 +3621,11 @@
     EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_))
         .WillOnce(Return(kWorkerTextureId));
     EXPECT_EQ(kWorkerTextureId,
-              lock.ConsumeTexture(context_provider->RasterContext()));
+              lock.ConsumeTexture(context_provider->RasterInterface()));
     Mock::VerifyAndClearExpectations(context);
 
     sync_token = ResourceProvider::GenerateSyncTokenHelper(
-        context_provider->RasterContext());
+        context_provider->RasterInterface());
     lock.set_sync_token(sync_token);
 
     EXPECT_CALL(*context, RetireTextureId(kWorkerTextureId));
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc
index 3ac6ed9..3d440f7 100644
--- a/cc/resources/video_resource_updater.cc
+++ b/cc/resources/video_resource_updater.cc
@@ -16,6 +16,7 @@
 #include "cc/paint/skia_paint_canvas.h"
 #include "cc/resources/layer_tree_resource_provider.h"
 #include "cc/resources/resource_util.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/quads/render_pass.h"
 #include "components/viz/common/quads/stream_video_draw_quad.h"
 #include "components/viz/common/quads/texture_draw_quad.h"
diff --git a/cc/test/fake_layer_tree_frame_sink.cc b/cc/test/fake_layer_tree_frame_sink.cc
index a3207b5b..ee156cb 100644
--- a/cc/test/fake_layer_tree_frame_sink.cc
+++ b/cc/test/fake_layer_tree_frame_sink.cc
@@ -32,7 +32,7 @@
 
 FakeLayerTreeFrameSink::FakeLayerTreeFrameSink(
     scoped_refptr<viz::ContextProvider> context_provider,
-    scoped_refptr<viz::ContextProvider> worker_context_provider)
+    scoped_refptr<viz::RasterContextProvider> worker_context_provider)
     : LayerTreeFrameSink(std::move(context_provider),
                          std::move(worker_context_provider),
                          base::ThreadTaskRunnerHandle::Get(),
diff --git a/cc/test/fake_layer_tree_frame_sink.h b/cc/test/fake_layer_tree_frame_sink.h
index 536c05f..201e50b 100644
--- a/cc/test/fake_layer_tree_frame_sink.h
+++ b/cc/test/fake_layer_tree_frame_sink.h
@@ -119,7 +119,7 @@
  protected:
   FakeLayerTreeFrameSink(
       scoped_refptr<viz::ContextProvider> context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider);
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider);
 
   viz::TestGpuMemoryBufferManager test_gpu_memory_buffer_manager_;
   TestSharedBitmapManager test_shared_bitmap_manager_;
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index 255600c..1337f86 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -47,7 +47,7 @@
 
   viz::ContextProvider* compositor_context_provider =
       host_impl->layer_tree_frame_sink()->context_provider();
-  viz::ContextProvider* worker_context_provider =
+  viz::RasterContextProvider* worker_context_provider =
       host_impl->layer_tree_frame_sink()->worker_context_provider();
   LayerTreeResourceProvider* resource_provider = host_impl->resource_provider();
   int max_bytes_per_copy_operation = 1024 * 1024;
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc
index 11c9484d..eb7e641 100644
--- a/cc/test/layer_tree_pixel_test.cc
+++ b/cc/test/layer_tree_pixel_test.cc
@@ -42,7 +42,7 @@
     const viz::RendererSettings& renderer_settings,
     double refresh_rate,
     scoped_refptr<viz::ContextProvider>,
-    scoped_refptr<viz::ContextProvider>) {
+    scoped_refptr<viz::RasterContextProvider>) {
   scoped_refptr<TestInProcessContextProvider> compositor_context_provider;
   scoped_refptr<TestInProcessContextProvider> worker_context_provider;
   if (test_type_ == PIXEL_TEST_GL) {
@@ -56,7 +56,7 @@
       !layer_tree_host()->GetSettings().single_thread_proxy_scheduler;
   auto delegating_output_surface =
       std::make_unique<viz::TestLayerTreeFrameSink>(
-          compositor_context_provider, std::move(worker_context_provider),
+          compositor_context_provider, worker_context_provider,
           shared_bitmap_manager(), gpu_memory_buffer_manager(),
           renderer_settings, ImplThreadTaskRunner(), synchronous_composite,
           disable_display_vsync, refresh_rate);
diff --git a/cc/test/layer_tree_pixel_test.h b/cc/test/layer_tree_pixel_test.h
index 7363703..fe2e75d 100644
--- a/cc/test/layer_tree_pixel_test.h
+++ b/cc/test/layer_tree_pixel_test.h
@@ -42,7 +42,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override;
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override;
   std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
       scoped_refptr<viz::ContextProvider> compositor_context_provider) override;
 
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 214b98a..507adf0b 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -46,7 +46,7 @@
  public:
   SynchronousLayerTreeFrameSink(
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       viz::SharedBitmapManager* shared_bitmap_manager,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       const viz::RendererSettings& renderer_settings,
@@ -967,7 +967,7 @@
     const viz::RendererSettings& renderer_settings,
     double refresh_rate,
     scoped_refptr<viz::ContextProvider> compositor_context_provider,
-    scoped_refptr<viz::ContextProvider> worker_context_provider) {
+    scoped_refptr<viz::RasterContextProvider> worker_context_provider) {
   constexpr bool disable_display_vsync = false;
   bool synchronous_composite =
       !HasImplThread() &&
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 59686cc..6f2bfa35 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -145,7 +145,7 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider);
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider);
   // Override this and call the base class to change what viz::ContextProvider
   // will be used, such as to prevent sharing the context with the
   // LayerTreeFrameSink. Or override it and create your own OutputSurface to
diff --git a/cc/test/test_context_provider.cc b/cc/test/test_context_provider.cc
index 628968f..367888f 100644
--- a/cc/test/test_context_provider.cc
+++ b/cc/test/test_context_provider.cc
@@ -207,6 +207,14 @@
          context_thread_checker_.CalledOnValidThread());
 }
 
+void TestContextProvider::AddRef() const {
+  base::RefCountedThreadSafe<TestContextProvider>::AddRef();
+}
+
+void TestContextProvider::Release() const {
+  base::RefCountedThreadSafe<TestContextProvider>::Release();
+}
+
 gpu::ContextResult TestContextProvider::BindToCurrentThread() {
   // This is called on the thread the context will be used.
   DCHECK(context_thread_checker_.CalledOnValidThread());
@@ -242,7 +250,7 @@
   return context_gl_.get();
 }
 
-gpu::raster::RasterInterface* TestContextProvider::RasterContext() {
+gpu::raster::RasterInterface* TestContextProvider::RasterInterface() {
   return raster_context_.get();
 }
 
diff --git a/cc/test/test_context_provider.h b/cc/test/test_context_provider.h
index 209ae66e..196826d 100644
--- a/cc/test/test_context_provider.h
+++ b/cc/test/test_context_provider.h
@@ -18,6 +18,7 @@
 #include "base/threading/thread_checker.h"
 #include "cc/test/test_context_support.h"
 #include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/client/gles2_interface_stub.h"
 #include "gpu/config/gpu_feature_info.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
@@ -30,7 +31,10 @@
 class TestWebGraphicsContext3D;
 class TestGLES2Interface;
 
-class TestContextProvider : public viz::ContextProvider {
+class TestContextProvider
+    : public base::RefCountedThreadSafe<TestContextProvider>,
+      public viz::ContextProvider,
+      public viz::RasterContextProvider {
  public:
   typedef base::Callback<std::unique_ptr<TestWebGraphicsContext3D>(void)>
       CreateCallback;
@@ -50,11 +54,14 @@
   static scoped_refptr<TestContextProvider> Create(
       std::unique_ptr<TestGLES2Interface> gl);
 
+  // viz::ContextProvider / viz::RasterContextProvider implementation.
+  void AddRef() const override;
+  void Release() const override;
   gpu::ContextResult BindToCurrentThread() override;
   const gpu::Capabilities& ContextCapabilities() const override;
   const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override;
   gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::raster::RasterInterface* RasterContext() override;
+  gpu::raster::RasterInterface* RasterInterface() override;
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   viz::ContextCacheController* CacheController() override;
@@ -75,6 +82,8 @@
   TestContextSupport* support() { return support_.get(); }
 
  protected:
+  friend class base::RefCountedThreadSafe<TestContextProvider>;
+
   explicit TestContextProvider(
       std::unique_ptr<TestContextSupport> support,
       std::unique_ptr<TestGLES2Interface> gl,
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc
index 80c5113f..1a997eb 100644
--- a/cc/test/test_in_process_context_provider.cc
+++ b/cc/test/test_in_process_context_provider.cc
@@ -86,6 +86,14 @@
 
 TestInProcessContextProvider::~TestInProcessContextProvider() = default;
 
+void TestInProcessContextProvider::AddRef() const {
+  base::RefCountedThreadSafe<TestInProcessContextProvider>::AddRef();
+}
+
+void TestInProcessContextProvider::Release() const {
+  base::RefCountedThreadSafe<TestInProcessContextProvider>::Release();
+}
+
 gpu::ContextResult TestInProcessContextProvider::BindToCurrentThread() {
   return gpu::ContextResult::kSuccess;
 }
@@ -94,7 +102,7 @@
   return context_->GetImplementation();
 }
 
-gpu::raster::RasterInterface* TestInProcessContextProvider::RasterContext() {
+gpu::raster::RasterInterface* TestInProcessContextProvider::RasterInterface() {
   return raster_context_.get();
 }
 
diff --git a/cc/test/test_in_process_context_provider.h b/cc/test/test_in_process_context_provider.h
index 082755b..5fc2128 100644
--- a/cc/test/test_in_process_context_provider.h
+++ b/cc/test/test_in_process_context_provider.h
@@ -13,6 +13,7 @@
 #include "base/synchronization/lock.h"
 #include "cc/test/test_image_factory.h"
 #include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
 #include "gpu/config/gpu_feature_info.h"
 
@@ -35,14 +36,20 @@
     gpu::GLInProcessContext* shared_context,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
-class TestInProcessContextProvider : public viz::ContextProvider {
+class TestInProcessContextProvider
+    : public base::RefCountedThreadSafe<TestInProcessContextProvider>,
+      public viz::ContextProvider,
+      public viz::RasterContextProvider {
  public:
   explicit TestInProcessContextProvider(
       TestInProcessContextProvider* shared_context);
 
+  // viz::ContextProvider / viz::RasterContextProvider implementation.
+  void AddRef() const override;
+  void Release() const override;
   gpu::ContextResult BindToCurrentThread() override;
   gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::raster::RasterInterface* RasterContext() override;
+  gpu::raster::RasterInterface* RasterInterface() override;
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   viz::ContextCacheController* CacheController() override;
diff --git a/cc/test/test_web_graphics_context_3d.h b/cc/test/test_web_graphics_context_3d.h
index 06e020aa..08fcc52 100644
--- a/cc/test/test_web_graphics_context_3d.h
+++ b/cc/test/test_web_graphics_context_3d.h
@@ -22,7 +22,7 @@
 #include "base/synchronization/lock.h"
 #include "cc/test/ordered_texture_map.h"
 #include "cc/test/test_texture.h"
-#include "components/viz/common/gpu/context_provider.h"
+#include "gpu/command_buffer/common/capabilities.h"
 #include "gpu/command_buffer/common/sync_token.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index f7721fe0..c6d170b0 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -21,7 +21,7 @@
 #include "cc/base/histograms.h"
 #include "cc/raster/tile_task.h"
 #include "cc/tiles/mipmap_util.h"
-#include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/raster_interface.h"
 #include "gpu_image_decode_cache.h"
@@ -461,7 +461,7 @@
   DCHECK(!upload.image());
 }
 
-GpuImageDecodeCache::GpuImageDecodeCache(viz::ContextProvider* context,
+GpuImageDecodeCache::GpuImageDecodeCache(viz::RasterContextProvider* context,
                                          SkColorType color_type,
                                          size_t max_working_set_bytes)
     : color_type_(color_type),
@@ -471,7 +471,7 @@
   // Acquire the context_lock so that we can safely retrieve the
   // GrContextThreadSafeProxy. This proxy can then be used with no lock held.
   {
-    viz::ContextProvider::ScopedContextLock context_lock(context_);
+    viz::RasterContextProvider::ScopedRasterContextLock context_lock(context_);
     context_threadsafe_proxy_ = sk_sp<GrContextThreadSafeProxy>(
         context_->GrContext()->threadSafeProxy());
   }
@@ -708,7 +708,7 @@
                "GpuImageDecodeCache::SetShouldAggressivelyFreeResources",
                "agressive_free_resources", aggressively_free_resources);
   if (aggressively_free_resources) {
-    viz::ContextProvider::ScopedContextLock context_lock(context_);
+    viz::RasterContextProvider::ScopedRasterContextLock context_lock(context_);
     base::AutoLock lock(lock_);
     aggressively_freeing_resources_ = aggressively_free_resources;
     EnsureCapacity(0);
@@ -854,7 +854,7 @@
 void GpuImageDecodeCache::UploadImage(const DrawImage& draw_image) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
                "GpuImageDecodeCache::UploadImage");
-  viz::ContextProvider::ScopedContextLock context_lock(context_);
+  viz::RasterContextProvider::ScopedRasterContextLock context_lock(context_);
   base::AutoLock lock(lock_);
   ImageData* image_data = GetImageDataForDrawImage(draw_image);
   DCHECK(image_data);
@@ -1337,7 +1337,7 @@
     if (image_data->mode == DecodedDataMode::GPU) {
       // Notify the discardable system of this image so it will count against
       // budgets.
-      context_->RasterContext()->InitializeDiscardableTextureCHROMIUM(
+      context_->RasterInterface()->InitializeDiscardableTextureCHROMIUM(
           image_data->upload.gl_id());
     }
   }
@@ -1408,15 +1408,16 @@
   images_pending_complete_lock_.clear();
 
   for (auto* image : images_pending_unlock_) {
-    context_->RasterContext()->UnlockDiscardableTextureCHROMIUM(
+    context_->RasterInterface()->UnlockDiscardableTextureCHROMIUM(
         GlIdFromSkImage(image));
   }
   images_pending_unlock_.clear();
 
   for (auto& image : images_pending_deletion_) {
     uint32_t texture_id = GlIdFromSkImage(image.get());
-    if (context_->RasterContext()->LockDiscardableTextureCHROMIUM(texture_id)) {
-      context_->RasterContext()->DeleteTextures(1, &texture_id);
+    if (context_->RasterInterface()->LockDiscardableTextureCHROMIUM(
+            texture_id)) {
+      context_->RasterInterface()->DeleteTextures(1, &texture_id);
     }
   }
   images_pending_deletion_.clear();
@@ -1439,7 +1440,7 @@
     return true;
 
   if (have_context_lock == HaveContextLock::kYes &&
-      context_->RasterContext()->LockDiscardableTextureCHROMIUM(
+      context_->RasterInterface()->LockDiscardableTextureCHROMIUM(
           data->upload.gl_id())) {
     // If |have_context_lock|, we can immediately lock the image and send
     // the lock command to the GPU process.
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h
index dafc5ab..d1f51a4 100644
--- a/cc/tiles/gpu_image_decode_cache.h
+++ b/cc/tiles/gpu_image_decode_cache.h
@@ -20,7 +20,7 @@
 #include "third_party/skia/include/gpu/gl/GrGLTypes.h"
 
 namespace viz {
-class ContextProvider;
+class RasterContextProvider;
 }
 
 namespace cc {
@@ -102,7 +102,7 @@
  public:
   enum class DecodeTaskType { PART_OF_UPLOAD_TASK, STAND_ALONE_DECODE_TASK };
 
-  explicit GpuImageDecodeCache(viz::ContextProvider* context,
+  explicit GpuImageDecodeCache(viz::RasterContextProvider* context,
                                SkColorType color_type,
                                size_t max_working_set_bytes);
   ~GpuImageDecodeCache() override;
@@ -372,7 +372,7 @@
   void RunPendingContextThreadOperations();
 
   const SkColorType color_type_;
-  viz::ContextProvider* context_;
+  viz::RasterContextProvider* context_;
   sk_sp<GrContextThreadSafeProxy> context_threadsafe_proxy_;
 
   // All members below this point must only be accessed while holding |lock_|.
diff --git a/cc/trees/layer_tree_frame_sink.cc b/cc/trees/layer_tree_frame_sink.cc
index 3d905212..5c05114 100644
--- a/cc/trees/layer_tree_frame_sink.cc
+++ b/cc/trees/layer_tree_frame_sink.cc
@@ -41,7 +41,7 @@
 
 LayerTreeFrameSink::LayerTreeFrameSink(
     scoped_refptr<viz::ContextProvider> context_provider,
-    scoped_refptr<viz::ContextProvider> worker_context_provider,
+    scoped_refptr<viz::RasterContextProvider> worker_context_provider,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     viz::SharedBitmapManager* shared_bitmap_manager)
@@ -87,10 +87,9 @@
     DCHECK(context_provider_);
     DCHECK(compositor_task_runner_);
     DCHECK(compositor_task_runner_->BelongsToCurrentThread());
-    viz::ContextProvider::ScopedContextLock lock(
+    viz::RasterContextProvider::ScopedRasterContextLock lock(
         worker_context_provider_.get());
-    if (worker_context_provider_->RasterContext()
-            ->GetGraphicsResetStatusKHR() != GL_NO_ERROR) {
+    if (lock.RasterInterface()->GetGraphicsResetStatusKHR() != GL_NO_ERROR) {
       context_provider_->RemoveObserver(this);
       context_provider_ = nullptr;
       return false;
@@ -123,7 +122,7 @@
   }
 
   if (worker_context_provider_) {
-    viz::ContextProvider::ScopedContextLock lock(
+    viz::RasterContextProvider::ScopedRasterContextLock lock(
         worker_context_provider_.get());
     worker_context_provider_->RemoveObserver(
         worker_context_lost_forwarder_.get());
diff --git a/cc/trees/layer_tree_frame_sink.h b/cc/trees/layer_tree_frame_sink.h
index b637bc4..ac9fe419 100644
--- a/cc/trees/layer_tree_frame_sink.h
+++ b/cc/trees/layer_tree_frame_sink.h
@@ -15,6 +15,7 @@
 #include "cc/cc_export.h"
 #include "components/viz/common/gpu/context_lost_observer.h"
 #include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "components/viz/common/gpu/vulkan_context_provider.h"
 #include "components/viz/common/resources/returned_resource.h"
 #include "gpu/command_buffer/common/texture_in_use_response.h"
@@ -69,7 +70,7 @@
   // (won't be used) unless |context_provider| is present.
   LayerTreeFrameSink(
       scoped_refptr<viz::ContextProvider> context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       viz::SharedBitmapManager* shared_bitmap_manager);
@@ -104,7 +105,7 @@
   viz::ContextProvider* context_provider() const {
     return context_provider_.get();
   }
-  viz::ContextProvider* worker_context_provider() const {
+  viz::RasterContextProvider* worker_context_provider() const {
     return worker_context_provider_.get();
   }
   viz::VulkanContextProvider* vulkan_context_provider() const {
@@ -145,7 +146,7 @@
 
   struct LayerTreeFrameSink::Capabilities capabilities_;
   scoped_refptr<viz::ContextProvider> context_provider_;
-  scoped_refptr<viz::ContextProvider> worker_context_provider_;
+  scoped_refptr<viz::RasterContextProvider> worker_context_provider_;
   scoped_refptr<viz::VulkanContextProvider> vulkan_context_provider_;
   scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
   gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
diff --git a/cc/trees/layer_tree_frame_sink_client.h b/cc/trees/layer_tree_frame_sink_client.h
index e2ca7ba..a463b77 100644
--- a/cc/trees/layer_tree_frame_sink_client.h
+++ b/cc/trees/layer_tree_frame_sink_client.h
@@ -9,7 +9,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/time/time.h"
 #include "cc/cc_export.h"
-#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/resources/returned_resource.h"
 #include "gpu/command_buffer/common/texture_in_use_response.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/cc/trees/layer_tree_frame_sink_unittest.cc b/cc/trees/layer_tree_frame_sink_unittest.cc
index be1a0327..cf41eb3 100644
--- a/cc/trees/layer_tree_frame_sink_unittest.cc
+++ b/cc/trees/layer_tree_frame_sink_unittest.cc
@@ -11,6 +11,7 @@
 #include "cc/test/test_web_graphics_context_3d.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "gpu/GLES2/gl2extchromium.h"
+#include "gpu/command_buffer/client/raster_interface.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cc {
@@ -19,8 +20,8 @@
 class TestLayerTreeFrameSink : public LayerTreeFrameSink {
  public:
   explicit TestLayerTreeFrameSink(
-      scoped_refptr<TestContextProvider> context_provider,
-      scoped_refptr<TestContextProvider> worker_context_provider,
+      scoped_refptr<viz::ContextProvider> context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner)
       : LayerTreeFrameSink(std::move(context_provider),
                            std::move(worker_context_provider),
@@ -90,11 +91,11 @@
   // Verify DidLoseLayerTreeFrameSink callback is hooked up correctly.
   EXPECT_FALSE(client.did_lose_layer_tree_frame_sink_called());
   {
-    viz::ContextProvider::ScopedContextLock context_lock(
+    viz::RasterContextProvider::ScopedRasterContextLock context_lock(
         layer_tree_frame_sink.worker_context_provider());
-    context_lock.ContextGL()->LoseContextCHROMIUM(
+    context_lock.RasterInterface()->LoseContextCHROMIUM(
         GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
-    context_lock.ContextGL()->Flush();
+    context_lock.RasterInterface()->Flush();
   }
   task_runner->RunPendingTasks();
   EXPECT_TRUE(client.did_lose_layer_tree_frame_sink_called());
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 272f50e..373b794 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1990,9 +1990,10 @@
         layer_tree_frame_sink_->worker_context_provider()))
     return;
 
-  viz::ContextProvider* context_provider =
+  viz::RasterContextProvider* context_provider =
       layer_tree_frame_sink_->worker_context_provider();
-  viz::ContextProvider::ScopedContextLock scoped_context(context_provider);
+  viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
+      context_provider);
 
   const auto& caps = context_provider->ContextCapabilities();
   *gpu_rasterization_enabled = caps.gpu_rasterization;
@@ -2539,7 +2540,7 @@
     return;
   }
 
-  viz::ContextProvider* worker_context_provider =
+  viz::RasterContextProvider* worker_context_provider =
       layer_tree_frame_sink_->worker_context_provider();
   if (use_gpu_rasterization_) {
     DCHECK(worker_context_provider);
@@ -2555,7 +2556,8 @@
     // The worker context must support oop raster to enable oop rasterization.
     bool oop_raster_enabled = settings_.enable_oop_rasterization;
     if (oop_raster_enabled) {
-      viz::ContextProvider::ScopedContextLock hold(worker_context_provider);
+      viz::RasterContextProvider::ScopedRasterContextLock hold(
+          worker_context_provider);
       oop_raster_enabled &=
           worker_context_provider->ContextCapabilities().supports_oop_raster;
     }
@@ -2673,8 +2675,8 @@
       compositor_context->ContextGL()->ShallowFlushCHROMIUM();
     if (auto* worker_context =
             layer_tree_frame_sink_->worker_context_provider()) {
-      viz::ContextProvider::ScopedContextLock hold(worker_context);
-      worker_context->RasterContext()->ShallowFlushCHROMIUM();
+      viz::RasterContextProvider::ScopedRasterContextLock hold(worker_context);
+      hold.RasterInterface()->ShallowFlushCHROMIUM();
     }
   }
 }
@@ -4641,7 +4643,7 @@
   // before we get a chance to go invisible in NotifyAllTileTasksComplete.
   auto* worker_context = layer_tree_frame_sink_->worker_context_provider();
   if (worker_context && is_visible != !!worker_context_visibility_) {
-    viz::ContextProvider::ScopedContextLock hold(worker_context);
+    viz::RasterContextProvider::ScopedRasterContextLock hold(worker_context);
     if (is_visible) {
       worker_context_visibility_ =
           worker_context->CacheController()->ClientBecameVisible();
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 6c16f5e2..7fa7327 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -9461,8 +9461,8 @@
   host_impl_->DrawLayers(&frame);
   host_impl_->DidDrawAllLayers(frame);
 
-  // The CopyOutputResult has a ref on the viz::ContextProvider and a texture in
-  // a texture mailbox.
+  // The CopyOutputResult has a ref on the viz::ContextProvider and a texture
+  // in a texture mailbox.
   ASSERT_TRUE(helper.unprocessed_result);
   EXPECT_FALSE(context_provider->HasOneRef());
   EXPECT_EQ(1u, context_provider->TestContext3d()->NumTextures());
diff --git a/cc/trees/layer_tree_host_perftest.cc b/cc/trees/layer_tree_host_perftest.cc
index 50fb41d..0404981f 100644
--- a/cc/trees/layer_tree_host_perftest.cc
+++ b/cc/trees/layer_tree_host_perftest.cc
@@ -51,7 +51,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     constexpr bool disable_display_vsync = true;
     bool synchronous_composite =
         !HasImplThread() &&
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc
index b6769a03..6fffa7d 100644
--- a/cc/trees/layer_tree_host_pixeltest_blending.cc
+++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -73,7 +73,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     viz::RendererSettings modified_renderer_settings = renderer_settings;
     modified_renderer_settings.force_antialiasing = force_antialiasing_;
     modified_renderer_settings.force_blending_with_shaders =
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
index c6575b38..df6bd38 100644
--- a/cc/trees/layer_tree_host_pixeltest_masks.cc
+++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -504,7 +504,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     viz::RendererSettings modified_renderer_settings = renderer_settings;
     modified_renderer_settings.force_antialiasing = use_antialiasing_;
     modified_renderer_settings.force_blending_with_shaders = force_shaders_;
diff --git a/cc/trees/layer_tree_host_pixeltest_readback.cc b/cc/trees/layer_tree_host_pixeltest_readback.cc
index 27784af..c25cd6d7 100644
--- a/cc/trees/layer_tree_host_pixeltest_readback.cc
+++ b/cc/trees/layer_tree_host_pixeltest_readback.cc
@@ -568,7 +568,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     std::unique_ptr<viz::TestLayerTreeFrameSink> frame_sink =
         LayerTreePixelTest::CreateLayerTreeFrameSink(
             renderer_settings, refresh_rate, compositor_context_provider,
diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc
index b35cac8f..7156d69 100644
--- a/cc/trees/layer_tree_host_pixeltest_tiles.cc
+++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc
@@ -177,13 +177,13 @@
   void WillPrepareTilesOnThread(LayerTreeHostImpl* host_impl) override {
     // Issue a GL finish before preparing tiles to ensure resources become
     // available for use in a timely manner. Needed for the one-copy path.
-    viz::ContextProvider* context_provider =
+    viz::RasterContextProvider* context_provider =
         host_impl->layer_tree_frame_sink()->worker_context_provider();
     if (!context_provider)
       return;
 
-    viz::ContextProvider::ScopedContextLock lock(context_provider);
-    lock.RasterContext()->Finish();
+    viz::RasterContextProvider::ScopedRasterContextLock lock(context_provider);
+    lock.RasterInterface()->Finish();
   }
 
  protected:
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 1ef63d99..6018511 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -452,7 +452,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     // Create the main viz::ContextProvider with a MockContextSupport.
     auto main_support = std::make_unique<MockContextSupport>();
     mock_main_context_support_ = main_support.get();
@@ -3409,7 +3410,7 @@
  public:
   OnDrawLayerTreeFrameSink(
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       viz::SharedBitmapManager* shared_bitmap_manager,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       const viz::RendererSettings& renderer_settings,
@@ -3453,7 +3454,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     auto on_draw_callback = base::Bind(
         &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor::
             CallOnDraw,
@@ -5641,7 +5643,7 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> ignored_compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> ignored_worker_context_provider)
+      scoped_refptr<viz::RasterContextProvider> ignored_worker_context_provider)
       override {
     auto context_provider = TestContextProvider::Create();
     context_provider->UnboundTestContext3d()->SetMaxSamples(4);
@@ -6178,7 +6180,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     constexpr bool disable_display_vsync = false;
     bool synchronous_composite =
         !HasImplThread() &&
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
index aa950bb..f17b46fe 100644
--- a/cc/trees/layer_tree_host_unittest_context.cc
+++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -87,7 +87,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     base::AutoLock lock(context3d_lock_);
 
     std::unique_ptr<TestWebGraphicsContext3D> compositor_context3d =
@@ -1625,9 +1626,9 @@
     if (did_lose_context)
       return;
     did_lose_context = true;
-    viz::ContextProvider::ScopedContextLock scoped_context(
+    viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
         host_impl->layer_tree_frame_sink()->worker_context_provider());
-    gpu::raster::RasterInterface* ri = scoped_context.RasterContext();
+    gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
     ri->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
                             GL_INNOCENT_CONTEXT_RESET_ARB);
   }
diff --git a/cc/trees/layer_tree_host_unittest_copyrequest.cc b/cc/trees/layer_tree_host_unittest_copyrequest.cc
index 16da098..786c0dd 100644
--- a/cc/trees/layer_tree_host_unittest_copyrequest.cc
+++ b/cc/trees/layer_tree_host_unittest_copyrequest.cc
@@ -481,7 +481,8 @@
       const viz::RendererSettings& renderer_settings,
       double refresh_rate,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider) override {
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider)
+      override {
     auto frame_sink = LayerTreeHostCopyRequestTest::CreateLayerTreeFrameSink(
         renderer_settings, refresh_rate, std::move(compositor_context_provider),
         std::move(worker_context_provider));
diff --git a/components/viz/client/client_layer_tree_frame_sink.cc b/components/viz/client/client_layer_tree_frame_sink.cc
index b4451c07..e89e538 100644
--- a/components/viz/client/client_layer_tree_frame_sink.cc
+++ b/components/viz/client/client_layer_tree_frame_sink.cc
@@ -37,7 +37,7 @@
 
 ClientLayerTreeFrameSink::ClientLayerTreeFrameSink(
     scoped_refptr<ContextProvider> context_provider,
-    scoped_refptr<ContextProvider> worker_context_provider,
+    scoped_refptr<RasterContextProvider> worker_context_provider,
     InitParams* params)
     : cc::LayerTreeFrameSink(std::move(context_provider),
                              std::move(worker_context_provider),
diff --git a/components/viz/client/client_layer_tree_frame_sink.h b/components/viz/client/client_layer_tree_frame_sink.h
index eda54a4..3bf4dd4 100644
--- a/components/viz/client/client_layer_tree_frame_sink.h
+++ b/components/viz/client/client_layer_tree_frame_sink.h
@@ -62,7 +62,7 @@
 
   ClientLayerTreeFrameSink(
       scoped_refptr<ContextProvider> context_provider,
-      scoped_refptr<ContextProvider> worker_context_provider,
+      scoped_refptr<RasterContextProvider> worker_context_provider,
       InitParams* params);
 
   ClientLayerTreeFrameSink(
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn
index e92cc15a..aac91bf0b 100644
--- a/components/viz/common/BUILD.gn
+++ b/components/viz/common/BUILD.gn
@@ -62,6 +62,8 @@
     "gpu/context_provider.h",
     "gpu/in_process_context_provider.cc",
     "gpu/in_process_context_provider.h",
+    "gpu/raster_context_provider.cc",
+    "gpu/raster_context_provider.h",
     "gpu/vulkan_context_provider.h",
     "gpu/vulkan_in_process_context_provider.cc",
     "gpu/vulkan_in_process_context_provider.h",
diff --git a/components/viz/common/gpu/context_provider.h b/components/viz/common/gpu/context_provider.h
index f2be096..21af48a04 100644
--- a/components/viz/common/gpu/context_provider.h
+++ b/components/viz/common/gpu/context_provider.h
@@ -30,21 +30,13 @@
 namespace gles2 {
 class GLES2Interface;
 }
-namespace raster {
-class RasterInterface;
-}
+
 }  // namespace gpu
 
 namespace viz {
 
-class VIZ_COMMON_EXPORT ContextProvider
-    : public base::RefCountedThreadSafe<ContextProvider> {
+class VIZ_COMMON_EXPORT ContextProvider {
  public:
-  // Hold an instance of this lock while using a context across multiple
-  // threads. This only works for ContextProviders that will return a valid
-  // lock from GetLock(), so is not always supported. Most use of
-  // ContextProvider should be single-thread only on the thread that
-  // BindToCurrentThread is run on.
   class VIZ_COMMON_EXPORT ScopedContextLock {
    public:
     explicit ScopedContextLock(ContextProvider* context_provider);
@@ -54,16 +46,16 @@
       return context_provider_->ContextGL();
     }
 
-    gpu::raster::RasterInterface* RasterContext() {
-      return context_provider_->RasterContext();
-    }
-
    private:
     ContextProvider* const context_provider_;
     base::AutoLock context_lock_;
     std::unique_ptr<ContextCacheController::ScopedBusy> busy_;
   };
 
+  // RefCounted interface.
+  virtual void AddRef() const = 0;
+  virtual void Release() const = 0;
+
   // Bind the 3d context to the current thread. This should be called before
   // accessing the contexts. Calling it more than once should have no effect.
   // Once this function has been called, the class should only be accessed
@@ -72,39 +64,6 @@
   // can be used to provide access from multiple threads.
   virtual gpu::ContextResult BindToCurrentThread() = 0;
 
-  // Get a GLES2 interface to the 3d context.  Returns nullptr if the context
-  // provider was not bound to a thread, or if the GLES2 interface is not
-  // supported by this context.
-  virtual gpu::gles2::GLES2Interface* ContextGL() = 0;
-
-  // Get a Raster interface to the 3d context.  Returns nullptr if the context
-  // provider was not bound to a thread, or if the Raster interface is not
-  // supported by this context.
-  virtual gpu::raster::RasterInterface* RasterContext() = 0;
-
-  // Get a ContextSupport interface to the 3d context.  Returns nullptr if the
-  // context provider was not bound to a thread.
-  virtual gpu::ContextSupport* ContextSupport() = 0;
-
-  // Get a Raster interface to the 3d context.  Returns nullptr if the context
-  // provider was not bound to a thread, or if a GrContext fails to initialize
-  // on this context.
-  virtual class GrContext* GrContext() = 0;
-
-  // Get a CacheController interface to the 3d context.  Returns nullptr if the
-  // context provider was not bound to a thread.
-  virtual ContextCacheController* CacheController() = 0;
-
-  // Invalidates the cached OpenGL state in GrContext.
-  // See skia GrContext::resetContext for details.
-  virtual void InvalidateGrContext(uint32_t state) = 0;
-
-  // Returns the capabilities of the currently bound 3d context.
-  virtual const gpu::Capabilities& ContextCapabilities() const = 0;
-
-  // Returns feature blacklist decisions and driver bug workarounds info.
-  virtual const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const = 0;
-
   // Adds/removes an observer to be called when the context is lost. AddObserver
   // should be called before BindToCurrentThread from the same thread that the
   // context is bound to, or any time while the lock is acquired after checking
@@ -120,9 +79,39 @@
   // directly.
   virtual base::Lock* GetLock() = 0;
 
+  // Get a CacheController interface to the 3d context.  The context provider
+  // must have been successfully bound to a thread before calling this.
+  virtual ContextCacheController* CacheController() = 0;
+
+  // Get a ContextSupport interface to the 3d context.  The context provider
+  // must have been successfully bound to a thread before calling this.
+  virtual gpu::ContextSupport* ContextSupport() = 0;
+
+  // Get a Skia GPU raster interface to the 3d context.  The context provider
+  // must have been successfully bound to a thread before calling this.  Returns
+  // nullptr if a GrContext fails to initialize on this context.
+  virtual class GrContext* GrContext() = 0;
+
+  // Invalidates the cached OpenGL state in GrContext.  The context provider
+  // must have been successfully bound to a thread before calling this.
+  // See skia GrContext::resetContext for details.
+  virtual void InvalidateGrContext(uint32_t state) = 0;
+
+  // Returns the capabilities of the currently bound 3d context.  The context
+  // provider must have been successfully bound to a thread before calling this.
+  virtual const gpu::Capabilities& ContextCapabilities() const = 0;
+
+  // Returns feature blacklist decisions and driver bug workarounds info.  The
+  // context provider must have been successfully bound to a thread before
+  // calling this.
+  virtual const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const = 0;
+
+  // Get a GLES2 interface to the 3d context.  The context provider must have
+  // been successfully bound to a thread before calling this.
+  virtual gpu::gles2::GLES2Interface* ContextGL() = 0;
+
  protected:
-  friend class base::RefCountedThreadSafe<ContextProvider>;
-  virtual ~ContextProvider() {}
+  virtual ~ContextProvider() = default;
 };
 
 }  // namespace viz
diff --git a/components/viz/common/gpu/in_process_context_provider.cc b/components/viz/common/gpu/in_process_context_provider.cc
index f584395..a4fa4eb9 100644
--- a/components/viz/common/gpu/in_process_context_provider.cc
+++ b/components/viz/common/gpu/in_process_context_provider.cc
@@ -78,6 +78,14 @@
 
 InProcessContextProvider::~InProcessContextProvider() = default;
 
+void InProcessContextProvider::AddRef() const {
+  base::RefCountedThreadSafe<InProcessContextProvider>::AddRef();
+}
+
+void InProcessContextProvider::Release() const {
+  base::RefCountedThreadSafe<InProcessContextProvider>::Release();
+}
+
 gpu::ContextResult InProcessContextProvider::BindToCurrentThread() {
   return context_result_;
 }
@@ -86,12 +94,6 @@
   return context_->GetImplementation();
 }
 
-gpu::raster::RasterInterface* InProcessContextProvider::RasterContext() {
-  // RasterContext use isn't expected in viz compositor context.
-  DLOG(ERROR) << "Unexpected access to RasterContext()";
-  return nullptr;
-}
-
 gpu::ContextSupport* InProcessContextProvider::ContextSupport() {
   return context_->GetImplementation();
 }
diff --git a/components/viz/common/gpu/in_process_context_provider.h b/components/viz/common/gpu/in_process_context_provider.h
index 18911df..3218727e7 100644
--- a/components/viz/common/gpu/in_process_context_provider.h
+++ b/components/viz/common/gpu/in_process_context_provider.h
@@ -38,7 +38,9 @@
 // the compositor and gpu thread.
 // TODO(kylechar): Rename VizProcessContextProvider and move to
 // components/viz/service.
-class VIZ_COMMON_EXPORT InProcessContextProvider : public ContextProvider {
+class VIZ_COMMON_EXPORT InProcessContextProvider
+    : public base::RefCountedThreadSafe<InProcessContextProvider>,
+      public ContextProvider {
  public:
   InProcessContextProvider(
       scoped_refptr<gpu::InProcessCommandBuffer::Service> service,
@@ -49,9 +51,11 @@
       const gpu::SharedMemoryLimits& limits,
       InProcessContextProvider* shared_context);
 
+  // ContextProvider implementation.
+  void AddRef() const override;
+  void Release() const override;
   gpu::ContextResult BindToCurrentThread() override;
   gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::raster::RasterInterface* RasterContext() override;
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   ContextCacheController* CacheController() override;
diff --git a/components/viz/common/gpu/raster_context_provider.cc b/components/viz/common/gpu/raster_context_provider.cc
new file mode 100644
index 0000000..7dca96c
--- /dev/null
+++ b/components/viz/common/gpu/raster_context_provider.cc
@@ -0,0 +1,21 @@
+// 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.
+
+#include "components/viz/common/gpu/raster_context_provider.h"
+
+namespace viz {
+
+RasterContextProvider::ScopedRasterContextLock::ScopedRasterContextLock(
+    RasterContextProvider* context_provider)
+    : context_provider_(context_provider),
+      context_lock_(*context_provider_->GetLock()) {
+  busy_ = context_provider_->CacheController()->ClientBecameBusy();
+}
+
+RasterContextProvider::ScopedRasterContextLock::~ScopedRasterContextLock() {
+  // Let ContextCacheController know we are no longer busy.
+  context_provider_->CacheController()->ClientBecameNotBusy(std::move(busy_));
+}
+
+}  // namespace viz
diff --git a/components/viz/common/gpu/raster_context_provider.h b/components/viz/common/gpu/raster_context_provider.h
new file mode 100644
index 0000000..e46927c
--- /dev/null
+++ b/components/viz/common/gpu/raster_context_provider.h
@@ -0,0 +1,118 @@
+// 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_COMMON_GPU_RASTER_CONTEXT_PROVIDER_H_
+#define COMPONENTS_VIZ_COMMON_GPU_RASTER_CONTEXT_PROVIDER_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "base/synchronization/lock.h"
+#include "components/viz/common/gpu/context_cache_controller.h"
+#include "components/viz/common/gpu/context_lost_observer.h"
+#include "components/viz/common/viz_common_export.h"
+#include "gpu/command_buffer/common/capabilities.h"
+#include "gpu/command_buffer/common/context_result.h"
+
+class GrContext;
+
+namespace base {
+class Lock;
+}
+
+namespace gpu {
+class ContextSupport;
+struct GpuFeatureInfo;
+
+namespace raster {
+class RasterInterface;
+}
+}  // namespace gpu
+
+namespace viz {
+
+class VIZ_COMMON_EXPORT RasterContextProvider {
+ public:
+  class VIZ_COMMON_EXPORT ScopedRasterContextLock {
+   public:
+    explicit ScopedRasterContextLock(RasterContextProvider* context_provider);
+    ~ScopedRasterContextLock();
+
+    gpu::raster::RasterInterface* RasterInterface() {
+      return context_provider_->RasterInterface();
+    }
+
+   private:
+    RasterContextProvider* const context_provider_;
+    base::AutoLock context_lock_;
+    std::unique_ptr<ContextCacheController::ScopedBusy> busy_;
+  };
+
+  // RefCounted interface.
+  virtual void AddRef() const = 0;
+  virtual void Release() const = 0;
+
+  // Bind the 3d context to the current thread. This should be called before
+  // accessing the contexts. Calling it more than once should have no effect.
+  // Once this function has been called, the class should only be accessed
+  // from the same thread unless the function has some explicitly specified
+  // rules for access on a different thread. See SetupLockOnMainThread(), which
+  // can be used to provide access from multiple threads.
+  virtual gpu::ContextResult BindToCurrentThread() = 0;
+
+  // Adds/removes an observer to be called when the context is lost. AddObserver
+  // should be called before BindToCurrentThread from the same thread that the
+  // context is bound to, or any time while the lock is acquired after checking
+  // for context loss.
+  // NOTE: Implementations must avoid post-tasking the to the observer directly
+  // as the observer may remove itself before the task runs.
+  virtual void AddObserver(ContextLostObserver* obs) = 0;
+  virtual void RemoveObserver(ContextLostObserver* obs) = 0;
+
+  // Returns the lock that should be held if using this context from multiple
+  // threads. This can be called on any thread.
+  // NOTE: Helper method for ScopedContextLock. Use that instead of calling this
+  // directly.
+  virtual base::Lock* GetLock() = 0;
+
+  // Get a CacheController interface to the 3d context.  The context provider
+  // must have been successfully bound to a thread before calling this.
+  virtual ContextCacheController* CacheController() = 0;
+
+  // Get a ContextSupport interface to the 3d context.  The context provider
+  // must have been successfully bound to a thread before calling this.
+  virtual gpu::ContextSupport* ContextSupport() = 0;
+
+  // Get a Skia GPU raster interface to the 3d context.  The context provider
+  // must have been successfully bound to a thread before calling this.  Returns
+  // nullptr if a GrContext fails to initialize on this context.
+  virtual class GrContext* GrContext() = 0;
+
+  // Invalidates the cached OpenGL state in GrContext.  The context provider
+  // must have been successfully bound to a thread before calling this.
+  // See skia GrContext::resetContext for details.
+  virtual void InvalidateGrContext(uint32_t state) = 0;
+
+  // Returns the capabilities of the currently bound 3d context.  The context
+  // provider must have been successfully bound to a thread before calling this.
+  virtual const gpu::Capabilities& ContextCapabilities() const = 0;
+
+  // Returns feature blacklist decisions and driver bug workarounds info.  The
+  // context provider must have been successfully bound to a thread before
+  // calling this.
+  virtual const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const = 0;
+
+  // Get a Raster interface to the 3d context.  The context provider must have
+  // been successfully bound to a thread before calling this.
+  virtual gpu::raster::RasterInterface* RasterInterface() = 0;
+
+ protected:
+  virtual ~RasterContextProvider() = default;
+};
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_COMMON_GPU_RASTER_CONTEXT_PROVIDER_H_
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc
index 77bd2fb..d5c8f311 100644
--- a/components/viz/service/display/display.cc
+++ b/components/viz/service/display/display.cc
@@ -99,8 +99,8 @@
   InitializeRenderer();
 
   // This depends on assumptions that Display::Initialize will happen on the
-  // same callstack as the ContextProvider being created/initialized or else it
-  // could miss a callback before setting this.
+  // same callstack as the ContextProvider being created/initialized or else
+  // it could miss a callback before setting this.
   if (auto* context = output_surface_->context_provider())
     context->AddObserver(this);
 }
diff --git a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc
index f7b9821..c0c250d 100644
--- a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc
+++ b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc
@@ -23,7 +23,7 @@
     Display* display,
     mojom::DisplayClient* display_client,
     scoped_refptr<ContextProvider> context_provider,
-    scoped_refptr<ContextProvider> worker_context_provider,
+    scoped_refptr<RasterContextProvider> worker_context_provider,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     SharedBitmapManager* shared_bitmap_manager)
diff --git a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h
index 4044f9a1..6c2d699d 100644
--- a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h
+++ b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h
@@ -42,7 +42,7 @@
       Display* display,
       mojom::DisplayClient* display_client,
       scoped_refptr<ContextProvider> context_provider,
-      scoped_refptr<ContextProvider> worker_context_provider,
+      scoped_refptr<RasterContextProvider> worker_context_provider,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       SharedBitmapManager* shared_bitmap_manager);
diff --git a/components/viz/test/test_layer_tree_frame_sink.cc b/components/viz/test/test_layer_tree_frame_sink.cc
index 1fba2ada..8b270d4 100644
--- a/components/viz/test/test_layer_tree_frame_sink.cc
+++ b/components/viz/test/test_layer_tree_frame_sink.cc
@@ -22,7 +22,7 @@
 
 TestLayerTreeFrameSink::TestLayerTreeFrameSink(
     scoped_refptr<ContextProvider> compositor_context_provider,
-    scoped_refptr<ContextProvider> worker_context_provider,
+    scoped_refptr<RasterContextProvider> worker_context_provider,
     SharedBitmapManager* shared_bitmap_manager,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     const RendererSettings& renderer_settings,
diff --git a/components/viz/test/test_layer_tree_frame_sink.h b/components/viz/test/test_layer_tree_frame_sink.h
index 563ecfe..2c5d640a 100644
--- a/components/viz/test/test_layer_tree_frame_sink.h
+++ b/components/viz/test/test_layer_tree_frame_sink.h
@@ -55,7 +55,7 @@
   // is out-of-process and can't return resources synchronously.
   TestLayerTreeFrameSink(
       scoped_refptr<ContextProvider> compositor_context_provider,
-      scoped_refptr<ContextProvider> worker_context_provider,
+      scoped_refptr<RasterContextProvider> worker_context_provider,
       SharedBitmapManager* shared_bitmap_manager,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       const RendererSettings& renderer_settings,
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 1e632db..ea75202 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -406,9 +406,10 @@
       {
         // Note: If context is lost, we delete reference after releasing the
         // lock.
-        viz::ContextProvider::ScopedContextLock lock(
+        viz::RasterContextProvider::ScopedRasterContextLock lock(
             shared_worker_context_provider_.get());
-        lost = lock.RasterContext()->GetGraphicsResetStatusKHR() != GL_NO_ERROR;
+        lost =
+            lock.RasterInterface()->GetGraphicsResetStatusKHR() != GL_NO_ERROR;
       }
       if (lost)
         shared_worker_context_provider_ = nullptr;
@@ -648,6 +649,9 @@
   // The |delegated_output_surface| is given back to the compositor, it
   // delegates to the Display as its root surface. Importantly, it shares the
   // same ContextProvider as the Display's output surface.
+  scoped_refptr<viz::RasterContextProvider> worker_context_provider;
+  if (shared_worker_context_provider_)
+    worker_context_provider = shared_worker_context_provider_;
   auto layer_tree_frame_sink =
       vulkan_context_provider
           ? std::make_unique<viz::DirectLayerTreeFrameSink>(
@@ -660,7 +664,7 @@
                 compositor->frame_sink_id(), GetHostFrameSinkManager(),
                 GetFrameSinkManager(), data->display.get(),
                 data->display_client.get(), context_provider,
-                shared_worker_context_provider_, compositor->task_runner(),
+                worker_context_provider, compositor->task_runner(),
                 GetGpuMemoryBufferManager(),
                 viz::ServerSharedBitmapManager::current());
   data->display->Resize(compositor->size());
diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc
index 8bfdd5a..b76a632 100644
--- a/content/browser/compositor/viz_process_transport_factory.cc
+++ b/content/browser/compositor/viz_process_transport_factory.cc
@@ -463,12 +463,13 @@
   params.enable_surface_synchronization =
       features::IsSurfaceSynchronizationEnabled();
 
-  scoped_refptr<ui::ContextProviderCommandBuffer> compositor_context;
-  scoped_refptr<ui::ContextProviderCommandBuffer> worker_context;
+  scoped_refptr<viz::ContextProvider> compositor_context;
+  scoped_refptr<viz::RasterContextProvider> worker_context;
   if (gpu_compositing) {
     // Only pass the contexts to the compositor if it will use gpu compositing.
     compositor_context = compositor_context_provider_;
-    worker_context = shared_worker_context_provider_;
+    if (shared_worker_context_provider_)
+      worker_context = shared_worker_context_provider_;
   }
   compositor->SetLayerTreeFrameSink(
       std::make_unique<viz::ClientLayerTreeFrameSink>(
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.cc b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
index db0e046..ec01c52 100644
--- a/content/renderer/android/synchronous_layer_tree_frame_sink.cc
+++ b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
@@ -111,7 +111,7 @@
 
 SynchronousLayerTreeFrameSink::SynchronousLayerTreeFrameSink(
     scoped_refptr<viz::ContextProvider> context_provider,
-    scoped_refptr<viz::ContextProvider> worker_context_provider,
+    scoped_refptr<viz::RasterContextProvider> worker_context_provider,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     int routing_id,
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.h b/content/renderer/android/synchronous_layer_tree_frame_sink.h
index 7e614ab8..a273d304 100644
--- a/content/renderer/android/synchronous_layer_tree_frame_sink.h
+++ b/content/renderer/android/synchronous_layer_tree_frame_sink.h
@@ -70,7 +70,7 @@
  public:
   SynchronousLayerTreeFrameSink(
       scoped_refptr<viz::ContextProvider> context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       int routing_id,
diff --git a/content/renderer/layout_test_dependencies.h b/content/renderer/layout_test_dependencies.h
index 2fdb236e..167d9be1 100644
--- a/content/renderer/layout_test_dependencies.h
+++ b/content/renderer/layout_test_dependencies.h
@@ -25,6 +25,7 @@
 
 namespace viz {
 class ContextProvider;
+class RasterContextProvider;
 }
 
 namespace content {
@@ -40,7 +41,7 @@
       int32_t routing_id,
       scoped_refptr<gpu::GpuChannelHost> gpu_channel,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       CompositorDependencies* deps) = 0;
 
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 4190abe..f3d6424 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -2434,10 +2434,9 @@
   // Try to reuse existing shared worker context provider.
   if (shared_worker_context_provider_) {
     // Note: If context is lost, delete reference after releasing the lock.
-    viz::ContextProvider::ScopedContextLock lock(
+    viz::RasterContextProvider::ScopedRasterContextLock lock(
         shared_worker_context_provider_.get());
-    if (shared_worker_context_provider_->RasterContext()
-            ->GetGraphicsResetStatusKHR() == GL_NO_ERROR)
+    if (lock.RasterInterface()->GetGraphicsResetStatusKHR() == GL_NO_ERROR)
       return shared_worker_context_provider_;
   }
 
diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc
index 3b6ac86..c557096 100644
--- a/content/test/layouttest_support.cc
+++ b/content/test/layouttest_support.cc
@@ -312,7 +312,7 @@
       int32_t routing_id,
       scoped_refptr<gpu::GpuChannelHost> gpu_channel,
       scoped_refptr<viz::ContextProvider> compositor_context_provider,
-      scoped_refptr<viz::ContextProvider> worker_context_provider,
+      scoped_refptr<viz::RasterContextProvider> worker_context_provider,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       CompositorDependencies* deps) override {
     // This could override the GpuChannel for a LayerTreeFrameSink that was
diff --git a/services/ui/public/cpp/gpu/context_provider_command_buffer.cc b/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
index fc2e105..7bb5ba6d 100644
--- a/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
+++ b/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
@@ -202,6 +202,14 @@
   return GL_RGB;
 }
 
+void ContextProviderCommandBuffer::AddRef() const {
+  base::RefCountedThreadSafe<ContextProviderCommandBuffer>::AddRef();
+}
+
+void ContextProviderCommandBuffer::Release() const {
+  base::RefCountedThreadSafe<ContextProviderCommandBuffer>::Release();
+}
+
 gpu::ContextResult ContextProviderCommandBuffer::BindToCurrentThread() {
   // This is called on the thread the context will be used.
   DCHECK(context_thread_checker_.CalledOnValidThread());
@@ -371,7 +379,7 @@
   return gles2_impl_.get();
 }
 
-gpu::raster::RasterInterface* ContextProviderCommandBuffer::RasterContext() {
+gpu::raster::RasterInterface* ContextProviderCommandBuffer::RasterInterface() {
   DCHECK(bind_tried_);
   DCHECK_EQ(bind_result_, gpu::ContextResult::kSuccess);
   CheckValidThreadOrLockAcquired();
@@ -380,7 +388,7 @@
     return raster_impl_.get();
 
   if (!attributes_.enable_raster_interface) {
-    DLOG(ERROR) << "Unexpected access to RasterContext()";
+    DLOG(ERROR) << "Unexpected access to RasterInterface()";
     return nullptr;
   }
 
diff --git a/services/ui/public/cpp/gpu/context_provider_command_buffer.h b/services/ui/public/cpp/gpu/context_provider_command_buffer.h
index 3fa465f..132803e 100644
--- a/services/ui/public/cpp/gpu/context_provider_command_buffer.h
+++ b/services/ui/public/cpp/gpu/context_provider_command_buffer.h
@@ -17,6 +17,7 @@
 #include "base/threading/thread_checker.h"
 #include "base/trace_event/memory_dump_provider.h"
 #include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
 #include "gpu/command_buffer/common/scheduling_priority.h"
@@ -47,10 +48,12 @@
 
 namespace ui {
 
-// Implementation of viz::ContextProvider that provides a GL implementation over
-// command buffer to the GPU process.
+// Implementation of viz::ContextProvider that provides a GL implementation
+// over command buffer to the GPU process.
 class ContextProviderCommandBuffer
-    : public viz::ContextProvider,
+    : public base::RefCountedThreadSafe<ContextProviderCommandBuffer>,
+      public viz::ContextProvider,
+      public viz::RasterContextProvider,
       public base::trace_event::MemoryDumpProvider {
  public:
   ContextProviderCommandBuffer(
@@ -72,10 +75,12 @@
   // on the default framebuffer.
   uint32_t GetCopyTextureInternalFormat();
 
-  // viz::ContextProvider implementation.
+  // viz::ContextProvider / viz::RasterContextProvider implementation.
+  void AddRef() const override;
+  void Release() const override;
   gpu::ContextResult BindToCurrentThread() override;
   gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::raster::RasterInterface* RasterContext() override;
+  gpu::raster::RasterInterface* RasterInterface() override;
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   viz::ContextCacheController* CacheController() override;
@@ -97,6 +102,7 @@
       scoped_refptr<base::SingleThreadTaskRunner> default_task_runner);
 
  protected:
+  friend class base::RefCountedThreadSafe<ContextProviderCommandBuffer>;
   ~ContextProviderCommandBuffer() override;
 
   void OnLostContext();
diff --git a/third_party/WebKit/Source/platform/graphics/Image.h b/third_party/WebKit/Source/platform/graphics/Image.h
index ac07eb8..ab3537f6 100644
--- a/third_party/WebKit/Source/platform/graphics/Image.h
+++ b/third_party/WebKit/Source/platform/graphics/Image.h
@@ -218,9 +218,9 @@
 
   virtual bool ApplyShader(PaintFlags&, const SkMatrix& local_matrix);
 
-  // Use ContextProvider() for immediate use only, use ContextProviderWrapper()
-  // to obtain a retainable reference.
-  // Note: Implemented only in sub-classes that use the GPU.
+  // Use ContextProvider() for immediate use only, use
+  // ContextProviderWrapper() to obtain a retainable reference. Note:
+  // Implemented only in sub-classes that use the GPU.
   virtual WebGraphicsContext3DProvider* ContextProvider() const {
     return nullptr;
   }
diff --git a/third_party/WebKit/Source/platform/graphics/VideoFrameResourceProvider.cpp b/third_party/WebKit/Source/platform/graphics/VideoFrameResourceProvider.cpp
index a355e81..8405674d 100644
--- a/third_party/WebKit/Source/platform/graphics/VideoFrameResourceProvider.cpp
+++ b/third_party/WebKit/Source/platform/graphics/VideoFrameResourceProvider.cpp
@@ -9,6 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "cc/resources/layer_tree_resource_provider.h"
 #include "cc/resources/video_resource_updater.h"
+#include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/quads/render_pass.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
 #include "components/viz/common/quads/texture_draw_quad.h"
diff --git a/ui/compositor/test/in_process_context_provider.cc b/ui/compositor/test/in_process_context_provider.cc
index 8309ae6..265c48b 100644
--- a/ui/compositor/test/in_process_context_provider.cc
+++ b/ui/compositor/test/in_process_context_provider.cc
@@ -84,6 +84,14 @@
          context_thread_checker_.CalledOnValidThread());
 }
 
+void InProcessContextProvider::AddRef() const {
+  base::RefCountedThreadSafe<InProcessContextProvider>::AddRef();
+}
+
+void InProcessContextProvider::Release() const {
+  base::RefCountedThreadSafe<InProcessContextProvider>::Release();
+}
+
 gpu::ContextResult InProcessContextProvider::BindToCurrentThread() {
   // This is called on the thread the context will be used.
   DCHECK(context_thread_checker_.CalledOnValidThread());
@@ -136,7 +144,7 @@
   return context_->GetImplementation();
 }
 
-gpu::raster::RasterInterface* InProcessContextProvider::RasterContext() {
+gpu::raster::RasterInterface* InProcessContextProvider::RasterInterface() {
   CheckValidThreadOrLockAcquired();
 
   return raster_context_.get();
diff --git a/ui/compositor/test/in_process_context_provider.h b/ui/compositor/test/in_process_context_provider.h
index 9b8bd92..11e1263 100644
--- a/ui/compositor/test/in_process_context_provider.h
+++ b/ui/compositor/test/in_process_context_provider.h
@@ -14,6 +14,7 @@
 #include "base/synchronization/lock.h"
 #include "base/threading/thread_checker.h"
 #include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
 #include "gpu/ipc/common/surface_handle.h"
 #include "ui/gfx/native_widget_types.h"
@@ -30,7 +31,10 @@
 
 namespace ui {
 
-class InProcessContextProvider : public viz::ContextProvider {
+class InProcessContextProvider
+    : public base::RefCountedThreadSafe<InProcessContextProvider>,
+      public viz::ContextProvider,
+      public viz::RasterContextProvider {
  public:
   static scoped_refptr<InProcessContextProvider> Create(
       const gpu::gles2::ContextCreationAttribHelper& attribs,
@@ -48,12 +52,14 @@
       InProcessContextProvider* shared_context,
       bool support_locking);
 
-  // cc::ContextProvider implementation.
+  // viz::ContextProvider / viz::RasterContextProvider implementation.
+  void AddRef() const override;
+  void Release() const override;
   gpu::ContextResult BindToCurrentThread() override;
   const gpu::Capabilities& ContextCapabilities() const override;
   const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override;
   gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::raster::RasterInterface* RasterContext() override;
+  gpu::raster::RasterInterface* RasterInterface() override;
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   viz::ContextCacheController* CacheController() override;
@@ -67,6 +73,8 @@
   uint32_t GetCopyTextureInternalFormat();
 
  private:
+  friend class base::RefCountedThreadSafe<InProcessContextProvider>;
+
   InProcessContextProvider(
       const gpu::gles2::ContextCreationAttribHelper& attribs,
       InProcessContextProvider* shared_context,