OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/gpu/render_widget_compositor.h" | 5 #include "content/renderer/gpu/render_widget_compositor.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
13 #include "base/synchronization/lock.h" | 13 #include "base/synchronization/lock.h" |
14 #include "base/sys_info.h" | 14 #include "base/sys_info.h" |
15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
16 #include "base/values.h" | 16 #include "base/values.h" |
17 #include "cc/base/latency_info_swap_promise.h" | 17 #include "cc/base/latency_info_swap_promise.h" |
18 #include "cc/base/latency_info_swap_promise_monitor.h" | 18 #include "cc/base/latency_info_swap_promise_monitor.h" |
19 #include "cc/base/swap_promise.h" | 19 #include "cc/base/swap_promise.h" |
20 #include "cc/base/switches.h" | 20 #include "cc/base/switches.h" |
21 #include "cc/blink/web_layer_impl.h" | 21 #include "cc/blink/web_layer_impl.h" |
22 #include "cc/debug/layer_tree_debug_state.h" | 22 #include "cc/debug/layer_tree_debug_state.h" |
23 #include "cc/debug/micro_benchmark.h" | 23 #include "cc/debug/micro_benchmark.h" |
24 #include "cc/input/layer_selection_bound.h" | 24 #include "cc/input/layer_selection_bound.h" |
25 #include "cc/layers/layer.h" | 25 #include "cc/layers/layer.h" |
26 #include "cc/output/begin_frame_args.h" | 26 #include "cc/output/begin_frame_args.h" |
27 #include "cc/output/copy_output_request.h" | 27 #include "cc/output/copy_output_request.h" |
28 #include "cc/output/copy_output_result.h" | 28 #include "cc/output/copy_output_result.h" |
29 #include "cc/resources/single_release_callback.h" | 29 #include "cc/resources/single_release_callback.h" |
| 30 #include "cc/scheduler/begin_frame_source.h" |
30 #include "cc/trees/layer_tree_host.h" | 31 #include "cc/trees/layer_tree_host.h" |
31 #include "content/child/child_gpu_memory_buffer_manager.h" | |
32 #include "content/child/child_shared_bitmap_manager.h" | |
33 #include "content/common/content_switches_internal.h" | 32 #include "content/common/content_switches_internal.h" |
34 #include "content/common/gpu/client/context_provider_command_buffer.h" | 33 #include "content/common/gpu/client/context_provider_command_buffer.h" |
35 #include "content/public/common/content_switches.h" | 34 #include "content/public/common/content_switches.h" |
36 #include "content/renderer/gpu/compositor_external_begin_frame_source.h" | |
37 #include "content/renderer/input/input_handler_manager.h" | 35 #include "content/renderer/input/input_handler_manager.h" |
38 #include "content/renderer/render_thread_impl.h" | |
39 #include "content/renderer/scheduler/renderer_scheduler.h" | 36 #include "content/renderer/scheduler/renderer_scheduler.h" |
40 #include "gpu/command_buffer/client/gles2_interface.h" | 37 #include "gpu/command_buffer/client/gles2_interface.h" |
41 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac
k.h" | 38 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac
k.h" |
42 #include "third_party/WebKit/public/platform/WebSelectionBound.h" | 39 #include "third_party/WebKit/public/platform/WebSelectionBound.h" |
43 #include "third_party/WebKit/public/platform/WebSize.h" | 40 #include "third_party/WebKit/public/platform/WebSize.h" |
44 #include "third_party/WebKit/public/web/WebKit.h" | 41 #include "third_party/WebKit/public/web/WebKit.h" |
45 #include "third_party/WebKit/public/web/WebWidget.h" | 42 #include "third_party/WebKit/public/web/WebWidget.h" |
46 #include "ui/gfx/frame_time.h" | 43 #include "ui/gfx/frame_time.h" |
47 #include "ui/gl/gl_switches.h" | 44 #include "ui/gl/gl_switches.h" |
48 #include "ui/native_theme/native_theme_switches.h" | 45 #include "ui/native_theme/native_theme_switches.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 152 } |
156 #endif | 153 #endif |
157 return gfx::Size(default_tile_size, default_tile_size); | 154 return gfx::Size(default_tile_size, default_tile_size); |
158 } | 155 } |
159 | 156 |
160 } // namespace | 157 } // namespace |
161 | 158 |
162 // static | 159 // static |
163 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( | 160 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
164 RenderWidget* widget, | 161 RenderWidget* widget, |
165 bool threaded) { | 162 CompositorDependencies* compositor_deps) { |
166 scoped_ptr<RenderWidgetCompositor> compositor( | 163 scoped_ptr<RenderWidgetCompositor> compositor( |
167 new RenderWidgetCompositor(widget, threaded)); | 164 new RenderWidgetCompositor(widget, compositor_deps)); |
| 165 compositor->Initialize(); |
| 166 return compositor; |
| 167 } |
168 | 168 |
| 169 RenderWidgetCompositor::RenderWidgetCompositor( |
| 170 RenderWidget* widget, |
| 171 CompositorDependencies* compositor_deps) |
| 172 : num_failed_recreate_attempts_(0), |
| 173 widget_(widget), |
| 174 compositor_deps_(compositor_deps), |
| 175 send_v8_idle_notification_after_commit_(true), |
| 176 weak_factory_(this) { |
| 177 CommandLine* cmd = CommandLine::ForCurrentProcess(); |
| 178 |
| 179 if (cmd->HasSwitch(switches::kEnableV8IdleNotificationAfterCommit)) |
| 180 send_v8_idle_notification_after_commit_ = true; |
| 181 if (cmd->HasSwitch(switches::kDisableV8IdleNotificationAfterCommit)) |
| 182 send_v8_idle_notification_after_commit_ = false; |
| 183 } |
| 184 |
| 185 void RenderWidgetCompositor::Initialize() { |
169 CommandLine* cmd = CommandLine::ForCurrentProcess(); | 186 CommandLine* cmd = CommandLine::ForCurrentProcess(); |
170 | 187 |
171 cc::LayerTreeSettings settings; | 188 cc::LayerTreeSettings settings; |
172 | 189 |
173 // For web contents, layer transforms should scale up the contents of layers | 190 // For web contents, layer transforms should scale up the contents of layers |
174 // to keep content always crisp when possible. | 191 // to keep content always crisp when possible. |
175 settings.layer_transforms_should_scale_layer_contents = true; | 192 settings.layer_transforms_should_scale_layer_contents = true; |
176 | 193 |
177 settings.throttle_frame_production = | 194 settings.throttle_frame_production = |
178 !cmd->HasSwitch(switches::kDisableGpuVsync); | 195 !cmd->HasSwitch(switches::kDisableGpuVsync); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 int max_untiled_layer_height = settings.max_untiled_layer_size.height(); | 232 int max_untiled_layer_height = settings.max_untiled_layer_size.height(); |
216 if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) { | 233 if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) { |
217 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1, | 234 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1, |
218 std::numeric_limits<int>::max(), | 235 std::numeric_limits<int>::max(), |
219 &max_untiled_layer_height); | 236 &max_untiled_layer_height); |
220 } | 237 } |
221 | 238 |
222 settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width, | 239 settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width, |
223 max_untiled_layer_height); | 240 max_untiled_layer_height); |
224 | 241 |
225 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | 242 settings.impl_side_painting = compositor_deps_->IsImplSidePaintingEnabled(); |
226 // render_thread may be NULL in tests. | 243 settings.gpu_rasterization_forced = |
227 if (render_thread) { | 244 compositor_deps_->IsGpuRasterizationForced(); |
228 settings.impl_side_painting = | 245 settings.gpu_rasterization_enabled = |
229 render_thread->is_impl_side_painting_enabled(); | 246 compositor_deps_->IsGpuRasterizationEnabled(); |
230 settings.gpu_rasterization_forced = | 247 settings.can_use_lcd_text = compositor_deps_->IsLcdTextEnabled(); |
231 render_thread->is_gpu_rasterization_forced(); | 248 settings.use_distance_field_text = |
232 settings.gpu_rasterization_enabled = | 249 compositor_deps_->IsDistanceFieldTextEnabled(); |
233 render_thread->is_gpu_rasterization_enabled(); | 250 settings.use_zero_copy = compositor_deps_->IsZeroCopyEnabled(); |
234 settings.can_use_lcd_text = render_thread->is_lcd_text_enabled(); | 251 settings.use_one_copy = compositor_deps_->IsOneCopyEnabled(); |
235 settings.use_distance_field_text = | 252 settings.use_image_texture_target = compositor_deps_->GetImageTextureTarget(); |
236 render_thread->is_distance_field_text_enabled(); | |
237 settings.use_zero_copy = render_thread->is_zero_copy_enabled(); | |
238 settings.use_one_copy = render_thread->is_one_copy_enabled(); | |
239 settings.use_image_texture_target = | |
240 render_thread->use_image_texture_target(); | |
241 } | |
242 | 253 |
243 settings.calculate_top_controls_position = | 254 settings.calculate_top_controls_position = |
244 cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation); | 255 cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation); |
245 if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) { | 256 if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) { |
246 std::string top_threshold_str = | 257 std::string top_threshold_str = |
247 cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold); | 258 cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold); |
248 double show_threshold; | 259 double show_threshold; |
249 if (base::StringToDouble(top_threshold_str, &show_threshold) && | 260 if (base::StringToDouble(top_threshold_str, &show_threshold) && |
250 show_threshold >= 0.f && show_threshold <= 1.f) | 261 show_threshold >= 0.f && show_threshold <= 1.f) |
251 settings.top_controls_show_threshold = show_threshold; | 262 settings.top_controls_show_threshold = show_threshold; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 #if defined(OS_ANDROID) | 341 #if defined(OS_ANDROID) |
331 SynchronousCompositorFactory* synchronous_compositor_factory = | 342 SynchronousCompositorFactory* synchronous_compositor_factory = |
332 SynchronousCompositorFactory::GetInstance(); | 343 SynchronousCompositorFactory::GetInstance(); |
333 | 344 |
334 // We can't use GPU rasterization on low-end devices, because the Ganesh | 345 // We can't use GPU rasterization on low-end devices, because the Ganesh |
335 // cache would consume too much memory. | 346 // cache would consume too much memory. |
336 if (base::SysInfo::IsLowEndDevice()) | 347 if (base::SysInfo::IsLowEndDevice()) |
337 settings.gpu_rasterization_enabled = false; | 348 settings.gpu_rasterization_enabled = false; |
338 settings.using_synchronous_renderer_compositor = | 349 settings.using_synchronous_renderer_compositor = |
339 synchronous_compositor_factory; | 350 synchronous_compositor_factory; |
340 settings.record_full_layer = widget->DoesRecordFullLayer(); | 351 settings.record_full_layer = widget_->DoesRecordFullLayer(); |
341 settings.report_overscroll_only_for_scrollable_axes = | 352 settings.report_overscroll_only_for_scrollable_axes = |
342 !synchronous_compositor_factory; | 353 !synchronous_compositor_factory; |
343 settings.max_partial_texture_updates = 0; | 354 settings.max_partial_texture_updates = 0; |
344 if (synchronous_compositor_factory) { | 355 if (synchronous_compositor_factory) { |
345 // Android WebView uses system scrollbars, so make ours invisible. | 356 // Android WebView uses system scrollbars, so make ours invisible. |
346 settings.scrollbar_animator = cc::LayerTreeSettings::NoAnimator; | 357 settings.scrollbar_animator = cc::LayerTreeSettings::NoAnimator; |
347 settings.solid_color_scrollbar_color = SK_ColorTRANSPARENT; | 358 settings.solid_color_scrollbar_color = SK_ColorTRANSPARENT; |
348 } else { | 359 } else { |
349 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade; | 360 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade; |
350 settings.scrollbar_fade_delay_ms = 300; | 361 settings.scrollbar_fade_delay_ms = 300; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 settings.scrollbar_fade_delay_ms = 500; | 406 settings.scrollbar_fade_delay_ms = 500; |
396 settings.scrollbar_fade_resize_delay_ms = 500; | 407 settings.scrollbar_fade_resize_delay_ms = 500; |
397 settings.scrollbar_fade_duration_ms = 300; | 408 settings.scrollbar_fade_duration_ms = 300; |
398 #endif | 409 #endif |
399 | 410 |
400 if (cmd->HasSwitch(switches::kEnableLowResTiling)) | 411 if (cmd->HasSwitch(switches::kEnableLowResTiling)) |
401 settings.create_low_res_tiling = true; | 412 settings.create_low_res_tiling = true; |
402 if (cmd->HasSwitch(switches::kDisableLowResTiling)) | 413 if (cmd->HasSwitch(switches::kDisableLowResTiling)) |
403 settings.create_low_res_tiling = false; | 414 settings.create_low_res_tiling = false; |
404 | 415 |
405 compositor->Initialize(settings); | 416 scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = |
| 417 compositor_deps_->GetCompositorImplThreadTaskRunner(); |
| 418 scoped_refptr<base::SingleThreadTaskRunner> |
| 419 main_thread_compositor_task_runner = |
| 420 compositor_deps_->GetCompositorMainThreadTaskRunner(); |
| 421 cc::SharedBitmapManager* shared_bitmap_manager = |
| 422 compositor_deps_->GetSharedBitmapManager(); |
| 423 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = |
| 424 compositor_deps_->GetGpuMemoryBufferManager(); |
406 | 425 |
407 return compositor.Pass(); | 426 scoped_ptr<cc::BeginFrameSource> external_begin_frame_source; |
408 } | 427 if (settings.use_external_begin_frame_source) { |
| 428 external_begin_frame_source = |
| 429 compositor_deps_->CreateExternalBeginFrameSource(widget_->routing_id()); |
| 430 } |
409 | 431 |
410 RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget, | 432 if (compositor_thread_task_runner.get()) { |
411 bool threaded) | 433 layer_tree_host_ = cc::LayerTreeHost::CreateThreaded( |
412 : num_failed_recreate_attempts_(0), | 434 this, shared_bitmap_manager, gpu_memory_buffer_manager, settings, |
413 threaded_(threaded), | 435 main_thread_compositor_task_runner, compositor_thread_task_runner, |
414 widget_(widget), | 436 external_begin_frame_source.Pass()); |
415 send_v8_idle_notification_after_commit_(true), | 437 } else { |
416 weak_factory_(this) { | 438 layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded( |
417 CommandLine* cmd = CommandLine::ForCurrentProcess(); | 439 this, this, shared_bitmap_manager, gpu_memory_buffer_manager, settings, |
418 | 440 main_thread_compositor_task_runner, external_begin_frame_source.Pass()); |
419 if (cmd->HasSwitch(switches::kEnableV8IdleNotificationAfterCommit)) | 441 } |
420 send_v8_idle_notification_after_commit_ = true; | 442 DCHECK(layer_tree_host_); |
421 if (cmd->HasSwitch(switches::kDisableV8IdleNotificationAfterCommit)) | |
422 send_v8_idle_notification_after_commit_ = false; | |
423 } | 443 } |
424 | 444 |
425 RenderWidgetCompositor::~RenderWidgetCompositor() {} | 445 RenderWidgetCompositor::~RenderWidgetCompositor() {} |
426 | 446 |
427 const base::WeakPtr<cc::InputHandler>& | 447 const base::WeakPtr<cc::InputHandler>& |
428 RenderWidgetCompositor::GetInputHandler() { | 448 RenderWidgetCompositor::GetInputHandler() { |
429 return layer_tree_host_->GetInputHandler(); | 449 return layer_tree_host_->GetInputHandler(); |
430 } | 450 } |
431 | 451 |
432 bool RenderWidgetCompositor::BeginMainFrameRequested() const { | 452 bool RenderWidgetCompositor::BeginMainFrameRequested() const { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 const base::Callback<void(scoped_ptr<base::Value>)>& callback) { | 528 const base::Callback<void(scoped_ptr<base::Value>)>& callback) { |
509 return layer_tree_host_->ScheduleMicroBenchmark(name, value.Pass(), callback); | 529 return layer_tree_host_->ScheduleMicroBenchmark(name, value.Pass(), callback); |
510 } | 530 } |
511 | 531 |
512 bool RenderWidgetCompositor::SendMessageToMicroBenchmark( | 532 bool RenderWidgetCompositor::SendMessageToMicroBenchmark( |
513 int id, | 533 int id, |
514 scoped_ptr<base::Value> value) { | 534 scoped_ptr<base::Value> value) { |
515 return layer_tree_host_->SendMessageToMicroBenchmark(id, value.Pass()); | 535 return layer_tree_host_->SendMessageToMicroBenchmark(id, value.Pass()); |
516 } | 536 } |
517 | 537 |
518 void RenderWidgetCompositor::Initialize(const cc::LayerTreeSettings& settings) { | |
519 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy; | |
520 scoped_refptr<base::SingleThreadTaskRunner> | |
521 main_thread_compositor_task_runner(base::MessageLoopProxy::current()); | |
522 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | |
523 cc::SharedBitmapManager* shared_bitmap_manager = NULL; | |
524 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = NULL; | |
525 // render_thread may be NULL in tests. | |
526 if (render_thread) { | |
527 compositor_message_loop_proxy = | |
528 render_thread->compositor_message_loop_proxy(); | |
529 shared_bitmap_manager = render_thread->shared_bitmap_manager(); | |
530 gpu_memory_buffer_manager = render_thread->gpu_memory_buffer_manager(); | |
531 main_thread_compositor_task_runner = | |
532 render_thread->main_thread_compositor_task_runner(); | |
533 } | |
534 scoped_ptr<cc::BeginFrameSource> external_begin_frame_source; | |
535 #if defined(OS_ANDROID) | |
536 if (SynchronousCompositorFactory* factory = | |
537 SynchronousCompositorFactory::GetInstance()) { | |
538 DCHECK(settings.use_external_begin_frame_source); | |
539 external_begin_frame_source = | |
540 factory->CreateExternalBeginFrameSource(widget_->routing_id()); | |
541 } | |
542 #endif | |
543 if (render_thread && | |
544 !external_begin_frame_source.get() && | |
545 settings.use_external_begin_frame_source) { | |
546 external_begin_frame_source.reset(new CompositorExternalBeginFrameSource( | |
547 widget_->routing_id())); | |
548 } | |
549 if (compositor_message_loop_proxy.get()) { | |
550 layer_tree_host_ = | |
551 cc::LayerTreeHost::CreateThreaded(this, | |
552 shared_bitmap_manager, | |
553 gpu_memory_buffer_manager, | |
554 settings, | |
555 main_thread_compositor_task_runner, | |
556 compositor_message_loop_proxy, | |
557 external_begin_frame_source.Pass()); | |
558 } else { | |
559 layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded( | |
560 this, | |
561 this, | |
562 shared_bitmap_manager, | |
563 gpu_memory_buffer_manager, | |
564 settings, | |
565 main_thread_compositor_task_runner, | |
566 external_begin_frame_source.Pass()); | |
567 } | |
568 DCHECK(layer_tree_host_); | |
569 } | |
570 | |
571 void RenderWidgetCompositor::setSurfaceReady() { | 538 void RenderWidgetCompositor::setSurfaceReady() { |
572 // In tests without a RenderThreadImpl, don't set ready as this kicks | 539 layer_tree_host_->SetLayerTreeHostClientReady(); |
573 // off creating output surfaces that the test can't create. | |
574 if (RenderThreadImpl::current()) | |
575 layer_tree_host_->SetLayerTreeHostClientReady(); | |
576 } | 540 } |
577 | 541 |
578 void RenderWidgetCompositor::setRootLayer(const blink::WebLayer& layer) { | 542 void RenderWidgetCompositor::setRootLayer(const blink::WebLayer& layer) { |
579 layer_tree_host_->SetRootLayer( | 543 layer_tree_host_->SetRootLayer( |
580 static_cast<const cc_blink::WebLayerImpl*>(&layer)->layer()); | 544 static_cast<const cc_blink::WebLayerImpl*>(&layer)->layer()); |
581 } | 545 } |
582 | 546 |
583 void RenderWidgetCompositor::clearRootLayer() { | 547 void RenderWidgetCompositor::clearRootLayer() { |
584 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>()); | 548 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>()); |
585 } | 549 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 | 693 |
730 void RenderWidgetCompositor::compositeAndReadbackAsync( | 694 void RenderWidgetCompositor::compositeAndReadbackAsync( |
731 blink::WebCompositeAndReadbackAsyncCallback* callback) { | 695 blink::WebCompositeAndReadbackAsyncCallback* callback) { |
732 DCHECK(!temporary_copy_output_request_); | 696 DCHECK(!temporary_copy_output_request_); |
733 temporary_copy_output_request_ = | 697 temporary_copy_output_request_ = |
734 cc::CopyOutputRequest::CreateBitmapRequest( | 698 cc::CopyOutputRequest::CreateBitmapRequest( |
735 base::Bind(&CompositeAndReadbackAsyncCallback, callback)); | 699 base::Bind(&CompositeAndReadbackAsyncCallback, callback)); |
736 // Force a commit to happen. The temporary copy output request will | 700 // Force a commit to happen. The temporary copy output request will |
737 // be installed after layout which will happen as a part of the commit, when | 701 // be installed after layout which will happen as a part of the commit, when |
738 // there is guaranteed to be a root layer. | 702 // there is guaranteed to be a root layer. |
739 if (!threaded_ && | 703 bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); |
| 704 if (!threaded && |
740 !layer_tree_host_->settings().single_thread_proxy_scheduler) { | 705 !layer_tree_host_->settings().single_thread_proxy_scheduler) { |
741 layer_tree_host_->Composite(gfx::FrameTime::Now()); | 706 layer_tree_host_->Composite(gfx::FrameTime::Now()); |
742 } else { | 707 } else { |
743 layer_tree_host_->SetNeedsCommit(); | 708 layer_tree_host_->SetNeedsCommit(); |
744 } | 709 } |
745 } | 710 } |
746 | 711 |
747 void RenderWidgetCompositor::finishAllRendering() { | 712 void RenderWidgetCompositor::finishAllRendering() { |
748 layer_tree_host_->FinishAllRendering(); | 713 layer_tree_host_->FinishAllRendering(); |
749 } | 714 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 } | 763 } |
799 | 764 |
800 void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { | 765 void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { |
801 begin_main_frame_time_ = args.frame_time; | 766 begin_main_frame_time_ = args.frame_time; |
802 begin_main_frame_interval_ = args.interval; | 767 begin_main_frame_interval_ = args.interval; |
803 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); | 768 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); |
804 double deadline_sec = (args.deadline - base::TimeTicks()).InSecondsF(); | 769 double deadline_sec = (args.deadline - base::TimeTicks()).InSecondsF(); |
805 double interval_sec = args.interval.InSecondsF(); | 770 double interval_sec = args.interval.InSecondsF(); |
806 WebBeginFrameArgs web_begin_frame_args = | 771 WebBeginFrameArgs web_begin_frame_args = |
807 WebBeginFrameArgs(frame_time_sec, deadline_sec, interval_sec); | 772 WebBeginFrameArgs(frame_time_sec, deadline_sec, interval_sec); |
808 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | 773 compositor_deps_->GetRendererScheduler()->WillBeginFrame(args); |
809 if (render_thread) // Can be null in tests. | |
810 render_thread->renderer_scheduler()->WillBeginFrame(args); | |
811 widget_->webwidget()->beginFrame(web_begin_frame_args); | 774 widget_->webwidget()->beginFrame(web_begin_frame_args); |
812 } | 775 } |
813 | 776 |
814 void RenderWidgetCompositor::Layout() { | 777 void RenderWidgetCompositor::Layout() { |
815 widget_->webwidget()->layout(); | 778 widget_->webwidget()->layout(); |
816 | 779 |
817 if (temporary_copy_output_request_) { | 780 if (temporary_copy_output_request_) { |
818 DCHECK(layer_tree_host_->root_layer()); | 781 DCHECK(layer_tree_host_->root_layer()); |
819 layer_tree_host_->root_layer()->RequestCopyOfOutput( | 782 layer_tree_host_->root_layer()->RequestCopyOfOutput( |
820 temporary_copy_output_request_.Pass()); | 783 temporary_copy_output_request_.Pass()); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 // Convert to 32-bit microseconds first to avoid costly 64-bit division. | 857 // Convert to 32-bit microseconds first to avoid costly 64-bit division. |
895 int32 idle_time_in_us = idle_time.InMicroseconds(); | 858 int32 idle_time_in_us = idle_time.InMicroseconds(); |
896 int32 idle_time_in_ms = idle_time_in_us / 1000; | 859 int32 idle_time_in_ms = idle_time_in_us / 1000; |
897 if (idle_time_in_ms) | 860 if (idle_time_in_ms) |
898 blink::mainThreadIsolate()->IdleNotification(idle_time_in_ms); | 861 blink::mainThreadIsolate()->IdleNotification(idle_time_in_ms); |
899 } | 862 } |
900 } | 863 } |
901 | 864 |
902 widget_->DidCommitCompositorFrame(); | 865 widget_->DidCommitCompositorFrame(); |
903 widget_->didBecomeReadyForAdditionalInput(); | 866 widget_->didBecomeReadyForAdditionalInput(); |
904 RenderThreadImpl* render_thread = RenderThreadImpl::current(); | 867 compositor_deps_->GetRendererScheduler()->DidCommitFrameToCompositor(); |
905 if (render_thread) // Can be null in tests. | |
906 render_thread->renderer_scheduler()->DidCommitFrameToCompositor(); | |
907 } | 868 } |
908 | 869 |
909 void RenderWidgetCompositor::DidCommitAndDrawFrame() { | 870 void RenderWidgetCompositor::DidCommitAndDrawFrame() { |
910 widget_->didCommitAndDrawCompositorFrame(); | 871 widget_->didCommitAndDrawCompositorFrame(); |
911 } | 872 } |
912 | 873 |
913 void RenderWidgetCompositor::DidCompleteSwapBuffers() { | 874 void RenderWidgetCompositor::DidCompleteSwapBuffers() { |
914 widget_->didCompleteSwapBuffers(); | 875 widget_->didCompleteSwapBuffers(); |
915 if (!threaded_) | 876 bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); |
| 877 if (!threaded) |
916 widget_->OnSwapBuffersComplete(); | 878 widget_->OnSwapBuffersComplete(); |
917 } | 879 } |
918 | 880 |
919 void RenderWidgetCompositor::ScheduleAnimation() { | 881 void RenderWidgetCompositor::ScheduleAnimation() { |
920 widget_->scheduleAnimation(); | 882 widget_->scheduleAnimation(); |
921 } | 883 } |
922 | 884 |
923 void RenderWidgetCompositor::DidPostSwapBuffers() { | 885 void RenderWidgetCompositor::DidPostSwapBuffers() { |
924 widget_->OnSwapBuffersPosted(); | 886 widget_->OnSwapBuffersPosted(); |
925 } | 887 } |
926 | 888 |
927 void RenderWidgetCompositor::DidAbortSwapBuffers() { | 889 void RenderWidgetCompositor::DidAbortSwapBuffers() { |
928 widget_->OnSwapBuffersAborted(); | 890 widget_->OnSwapBuffersAborted(); |
929 } | 891 } |
930 | 892 |
931 void RenderWidgetCompositor::RateLimitSharedMainThreadContext() { | 893 void RenderWidgetCompositor::RateLimitSharedMainThreadContext() { |
932 cc::ContextProvider* provider = | 894 cc::ContextProvider* provider = |
933 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); | 895 compositor_deps_->GetSharedMainThreadContextProvider(); |
934 provider->ContextGL()->RateLimitOffscreenContextCHROMIUM(); | 896 provider->ContextGL()->RateLimitOffscreenContextCHROMIUM(); |
935 } | 897 } |
936 | 898 |
937 } // namespace content | 899 } // namespace content |
OLD | NEW |