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,