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

Unified Diff: android_webview/browser/hardware_renderer.cc

Issue 226363004: Global GPU memory manager for android webview (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Type casts and private methods in BVR. Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « android_webview/browser/hardware_renderer.h ('k') | android_webview/browser/shared_renderer_state.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « android_webview/browser/hardware_renderer.h ('k') | android_webview/browser/shared_renderer_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698