diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-01 01:55:58 +0000 |
---|---|---|
committer | Bo Liu <boliu@google.com> | 2014-08-13 10:59:29 -0700 |
commit | a4bd9487fb05775f6976ac25074b8b8b7f123581 (patch) | |
tree | 4b60e8ed5308d4726c75168d3204967011c298fc /android_webview | |
parent | 589aedca54a6100888f96bc611a09f74d7ab3b6e (diff) | |
download | chromium_org-a4bd9487fb05775f6976ac25074b8b8b7f123581.tar.gz |
Cherry-pick: aw: Fallback to idle upload when zero copy disabled
Clean cherry-pick of chromium crrev.com/r286935
BUG: 16550863
Change-Id: Ifaee48ed7a5fa80c001781106a02e31aae0d324f
Diffstat (limited to 'android_webview')
-rw-r--r-- | android_webview/browser/browser_view_renderer.cc | 12 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer.h | 2 | ||||
-rw-r--r-- | android_webview/browser/global_tile_manager.cc | 29 | ||||
-rw-r--r-- | android_webview/browser/global_tile_manager.h | 4 | ||||
-rw-r--r-- | android_webview/lib/main/aw_main_delegate.cc | 12 |
5 files changed, 42 insertions, 17 deletions
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc index 8f5b3bc163..f08a564600 100644 --- a/android_webview/browser/browser_view_renderer.cc +++ b/android_webview/browser/browser_view_renderer.cc @@ -73,7 +73,17 @@ class TracedValue : public base::debug::ConvertableToTraceFormat { } // namespace // static -void BrowserViewRenderer::CalculateTileMemoryPolicy() { +void BrowserViewRenderer::CalculateTileMemoryPolicy(bool use_zero_copy) { + if (!use_zero_copy) { + // Use chrome's default tile size, which varies from 256 to 512. + // Be conservative here and use the smallest tile size possible. + g_tile_area = 256 * 256; + + // Also use a high tile limit since there are no file descriptor issues. + GlobalTileManager::GetInstance()->SetTileLimit(1000); + return; + } + CommandLine* cl = CommandLine::ForCurrentProcess(); const char kDefaultTileSize[] = "384"; diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h index 810fb81eb5..76a8806ed5 100644 --- a/android_webview/browser/browser_view_renderer.h +++ b/android_webview/browser/browser_view_renderer.h @@ -60,7 +60,7 @@ class BrowserViewRendererJavaHelper { class BrowserViewRenderer : public content::SynchronousCompositorClient, public GlobalTileManagerClient { public: - static void CalculateTileMemoryPolicy(); + static void CalculateTileMemoryPolicy(bool use_zero_copy); BrowserViewRenderer( BrowserViewRendererClient* client, diff --git a/android_webview/browser/global_tile_manager.cc b/android_webview/browser/global_tile_manager.cc index efc30395ad..a2fe4b6cd5 100644 --- a/android_webview/browser/global_tile_manager.cc +++ b/android_webview/browser/global_tile_manager.cc @@ -9,8 +9,10 @@ namespace android_webview { namespace { + base::LazyInstance<GlobalTileManager>::Leaky g_tile_manager = LAZY_INSTANCE_INITIALIZER; + // The soft limit of the number of file descriptors per process is 1024 on // Android and gralloc buffers may not be the only thing that uses file // descriptors. For each tile, there is a gralloc buffer backing it, which @@ -58,6 +60,10 @@ size_t GlobalTileManager::Evict(size_t desired_num_tiles, Key key) { return total_evicted_tiles; } +void GlobalTileManager::SetTileLimit(size_t num_tiles_limit) { + num_tiles_limit_ = num_tiles_limit; +} + void GlobalTileManager::RequestTiles(size_t new_num_of_tiles, Key key) { DCHECK(IsConsistent()); DCHECK(sequence_checker_.CalledOnValidSequencedThread()); @@ -65,30 +71,31 @@ void GlobalTileManager::RequestTiles(size_t new_num_of_tiles, Key key) { size_t num_of_active_views = std::distance(mru_list_.begin(), key) + 1; size_t tiles_per_view_limit; if (num_of_active_views == 0) - tiles_per_view_limit = kNumTilesLimit; + tiles_per_view_limit = num_tiles_limit_; else - tiles_per_view_limit = kNumTilesLimit / num_of_active_views; + tiles_per_view_limit = num_tiles_limit_ / num_of_active_views; new_num_of_tiles = std::min(new_num_of_tiles, tiles_per_view_limit); size_t new_total_allocated_tiles = total_allocated_tiles_ - old_num_of_tiles + new_num_of_tiles; // Has enough tiles to satisfy the request. - if (new_total_allocated_tiles <= kNumTilesLimit) { + if (new_total_allocated_tiles <= num_tiles_limit_) { total_allocated_tiles_ = new_total_allocated_tiles; (*key)->SetNumTiles(new_num_of_tiles, false); return; } // Does not have enough tiles. Now evict other clients' tiles. - size_t tiles_left = kNumTilesLimit - total_allocated_tiles_; + size_t tiles_left = num_tiles_limit_ - total_allocated_tiles_; - size_t evicted_tiles = Evict(new_total_allocated_tiles - kNumTilesLimit, key); - if (evicted_tiles >= new_total_allocated_tiles - kNumTilesLimit) { + size_t evicted_tiles = + Evict(new_total_allocated_tiles - num_tiles_limit_, key); + if (evicted_tiles >= new_total_allocated_tiles - num_tiles_limit_) { new_total_allocated_tiles -= evicted_tiles; total_allocated_tiles_ = new_total_allocated_tiles; (*key)->SetNumTiles(new_num_of_tiles, false); return; } else { - total_allocated_tiles_ = kNumTilesLimit; + total_allocated_tiles_ = num_tiles_limit_; (*key)->SetNumTiles(tiles_left + old_num_of_tiles + evicted_tiles, false); return; } @@ -112,8 +119,8 @@ void GlobalTileManager::DidUse(Key key) { mru_list_.splice(mru_list_.begin(), mru_list_, key); } -GlobalTileManager::GlobalTileManager() { - total_allocated_tiles_ = 0; +GlobalTileManager::GlobalTileManager() + : num_tiles_limit_(kNumTilesLimit), total_allocated_tiles_(0) { } GlobalTileManager::~GlobalTileManager() { @@ -126,8 +133,8 @@ bool GlobalTileManager::IsConsistent() const { total_tiles += (*it)->GetNumTiles(); } - bool is_consistent = - (total_tiles <= kNumTilesLimit && total_tiles == total_allocated_tiles_); + bool is_consistent = (total_tiles <= num_tiles_limit_ && + total_tiles == total_allocated_tiles_); return is_consistent; } diff --git a/android_webview/browser/global_tile_manager.h b/android_webview/browser/global_tile_manager.h index ca422308c1..3473c20ead 100644 --- a/android_webview/browser/global_tile_manager.h +++ b/android_webview/browser/global_tile_manager.h @@ -29,6 +29,8 @@ class GlobalTileManager { typedef ListType::iterator Key; static GlobalTileManager* GetInstance(); + void SetTileLimit(size_t num_tiles_limit); + // Requests the |num_of_tiles| from the available global pool. Calls // GlobalTileManagerClient.SetNumTiles after the manager determines how many // tiles are available for the client. If the number of tiles left is not @@ -61,6 +63,8 @@ class GlobalTileManager { // total_allocated_tiles_. bool IsConsistent() const; + size_t num_tiles_limit_; + size_t total_allocated_tiles_; ListType mru_list_; base::SequenceChecker sequence_checker_; diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc index c6b089bed2..303d808e47 100644 --- a/android_webview/lib/main/aw_main_delegate.cc +++ b/android_webview/lib/main/aw_main_delegate.cc @@ -49,13 +49,17 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) { content::SetContentClient(&content_client_); CommandLine* cl = CommandLine::ForCurrentProcess(); - if (gpu_memory_buffer_factory_.get()->Initialize()) { + bool zero_copy_disabled_by_switch = cl->HasSwitch(switches::kDisableZeroCopy); + bool use_zero_copy = !zero_copy_disabled_by_switch && + gpu_memory_buffer_factory_.get()->Initialize(); + + if (use_zero_copy) { cl->AppendSwitch(switches::kEnableZeroCopy); - } else { - LOG(WARNING) << "Failed to initialize GpuMemoryBuffer factory"; + } else if (!zero_copy_disabled_by_switch) { + cl->AppendSwitch(switches::kDisableZeroCopy); } - BrowserViewRenderer::CalculateTileMemoryPolicy(); + BrowserViewRenderer::CalculateTileMemoryPolicy(use_zero_copy); cl->AppendSwitch(switches::kEnableBeginFrameScheduling); cl->AppendSwitch(switches::kEnableImplSidePainting); |