Index: content/renderer/gpu/render_widget_compositor.cc |
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc |
index 4ffa32b5036361345d22c2458877cd1b410c6cc0..e46c83e64ea34a27154cdd374f8bf570d69e6f8b 100644 |
--- a/content/renderer/gpu/render_widget_compositor.cc |
+++ b/content/renderer/gpu/render_widget_compositor.cc |
@@ -27,15 +27,12 @@ |
#include "cc/output/copy_output_request.h" |
#include "cc/output/copy_output_result.h" |
#include "cc/resources/single_release_callback.h" |
+#include "cc/scheduler/begin_frame_source.h" |
#include "cc/trees/layer_tree_host.h" |
-#include "content/child/child_gpu_memory_buffer_manager.h" |
-#include "content/child/child_shared_bitmap_manager.h" |
#include "content/common/content_switches_internal.h" |
#include "content/common/gpu/client/context_provider_command_buffer.h" |
#include "content/public/common/content_switches.h" |
-#include "content/renderer/gpu/compositor_external_begin_frame_source.h" |
#include "content/renderer/input/input_handler_manager.h" |
-#include "content/renderer/render_thread_impl.h" |
#include "content/renderer/scheduler/renderer_scheduler.h" |
#include "gpu/command_buffer/client/gles2_interface.h" |
#include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallback.h" |
@@ -162,10 +159,30 @@ gfx::Size CalculateDefaultTileSize() { |
// static |
scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
RenderWidget* widget, |
- bool threaded) { |
+ CompositorDependencies* compositor_deps) { |
scoped_ptr<RenderWidgetCompositor> compositor( |
- new RenderWidgetCompositor(widget, threaded)); |
+ new RenderWidgetCompositor(widget, compositor_deps)); |
+ compositor->Initialize(); |
+ return compositor; |
+} |
+ |
+RenderWidgetCompositor::RenderWidgetCompositor( |
+ RenderWidget* widget, |
+ CompositorDependencies* compositor_deps) |
+ : num_failed_recreate_attempts_(0), |
+ widget_(widget), |
+ compositor_deps_(compositor_deps), |
+ send_v8_idle_notification_after_commit_(true), |
+ weak_factory_(this) { |
+ CommandLine* cmd = CommandLine::ForCurrentProcess(); |
+ |
+ if (cmd->HasSwitch(switches::kEnableV8IdleNotificationAfterCommit)) |
+ send_v8_idle_notification_after_commit_ = true; |
+ if (cmd->HasSwitch(switches::kDisableV8IdleNotificationAfterCommit)) |
+ send_v8_idle_notification_after_commit_ = false; |
+} |
+void RenderWidgetCompositor::Initialize() { |
CommandLine* cmd = CommandLine::ForCurrentProcess(); |
cc::LayerTreeSettings settings; |
@@ -222,23 +239,17 @@ scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width, |
max_untiled_layer_height); |
- RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
- // render_thread may be NULL in tests. |
- if (render_thread) { |
- settings.impl_side_painting = |
- render_thread->is_impl_side_painting_enabled(); |
- settings.gpu_rasterization_forced = |
- render_thread->is_gpu_rasterization_forced(); |
- settings.gpu_rasterization_enabled = |
- render_thread->is_gpu_rasterization_enabled(); |
- settings.can_use_lcd_text = render_thread->is_lcd_text_enabled(); |
- settings.use_distance_field_text = |
- render_thread->is_distance_field_text_enabled(); |
- settings.use_zero_copy = render_thread->is_zero_copy_enabled(); |
- settings.use_one_copy = render_thread->is_one_copy_enabled(); |
- settings.use_image_texture_target = |
- render_thread->use_image_texture_target(); |
- } |
+ settings.impl_side_painting = compositor_deps_->IsImplSidePaintingEnabled(); |
+ settings.gpu_rasterization_forced = |
+ compositor_deps_->IsGpuRasterizationForced(); |
+ settings.gpu_rasterization_enabled = |
+ compositor_deps_->IsGpuRasterizationEnabled(); |
+ settings.can_use_lcd_text = compositor_deps_->IsLcdTextEnabled(); |
+ settings.use_distance_field_text = |
+ compositor_deps_->IsDistanceFieldTextEnabled(); |
+ settings.use_zero_copy = compositor_deps_->IsZeroCopyEnabled(); |
+ settings.use_one_copy = compositor_deps_->IsOneCopyEnabled(); |
+ settings.use_image_texture_target = compositor_deps_->GetImageTextureTarget(); |
settings.calculate_top_controls_position = |
cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation); |
@@ -337,7 +348,7 @@ scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
settings.gpu_rasterization_enabled = false; |
settings.using_synchronous_renderer_compositor = |
synchronous_compositor_factory; |
- settings.record_full_layer = widget->DoesRecordFullLayer(); |
+ settings.record_full_layer = widget_->DoesRecordFullLayer(); |
settings.report_overscroll_only_for_scrollable_axes = |
!synchronous_compositor_factory; |
settings.max_partial_texture_updates = 0; |
@@ -402,24 +413,33 @@ scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
if (cmd->HasSwitch(switches::kDisableLowResTiling)) |
settings.create_low_res_tiling = false; |
- compositor->Initialize(settings); |
- |
- return compositor.Pass(); |
-} |
+ scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = |
+ compositor_deps_->GetCompositorImplThreadTaskRunner(); |
+ scoped_refptr<base::SingleThreadTaskRunner> |
+ main_thread_compositor_task_runner = |
+ compositor_deps_->GetCompositorMainThreadTaskRunner(); |
+ cc::SharedBitmapManager* shared_bitmap_manager = |
+ compositor_deps_->GetSharedBitmapManager(); |
+ gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = |
+ compositor_deps_->GetGpuMemoryBufferManager(); |
-RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget, |
- bool threaded) |
- : num_failed_recreate_attempts_(0), |
- threaded_(threaded), |
- widget_(widget), |
- send_v8_idle_notification_after_commit_(true), |
- weak_factory_(this) { |
- CommandLine* cmd = CommandLine::ForCurrentProcess(); |
+ scoped_ptr<cc::BeginFrameSource> external_begin_frame_source; |
+ if (settings.use_external_begin_frame_source) { |
+ external_begin_frame_source = |
+ compositor_deps_->CreateExternalBeginFrameSource(widget_->routing_id()); |
+ } |
- if (cmd->HasSwitch(switches::kEnableV8IdleNotificationAfterCommit)) |
- send_v8_idle_notification_after_commit_ = true; |
- if (cmd->HasSwitch(switches::kDisableV8IdleNotificationAfterCommit)) |
- send_v8_idle_notification_after_commit_ = false; |
+ if (compositor_thread_task_runner.get()) { |
+ layer_tree_host_ = cc::LayerTreeHost::CreateThreaded( |
+ this, shared_bitmap_manager, gpu_memory_buffer_manager, settings, |
+ main_thread_compositor_task_runner, compositor_thread_task_runner, |
+ external_begin_frame_source.Pass()); |
+ } else { |
+ layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded( |
+ this, this, shared_bitmap_manager, gpu_memory_buffer_manager, settings, |
+ main_thread_compositor_task_runner, external_begin_frame_source.Pass()); |
+ } |
+ DCHECK(layer_tree_host_); |
} |
RenderWidgetCompositor::~RenderWidgetCompositor() {} |
@@ -515,64 +535,8 @@ bool RenderWidgetCompositor::SendMessageToMicroBenchmark( |
return layer_tree_host_->SendMessageToMicroBenchmark(id, value.Pass()); |
} |
-void RenderWidgetCompositor::Initialize(const cc::LayerTreeSettings& settings) { |
- scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy; |
- scoped_refptr<base::SingleThreadTaskRunner> |
- main_thread_compositor_task_runner(base::MessageLoopProxy::current()); |
- RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
- cc::SharedBitmapManager* shared_bitmap_manager = NULL; |
- gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = NULL; |
- // render_thread may be NULL in tests. |
- if (render_thread) { |
- compositor_message_loop_proxy = |
- render_thread->compositor_message_loop_proxy(); |
- shared_bitmap_manager = render_thread->shared_bitmap_manager(); |
- gpu_memory_buffer_manager = render_thread->gpu_memory_buffer_manager(); |
- main_thread_compositor_task_runner = |
- render_thread->main_thread_compositor_task_runner(); |
- } |
- scoped_ptr<cc::BeginFrameSource> external_begin_frame_source; |
-#if defined(OS_ANDROID) |
- if (SynchronousCompositorFactory* factory = |
- SynchronousCompositorFactory::GetInstance()) { |
- DCHECK(settings.use_external_begin_frame_source); |
- external_begin_frame_source = |
- factory->CreateExternalBeginFrameSource(widget_->routing_id()); |
- } |
-#endif |
- if (render_thread && |
- !external_begin_frame_source.get() && |
- settings.use_external_begin_frame_source) { |
- external_begin_frame_source.reset(new CompositorExternalBeginFrameSource( |
- widget_->routing_id())); |
- } |
- if (compositor_message_loop_proxy.get()) { |
- layer_tree_host_ = |
- cc::LayerTreeHost::CreateThreaded(this, |
- shared_bitmap_manager, |
- gpu_memory_buffer_manager, |
- settings, |
- main_thread_compositor_task_runner, |
- compositor_message_loop_proxy, |
- external_begin_frame_source.Pass()); |
- } else { |
- layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded( |
- this, |
- this, |
- shared_bitmap_manager, |
- gpu_memory_buffer_manager, |
- settings, |
- main_thread_compositor_task_runner, |
- external_begin_frame_source.Pass()); |
- } |
- DCHECK(layer_tree_host_); |
-} |
- |
void RenderWidgetCompositor::setSurfaceReady() { |
- // In tests without a RenderThreadImpl, don't set ready as this kicks |
- // off creating output surfaces that the test can't create. |
- if (RenderThreadImpl::current()) |
- layer_tree_host_->SetLayerTreeHostClientReady(); |
+ layer_tree_host_->SetLayerTreeHostClientReady(); |
} |
void RenderWidgetCompositor::setRootLayer(const blink::WebLayer& layer) { |
@@ -736,7 +700,8 @@ void RenderWidgetCompositor::compositeAndReadbackAsync( |
// Force a commit to happen. The temporary copy output request will |
// be installed after layout which will happen as a part of the commit, when |
// there is guaranteed to be a root layer. |
- if (!threaded_ && |
+ bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); |
+ if (!threaded && |
!layer_tree_host_->settings().single_thread_proxy_scheduler) { |
layer_tree_host_->Composite(gfx::FrameTime::Now()); |
} else { |
@@ -805,9 +770,7 @@ void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { |
double interval_sec = args.interval.InSecondsF(); |
WebBeginFrameArgs web_begin_frame_args = |
WebBeginFrameArgs(frame_time_sec, deadline_sec, interval_sec); |
- RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
- if (render_thread) // Can be null in tests. |
- render_thread->renderer_scheduler()->WillBeginFrame(args); |
+ compositor_deps_->GetRendererScheduler()->WillBeginFrame(args); |
widget_->webwidget()->beginFrame(web_begin_frame_args); |
} |
@@ -901,9 +864,7 @@ void RenderWidgetCompositor::DidCommit() { |
widget_->DidCommitCompositorFrame(); |
widget_->didBecomeReadyForAdditionalInput(); |
- RenderThreadImpl* render_thread = RenderThreadImpl::current(); |
- if (render_thread) // Can be null in tests. |
- render_thread->renderer_scheduler()->DidCommitFrameToCompositor(); |
+ compositor_deps_->GetRendererScheduler()->DidCommitFrameToCompositor(); |
} |
void RenderWidgetCompositor::DidCommitAndDrawFrame() { |
@@ -912,7 +873,8 @@ void RenderWidgetCompositor::DidCommitAndDrawFrame() { |
void RenderWidgetCompositor::DidCompleteSwapBuffers() { |
widget_->didCompleteSwapBuffers(); |
- if (!threaded_) |
+ bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); |
+ if (!threaded) |
widget_->OnSwapBuffersComplete(); |
} |
@@ -930,7 +892,7 @@ void RenderWidgetCompositor::DidAbortSwapBuffers() { |
void RenderWidgetCompositor::RateLimitSharedMainThreadContext() { |
cc::ContextProvider* provider = |
- RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); |
+ compositor_deps_->GetSharedMainThreadContextProvider(); |
provider->ContextGL()->RateLimitOffscreenContextCHROMIUM(); |
} |