summaryrefslogtreecommitdiff
path: root/android_webview
diff options
context:
space:
mode:
authorboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-01 01:55:58 +0000
committerBo Liu <boliu@google.com>2014-08-13 10:59:29 -0700
commita4bd9487fb05775f6976ac25074b8b8b7f123581 (patch)
tree4b60e8ed5308d4726c75168d3204967011c298fc /android_webview
parent589aedca54a6100888f96bc611a09f74d7ab3b6e (diff)
downloadchromium_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.cc12
-rw-r--r--android_webview/browser/browser_view_renderer.h2
-rw-r--r--android_webview/browser/global_tile_manager.cc29
-rw-r--r--android_webview/browser/global_tile_manager.h4
-rw-r--r--android_webview/lib/main/aw_main_delegate.cc12
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);