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 |