summaryrefslogtreecommitdiffstats
path: root/content/browser/android
diff options
context:
space:
mode:
authorboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-10 22:44:43 +0000
committerboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-10 22:44:43 +0000
commit0552c8ef896c4356f4db85618972dedccd6ad53b (patch)
treed00992f235af190d2bdb9de0a5f72fbfcc1c9917 /content/browser/android
parent1e7258d60d7ebdb30a27552d900e885922119a2c (diff)
downloadchromium_src-0552c8ef896c4356f4db85618972dedccd6ad53b.zip
chromium_src-0552c8ef896c4356f4db85618972dedccd6ad53b.tar.gz
chromium_src-0552c8ef896c4356f4db85618972dedccd6ad53b.tar.bz2
[Android WebView] First cut memory management
Based on simple algorithm of visible rect x constant. Completely disregards the preferred allocation from based on content of the page. Constants extermined experimentally using current android nexus devices. BUG=286026 Review URL: https://chromiumcodereview.appspot.com/23572023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222372 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/android')
-rw-r--r--content/browser/android/in_process/synchronous_compositor_impl.cc8
-rw-r--r--content/browser/android/in_process/synchronous_compositor_impl.h2
-rw-r--r--content/browser/android/in_process/synchronous_compositor_output_surface.cc32
-rw-r--r--content/browser/android/in_process/synchronous_compositor_output_surface.h6
4 files changed, 36 insertions, 12 deletions
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc
index 3f71321..9f1b607 100644
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc
+++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
@@ -331,6 +331,14 @@ bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
return output_surface_->DemandDrawSw(canvas);
}
+void SynchronousCompositorImpl::SetMemoryPolicy(
+ const SynchronousCompositorMemoryPolicy& policy) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(output_surface_);
+
+ return output_surface_->SetMemoryPolicy(policy);
+}
+
void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset() {
if (input_handler_)
input_handler_->OnRootLayerDelegatedScrollOffsetChanged();
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.h b/content/browser/android/in_process/synchronous_compositor_impl.h
index 854c5eb..3189dcc 100644
--- a/content/browser/android/in_process/synchronous_compositor_impl.h
+++ b/content/browser/android/in_process/synchronous_compositor_impl.h
@@ -58,6 +58,8 @@ class SynchronousCompositorImpl
gfx::Rect clip,
bool stencil_enabled) OVERRIDE;
virtual bool DemandDrawSw(SkCanvas* canvas) OVERRIDE;
+ virtual void SetMemoryPolicy(
+ const SynchronousCompositorMemoryPolicy& policy) OVERRIDE;
virtual void DidChangeRootLayerScrollOffset() OVERRIDE;
// SynchronousCompositorOutputSurfaceDelegate
diff --git a/content/browser/android/in_process/synchronous_compositor_output_surface.cc b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
index 2760a62..4137734 100644
--- a/content/browser/android/in_process/synchronous_compositor_output_surface.cc
+++ b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
@@ -9,7 +9,6 @@
#include "cc/output/begin_frame_args.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/context_provider.h"
-#include "cc/output/managed_memory_policy.h"
#include "cc/output/output_surface_client.h"
#include "cc/output/software_output_device.h"
#include "content/browser/android/in_process/synchronous_compositor_impl.h"
@@ -108,7 +107,9 @@ SynchronousCompositorOutputSurface::SynchronousCompositorOutputSurface(
needs_begin_frame_(false),
invoking_composite_(false),
did_swap_buffer_(false),
- current_sw_canvas_(NULL) {
+ current_sw_canvas_(NULL),
+ memory_policy_(0),
+ output_surface_client_(NULL) {
capabilities_.deferred_gl_initialization = true;
capabilities_.draw_and_swap_full_viewport_every_frame = true;
capabilities_.adjust_deadline_for_parent = false;
@@ -136,21 +137,16 @@ bool SynchronousCompositorOutputSurface::BindToClient(
DCHECK(CalledOnValidThread());
if (!cc::OutputSurface::BindToClient(surface_client))
return false;
- surface_client->SetTreeActivationCallback(
+
+ output_surface_client_ = surface_client;
+ output_surface_client_->SetTreeActivationCallback(
base::Bind(&DidActivatePendingTree, routing_id_));
+ output_surface_client_->SetMemoryPolicy(memory_policy_);
+
SynchronousCompositorOutputSurfaceDelegate* delegate = GetDelegate();
if (delegate)
delegate->DidBindOutputSurface(this);
- const int bytes_limit = 64 * 1024 * 1024;
- const int num_resources_limit = 100;
- surface_client->SetMemoryPolicy(
- cc::ManagedMemoryPolicy(bytes_limit,
- cc::ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING,
- 0,
- cc::ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING,
- num_resources_limit));
-
return true;
}
@@ -171,6 +167,7 @@ void SynchronousCompositorOutputSurface::SetNeedsBeginFrame(
void SynchronousCompositorOutputSurface::SwapBuffers(
cc::CompositorFrame* frame) {
+ DCHECK(CalledOnValidThread());
if (!ForcedDrawToSoftwareDevice()) {
DCHECK(context_provider_);
context_provider_->Context3d()->shallowFlushCHROMIUM();
@@ -206,6 +203,7 @@ bool SynchronousCompositorOutputSurface::InitializeHwDraw(
}
void SynchronousCompositorOutputSurface::ReleaseHwDraw() {
+ DCHECK(CalledOnValidThread());
cc::OutputSurface::ReleaseGL();
}
@@ -287,6 +285,16 @@ void SynchronousCompositorOutputSurface::PostCheckForRetroactiveBeginFrame() {
// intentionally no-op here.
}
+void SynchronousCompositorOutputSurface::SetMemoryPolicy(
+ const SynchronousCompositorMemoryPolicy& policy) {
+ DCHECK(CalledOnValidThread());
+ memory_policy_.bytes_limit_when_visible = policy.bytes_limit;
+ memory_policy_.num_resources_limit = policy.num_resources_limit;
+
+ if (output_surface_client_)
+ output_surface_client_->SetMemoryPolicy(memory_policy_);
+}
+
// Not using base::NonThreadSafe as we want to enforce a more exacting threading
// requirement: SynchronousCompositorOutputSurface() must only be used on the UI
// thread.
diff --git a/content/browser/android/in_process/synchronous_compositor_output_surface.h b/content/browser/android/in_process/synchronous_compositor_output_surface.h
index d11651d..b9b4d67 100644
--- a/content/browser/android/in_process/synchronous_compositor_output_surface.h
+++ b/content/browser/android/in_process/synchronous_compositor_output_surface.h
@@ -9,6 +9,7 @@
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
+#include "cc/output/managed_memory_policy.h"
#include "cc/output/output_surface.h"
#include "content/public/browser/android/synchronous_compositor.h"
#include "ui/gfx/transform.h"
@@ -72,6 +73,7 @@ class SynchronousCompositorOutputSurface
gfx::Rect clip,
bool stencil_enabled);
bool DemandDrawSw(SkCanvas* canvas);
+ void SetMemoryPolicy(const SynchronousCompositorMemoryPolicy& policy);
private:
class SoftwareDevice;
@@ -99,6 +101,10 @@ class SynchronousCompositorOutputSurface
// Only valid (non-NULL) during a DemandDrawSw() call.
SkCanvas* current_sw_canvas_;
+ cc::ManagedMemoryPolicy memory_policy_;
+
+ cc::OutputSurfaceClient* output_surface_client_;
+
DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorOutputSurface);
};