| 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 #if defined(OS_ANDROID) |
| 11 #include "base/android/sys_utils.h" |
| 12 #endif |
| 13 |
| 10 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 11 #include "base/logging.h" | 15 #include "base/logging.h" |
| 12 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/synchronization/lock.h" | 17 #include "base/synchronization/lock.h" |
| 14 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 15 #include "cc/base/switches.h" | 19 #include "cc/base/switches.h" |
| 16 #include "cc/debug/layer_tree_debug_state.h" | 20 #include "cc/debug/layer_tree_debug_state.h" |
| 17 #include "cc/layers/layer.h" | 21 #include "cc/layers/layer.h" |
| 18 #include "cc/trees/layer_tree_host.h" | 22 #include "cc/trees/layer_tree_host.h" |
| 19 #include "content/common/gpu/client/context_provider_command_buffer.h" | 23 #include "content/common/gpu/client/context_provider_command_buffer.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 widget->UsingSynchronousRendererCompositor(); | 283 widget->UsingSynchronousRendererCompositor(); |
| 280 #elif !defined(OS_MACOSX) | 284 #elif !defined(OS_MACOSX) |
| 281 if (cmd->HasSwitch(switches::kEnableOverlayScrollbars)) { | 285 if (cmd->HasSwitch(switches::kEnableOverlayScrollbars)) { |
| 282 settings.use_linear_fade_scrollbar_animator = true; | 286 settings.use_linear_fade_scrollbar_animator = true; |
| 283 settings.solid_color_scrollbars = true; | 287 settings.solid_color_scrollbars = true; |
| 284 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128); | 288 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128); |
| 285 settings.solid_color_scrollbar_thickness_dip = 3; | 289 settings.solid_color_scrollbar_thickness_dip = 3; |
| 286 } | 290 } |
| 287 #endif | 291 #endif |
| 288 | 292 |
| 293 // If we raster too fast we become upload bound, and pending |
| 294 // uploads consume memory. For maximum upload throughput, we would |
| 295 // want to allow for upload_throughput * pipeline_time of pending |
| 296 // uploads, after which we are just wasting memory. Since we don't |
| 297 // know our upload throughput yet, this just caps our memory usage. |
| 298 #if defined(OS_ANDROID) |
| 299 size_t divider = 1; |
| 300 if (base::android::SysUtils::IsLowEndDevice()) |
| 301 divider = 3; |
| 302 |
| 303 // For reference Nexus10 can upload 1MB in about 2.5ms. |
| 304 const size_t kMaxBytesUploadedPerMs = (2 * 1024 * 1024) / (5 * divider); |
| 305 #else |
| 306 // For reference Chromebook Pixel can upload 1MB in about 0.5ms. |
| 307 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2; |
| 308 #endif |
| 309 |
| 310 // Assuming a two frame deep pipeline. |
| 311 const size_t kMsPerFrame = 16; |
| 312 settings.max_transfer_buffer_usage_bytes = |
| 313 2 * kMsPerFrame * kMaxBytesUploadedPerMs; |
| 314 compositor->SetMaxTransferBufferUsageBytes( |
| 315 settings.max_transfer_buffer_usage_bytes); |
| 316 |
| 289 if (!compositor->initialize(settings)) | 317 if (!compositor->initialize(settings)) |
| 290 return scoped_ptr<RenderWidgetCompositor>(); | 318 return scoped_ptr<RenderWidgetCompositor>(); |
| 291 | 319 |
| 292 return compositor.Pass(); | 320 return compositor.Pass(); |
| 293 } | 321 } |
| 294 | 322 |
| 295 RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget, | 323 RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget, |
| 296 bool threaded) | 324 bool threaded) |
| 297 : threaded_(threaded), | 325 : threaded_(threaded), |
| 298 suppress_schedule_composite_(false), | 326 suppress_schedule_composite_(false), |
| 299 widget_(widget) { | 327 widget_(widget), |
| 328 max_transfer_buffer_usage_bytes_(0) { |
| 300 } | 329 } |
| 301 | 330 |
| 302 RenderWidgetCompositor::~RenderWidgetCompositor() {} | 331 RenderWidgetCompositor::~RenderWidgetCompositor() {} |
| 303 | 332 |
| 304 const base::WeakPtr<cc::InputHandler>& | 333 const base::WeakPtr<cc::InputHandler>& |
| 305 RenderWidgetCompositor::GetInputHandler() { | 334 RenderWidgetCompositor::GetInputHandler() { |
| 306 return layer_tree_host_->GetInputHandler(); | 335 return layer_tree_host_->GetInputHandler(); |
| 307 } | 336 } |
| 308 | 337 |
| 309 void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) { | 338 void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) { |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 widget_->webwidget()->layout(); | 574 widget_->webwidget()->layout(); |
| 546 } | 575 } |
| 547 | 576 |
| 548 void RenderWidgetCompositor::ApplyScrollAndScale(gfx::Vector2d scroll_delta, | 577 void RenderWidgetCompositor::ApplyScrollAndScale(gfx::Vector2d scroll_delta, |
| 549 float page_scale) { | 578 float page_scale) { |
| 550 widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale); | 579 widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale); |
| 551 } | 580 } |
| 552 | 581 |
| 553 scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface( | 582 scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface( |
| 554 bool fallback) { | 583 bool fallback) { |
| 555 return widget_->CreateOutputSurface(fallback); | 584 return widget_->CreateOutputSurface(fallback, |
| 585 max_transfer_buffer_usage_bytes_); |
| 556 } | 586 } |
| 557 | 587 |
| 558 void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) { | 588 void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) { |
| 559 if (!success) | 589 if (!success) |
| 560 widget_->webwidget()->didExitCompositingMode(); | 590 widget_->webwidget()->didExitCompositingMode(); |
| 561 } | 591 } |
| 562 | 592 |
| 563 void RenderWidgetCompositor::WillCommit() { | 593 void RenderWidgetCompositor::WillCommit() { |
| 564 widget_->InstrumentWillComposite(); | 594 widget_->InstrumentWillComposite(); |
| 565 } | 595 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 586 RenderWidgetCompositor::OffscreenContextProviderForMainThread() { | 616 RenderWidgetCompositor::OffscreenContextProviderForMainThread() { |
| 587 return RenderThreadImpl::current()->OffscreenContextProviderForMainThread(); | 617 return RenderThreadImpl::current()->OffscreenContextProviderForMainThread(); |
| 588 } | 618 } |
| 589 | 619 |
| 590 scoped_refptr<cc::ContextProvider> | 620 scoped_refptr<cc::ContextProvider> |
| 591 RenderWidgetCompositor::OffscreenContextProviderForCompositorThread() { | 621 RenderWidgetCompositor::OffscreenContextProviderForCompositorThread() { |
| 592 return RenderThreadImpl::current()-> | 622 return RenderThreadImpl::current()-> |
| 593 OffscreenContextProviderForCompositorThread(); | 623 OffscreenContextProviderForCompositorThread(); |
| 594 } | 624 } |
| 595 | 625 |
| 626 void RenderWidgetCompositor::SetMaxTransferBufferUsageBytes( |
| 627 size_t max_transfer_buffer_usage_bytes) { |
| 628 max_transfer_buffer_usage_bytes_ = max_transfer_buffer_usage_bytes; |
| 629 } |
| 630 |
| 596 } // namespace content | 631 } // namespace content |
| OLD | NEW |