| 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 |