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_); | |
danakj
2013/08/23 23:25:39
You could just pass the value from the layer_tree_
kaanb
2013/08/24 00:25:01
Apparently there are cases where layer_tree_host_
danakj
2013/08/24 00:25:52
What, this is called from LayertreeHost. Can you g
| |
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 |