Index: android_webview/browser/hardware_renderer.cc |
diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc |
index c48e4c73ae74fa537708a93ff94d3df538ecddef..f1528ec8f8c7c73af78c824e8932792ced24dde1 100644 |
--- a/android_webview/browser/hardware_renderer.cc |
+++ b/android_webview/browser/hardware_renderer.cc |
@@ -6,31 +6,21 @@ |
#include "android_webview/browser/aw_gl_surface.h" |
#include "android_webview/browser/browser_view_renderer_client.h" |
-#include "android_webview/browser/gl_view_renderer_manager.h" |
#include "android_webview/browser/scoped_app_gl_state_restore.h" |
#include "android_webview/public/browser/draw_gl.h" |
-#include "base/command_line.h" |
#include "base/debug/trace_event.h" |
#include "base/strings/string_number_conversions.h" |
+#include "content/public/browser/android/synchronous_compositor.h" |
#include "content/public/browser/browser_thread.h" |
-#include "content/public/common/content_switches.h" |
#include "gpu/command_buffer/service/shader_translator_cache.h" |
#include "ui/gfx/geometry/rect_conversions.h" |
#include "ui/gfx/geometry/rect_f.h" |
#include "ui/gfx/transform.h" |
-using content::BrowserThread; |
- |
namespace android_webview { |
namespace { |
-// Used to calculate memory and resource allocation. Determined experimentally. |
-const size_t g_memory_multiplier = 10; |
-const size_t g_num_gralloc_limit = 150; |
-const size_t kBytesPerPixel = 4; |
-const size_t kMemoryAllocationStep = 5 * 1024 * 1024; |
- |
base::LazyInstance<scoped_refptr<internal::DeferredGpuCommandService> > |
g_service = LAZY_INSTANCE_INITIALIZER; |
@@ -39,7 +29,7 @@ base::LazyInstance<scoped_refptr<internal::DeferredGpuCommandService> > |
HardwareRenderer::HardwareRenderer(SharedRendererState* state) |
: shared_renderer_state_(state), |
last_egl_context_(eglGetCurrentContext()), |
- manager_key_(GLViewRendererManager::GetInstance()->PushBack( |
+ renderer_manager_key_(GLViewRendererManager::GetInstance()->PushBack( |
shared_renderer_state_)) { |
DCHECK(last_egl_context_); |
if (!g_service.Get()) { |
@@ -59,8 +49,8 @@ HardwareRenderer::HardwareRenderer(SharedRendererState* state) |
} |
HardwareRenderer::~HardwareRenderer() { |
- GLViewRendererManager* mru = GLViewRendererManager::GetInstance(); |
- mru->Remove(manager_key_); |
+ GLViewRendererManager* render_manager = GLViewRendererManager::GetInstance(); |
+ render_manager->Remove(renderer_manager_key_); |
ScopedAppGLStateRestore state_restore( |
ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); |
@@ -72,7 +62,7 @@ HardwareRenderer::~HardwareRenderer() { |
bool HardwareRenderer::DrawGL(AwDrawGLInfo* draw_info, DrawGLResult* result) { |
TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); |
- GLViewRendererManager::GetInstance()->DidDrawGL(manager_key_); |
+ GLViewRendererManager::GetInstance()->DidDrawGL(renderer_manager_key_); |
// We need to watch if the current Android context has changed and enforce |
// a clean-up in the compositor. |
@@ -94,18 +84,7 @@ bool HardwareRenderer::DrawGL(AwDrawGLInfo* draw_info, DrawGLResult* result) { |
// Should only need to access SharedRendererState in kModeDraw and kModeSync. |
const DrawGLInput input = shared_renderer_state_->GetDrawGLInput(); |
- |
- // Update memory budget. This will no-op in compositor if the policy has not |
- // changed since last draw. |
- content::SynchronousCompositorMemoryPolicy policy; |
- policy.bytes_limit = g_memory_multiplier * kBytesPerPixel * |
- input.global_visible_rect.width() * |
- input.global_visible_rect.height(); |
- // Round up to a multiple of kMemoryAllocationStep. |
- policy.bytes_limit = |
- (policy.bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; |
- policy.num_resources_limit = g_num_gralloc_limit; |
- SetMemoryPolicy(policy); |
+ SetCompositorMemoryPolicy(); |
gl_surface_->SetBackingFrameBufferObject( |
state_restore.framebuffer_binding_ext()); |
@@ -142,68 +121,14 @@ bool HardwareRenderer::DrawGL(AwDrawGLInfo* draw_info, DrawGLResult* result) { |
return did_draw; |
} |
-bool HardwareRenderer::TrimMemory(int level, bool visible) { |
- // Constants from Android ComponentCallbacks2. |
- enum { |
- TRIM_MEMORY_RUNNING_LOW = 10, |
- TRIM_MEMORY_UI_HIDDEN = 20, |
- TRIM_MEMORY_BACKGROUND = 40, |
- }; |
- |
- // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because |
- // it does not indicate memory pressure, but merely that the app is |
- // backgrounded. |
- if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN) |
- return false; |
- |
- // Do not release resources on view we expect to get DrawGL soon. |
- if (level < TRIM_MEMORY_BACKGROUND && visible) |
- return false; |
- |
- if (!eglGetCurrentContext()) { |
- NOTREACHED(); |
- return false; |
+void HardwareRenderer::SetCompositorMemoryPolicy() { |
+ if (shared_renderer_state_->IsMemoryPolicyDirty()) { |
+ content::SynchronousCompositorMemoryPolicy policy = |
+ shared_renderer_state_->GetMemoryPolicy(); |
+ // Memory policy is set by BrowserViewRenderer on UI thread. |
+ shared_renderer_state_->GetCompositor()->SetMemoryPolicy(policy); |
+ shared_renderer_state_->SetMemoryPolicyDirty(false); |
} |
- |
- DCHECK_EQ(last_egl_context_, eglGetCurrentContext()); |
- |
- // Just set the memory limit to 0 and drop all tiles. This will be reset to |
- // normal levels in the next DrawGL call. |
- content::SynchronousCompositorMemoryPolicy policy; |
- policy.bytes_limit = 0; |
- policy.num_resources_limit = 0; |
- if (memory_policy_ == policy) |
- return false; |
- |
- TRACE_EVENT0("android_webview", "HardwareRenderer::TrimMemory"); |
- ScopedAppGLStateRestore state_restore( |
- ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); |
- internal::ScopedAllowGL allow_gl; |
- |
- SetMemoryPolicy(policy); |
- return true; |
-} |
- |
-void HardwareRenderer::SetMemoryPolicy( |
- content::SynchronousCompositorMemoryPolicy& new_policy) { |
- if (memory_policy_ == new_policy) |
- return; |
- |
- memory_policy_ = new_policy; |
- shared_renderer_state_->GetCompositor()-> |
- SetMemoryPolicy(memory_policy_); |
-} |
- |
-// static |
-void HardwareRenderer::CalculateTileMemoryPolicy() { |
- CommandLine* cl = CommandLine::ForCurrentProcess(); |
- |
- const char kDefaultTileSize[] = "384"; |
- if (!cl->HasSwitch(switches::kDefaultTileWidth)) |
- cl->AppendSwitchASCII(switches::kDefaultTileWidth, kDefaultTileSize); |
- |
- if (!cl->HasSwitch(switches::kDefaultTileHeight)) |
- cl->AppendSwitchASCII(switches::kDefaultTileHeight, kDefaultTileSize); |
} |
namespace internal { |