Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: content/renderer/gpu/render_widget_compositor.cc

Issue 22900018: cc: Set the mapped memory reclaim limit for the renderer compositor on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: IWYU Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698