summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorenne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 20:58:26 +0000
committerenne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 20:58:26 +0000
commita23451e3979d1f5c68d5bf87ec30ae983327620d (patch)
tree33a621eab76db67cb4bdfcc5dc606d4ad954f4bd /cc
parent38b00508da0f7144f0edcc32c5ff6bf3e06ed715 (diff)
downloadchromium_src-a23451e3979d1f5c68d5bf87ec30ae983327620d.zip
chromium_src-a23451e3979d1f5c68d5bf87ec30ae983327620d.tar.gz
chromium_src-a23451e3979d1f5c68d5bf87ec30ae983327620d.tar.bz2
cc: Call ManageTiles explicitly
ManageTiles used to be scheduled as a post task to run "whenever". This was fine back when activation checks used the exact state of the tree. However, now that activation has been moved to tile manager, ManageTiles is now responsible for keeping the activation check up to date and needs to be called immediately after commit to makes sure that new work has been marked as required. Before this patch, ManageTiles would generally run after commits and after drawing due to the nature of scheduling. This patch keeps that behavior by doing a ManageTiles after a commit and after drawing. R=reveman@chromium.org BUG=243531 Review URL: https://chromiumcodereview.appspot.com/15855008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204923 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r--cc/layers/picture_layer_impl.cc1
-rw-r--r--cc/resources/tile_manager.cc6
-rw-r--r--cc/resources/tile_manager.h13
-rw-r--r--cc/test/fake_layer_tree_host_impl_client.h1
-rw-r--r--cc/test/fake_tile_manager_client.h1
-rw-r--r--cc/trees/layer_tree_host_impl.cc19
-rw-r--r--cc/trees/layer_tree_host_impl.h6
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc1
-rw-r--r--cc/trees/layer_tree_impl.cc2
-rw-r--r--cc/trees/single_thread_proxy.cc4
-rw-r--r--cc/trees/single_thread_proxy.h1
-rw-r--r--cc/trees/thread_proxy.cc21
-rw-r--r--cc/trees/thread_proxy.h2
13 files changed, 25 insertions, 53 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index c130588..bc57bd7 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -362,6 +362,7 @@ void PictureLayerImpl::UpdateTilePriorities() {
void PictureLayerImpl::DidBecomeActive() {
LayerImpl::DidBecomeActive();
tilings_->DidBecomeActive();
+ layer_tree_impl()->WillModifyTilePriorities();
}
void PictureLayerImpl::DidBeginTracing() {
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index c5c07a5..2f81bec 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -126,7 +126,6 @@ TileManager::TileManager(
: client_(client),
resource_pool_(ResourcePool::Create(resource_provider)),
raster_worker_pool_(raster_worker_pool.Pass()),
- manage_tiles_pending_(false),
ever_exceeded_memory_budget_(false),
rendering_stats_instrumentation_(rendering_stats_instrumentation),
use_color_estimator_(use_color_estimator),
@@ -151,14 +150,12 @@ void TileManager::SetGlobalState(
resource_pool_->SetMaxMemoryUsageBytes(
global_state_.memory_limit_in_bytes,
global_state_.unused_memory_limit_in_bytes);
- ScheduleManageTiles();
}
void TileManager::RegisterTile(Tile* tile) {
DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end());
DCHECK(!tile->required_for_activation());
tiles_.push_back(tile);
- ScheduleManageTiles();
}
void TileManager::UnregisterTile(Tile* tile) {
@@ -292,9 +289,6 @@ void TileManager::SortTiles() {
void TileManager::ManageTiles() {
TRACE_EVENT0("cc", "TileManager::ManageTiles");
-
- manage_tiles_pending_ = false;
-
AssignBinsToTiles();
SortTiles();
AssignGpuMemoryToTiles();
diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h
index 8623820..03cc8308 100644
--- a/cc/resources/tile_manager.h
+++ b/cc/resources/tile_manager.h
@@ -37,7 +37,6 @@ enum TileRasterMode {
class CC_EXPORT TileManagerClient {
public:
- virtual void ScheduleManageTiles() = 0;
virtual void DidInitializeVisibleTile() = 0;
virtual bool
ShouldForceTileUploadsRequiredForActivationToComplete() const = 0;
@@ -102,10 +101,6 @@ class CC_EXPORT TileManager {
return memory_stats_from_last_assign_;
}
- void WillModifyTilePriorities() {
- ScheduleManageTiles();
- }
-
bool AreTilesRequiredForActivationReady() const {
return tiles_that_need_to_be_initialized_for_activation_.empty();
}
@@ -145,12 +140,6 @@ class CC_EXPORT TileManager {
void FreeResourceForTile(Tile* tile, TileRasterMode mode);
void FreeResourcesForTile(Tile* tile);
void FreeUnusedResourcesForTile(Tile* tile);
- void ScheduleManageTiles() {
- if (manage_tiles_pending_)
- return;
- client_->ScheduleManageTiles();
- manage_tiles_pending_ = true;
- }
RasterWorkerPool::Task CreateImageDecodeTask(
Tile* tile, skia::LazyPixelRef* pixel_ref);
void OnImageDecodeTaskCompleted(
@@ -202,8 +191,6 @@ class CC_EXPORT TileManager {
TileManagerClient* client_;
scoped_ptr<ResourcePool> resource_pool_;
scoped_ptr<RasterWorkerPool> raster_worker_pool_;
- bool manage_tiles_pending_;
-
GlobalStateThatImpactsTilePriority global_state_;
typedef std::vector<Tile*> TileVector;
diff --git a/cc/test/fake_layer_tree_host_impl_client.h b/cc/test/fake_layer_tree_host_impl_client.h
index 184bacc..dad4014 100644
--- a/cc/test/fake_layer_tree_host_impl_client.h
+++ b/cc/test/fake_layer_tree_host_impl_client.h
@@ -28,7 +28,6 @@ class FakeLayerTreeHostImplClient : public LayerTreeHostImplClient {
virtual void SetNeedsRedrawRectOnImplThread(gfx::Rect damage_rect) OVERRIDE {}
virtual void DidInitializeVisibleTileOnImplThread() OVERRIDE {}
virtual void SetNeedsCommitOnImplThread() OVERRIDE {}
- virtual void SetNeedsManageTilesOnImplThread() OVERRIDE {}
virtual void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events,
base::Time wall_clock_time) OVERRIDE {}
diff --git a/cc/test/fake_tile_manager_client.h b/cc/test/fake_tile_manager_client.h
index faa444b..a031d8f 100644
--- a/cc/test/fake_tile_manager_client.h
+++ b/cc/test/fake_tile_manager_client.h
@@ -14,7 +14,6 @@ class FakeTileManagerClient : public TileManagerClient {
virtual ~FakeTileManagerClient() {}
// TileManagerClient implementation.
- virtual void ScheduleManageTiles() OVERRIDE {}
virtual void DidInitializeVisibleTile() OVERRIDE {}
virtual bool ShouldForceTileUploadsRequiredForActivationToComplete() const
OVERRIDE;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index d384ea7..ccd69d2 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -163,6 +163,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(
did_lock_scrolling_layer_(false),
should_bubble_scrolls_(false),
wheel_scrolling_(false),
+ manage_tiles_needed_(false),
root_layer_scroll_offset_delegate_(NULL),
settings_(settings),
visible_(true),
@@ -238,6 +239,8 @@ void LayerTreeHostImpl::CommitComplete() {
if (settings_.impl_side_painting) {
pending_tree_->set_needs_update_draw_properties();
pending_tree_->UpdateDrawProperties();
+ // Start working on newly created tiles immediately if needed.
+ ManageTiles();
} else {
active_tree_->set_needs_update_draw_properties();
}
@@ -292,7 +295,11 @@ void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time,
}
void LayerTreeHostImpl::ManageTiles() {
- DCHECK(tile_manager_);
+ if (!tile_manager_)
+ return;
+ if (!manage_tiles_needed_)
+ return;
+ manage_tiles_needed_ = false;
tile_manager_->ManageTiles();
size_t memory_required_bytes;
@@ -970,17 +977,13 @@ void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy(
policy.priority_cutoff_when_visible :
policy.priority_cutoff_when_not_visible);
tile_manager_->SetGlobalState(new_state);
+ manage_tiles_needed_ = true;
}
bool LayerTreeHostImpl::HasImplThread() const {
return proxy_->HasImplThread();
}
-void LayerTreeHostImpl::ScheduleManageTiles() {
- if (client_)
- client_->SetNeedsManageTilesOnImplThread();
-}
-
void LayerTreeHostImpl::DidInitializeVisibleTile() {
// TODO(reveman): Determine tiles that changed and only damage
// what's necessary.
@@ -1338,6 +1341,9 @@ bool LayerTreeHostImpl::ActivatePendingTreeIfNeeded() {
// TODO(enne): This needs to be moved somewhere else (post-animate?)
pending_tree_->UpdateDrawProperties();
+ // Note: This will likely cause ManageTiles to be needed. However,
+ // it is only out of date as far as the last commit or the last draw.
+ // For performance reasons, don't call ManageTiles again here.
TRACE_EVENT_ASYNC_STEP1(
"cc",
@@ -2231,6 +2237,7 @@ void LayerTreeHostImpl::SetTreePriority(TreePriority priority) {
new_state.tree_priority = priority;
tile_manager_->SetGlobalState(new_state);
+ manage_tiles_needed_ = true;
}
void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() {
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index fee3f46..9c5ae5b 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -64,7 +64,6 @@ class LayerTreeHostImplClient {
virtual void SetNeedsRedrawRectOnImplThread(gfx::Rect damage_rect) = 0;
virtual void DidInitializeVisibleTileOnImplThread() = 0;
virtual void SetNeedsCommitOnImplThread() = 0;
- virtual void SetNeedsManageTilesOnImplThread() = 0;
virtual void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events,
base::Time wall_clock_time) = 0;
@@ -197,7 +196,6 @@ class CC_EXPORT LayerTreeHostImpl
virtual bool AllowPartialSwap() const OVERRIDE;
// TileManagerClient implementation.
- virtual void ScheduleManageTiles() OVERRIDE;
virtual void DidInitializeVisibleTile() OVERRIDE;
virtual bool ShouldForceTileUploadsRequiredForActivationToComplete() const
OVERRIDE;
@@ -236,6 +234,7 @@ class CC_EXPORT LayerTreeHostImpl
virtual bool SwapBuffers(const FrameData& frame);
void SetNeedsBeginFrame(bool enable);
+ void SetNeedsManageTiles() { manage_tiles_needed_ = true; }
void Readback(void* pixels, gfx::Rect rect_in_device_viewport);
@@ -466,6 +465,9 @@ class CC_EXPORT LayerTreeHostImpl
bool did_lock_scrolling_layer_;
bool should_bubble_scrolls_;
bool wheel_scrolling_;
+
+ bool manage_tiles_needed_;
+
// The optional delegate for the root layer scroll offset.
LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate_;
LayerTreeSettings settings_;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 9bb674a..2518fa3 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -120,7 +120,6 @@ class LayerTreeHostImplTest : public testing::Test,
virtual void SetNeedsCommitOnImplThread() OVERRIDE {
did_request_commit_ = true;
}
- virtual void SetNeedsManageTilesOnImplThread() OVERRIDE {}
virtual void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events,
base::Time wall_clock_time) OVERRIDE {}
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index d36e841..432af98 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -564,7 +564,7 @@ void LayerTreeImpl::ClearLatencyInfo() {
}
void LayerTreeImpl::WillModifyTilePriorities() {
- layer_tree_host_impl_->tile_manager()->WillModifyTilePriorities();
+ layer_tree_host_impl_->SetNeedsManageTiles();
}
} // namespace cc
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index e8d3e76..4bafe1c 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -282,10 +282,6 @@ void SingleThreadProxy::SetNeedsCommitOnImplThread() {
layer_tree_host_->ScheduleComposite();
}
-void SingleThreadProxy::SetNeedsManageTilesOnImplThread() {
- layer_tree_host_->ScheduleComposite();
-}
-
void SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events,
base::Time wall_clock_time) {
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index 6a963e80..0c3946b 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -61,7 +61,6 @@ class SingleThreadProxy : public Proxy, LayerTreeHostImplClient {
virtual void SetNeedsRedrawRectOnImplThread(gfx::Rect dirty_rect) OVERRIDE;
virtual void DidInitializeVisibleTileOnImplThread() OVERRIDE;
virtual void SetNeedsCommitOnImplThread() OVERRIDE;
- virtual void SetNeedsManageTilesOnImplThread() OVERRIDE;
virtual void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events,
base::Time wall_clock_time) OVERRIDE;
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
index d1c4471..5f92c61 100644
--- a/cc/trees/thread_proxy.cc
+++ b/cc/trees/thread_proxy.cc
@@ -384,21 +384,6 @@ void ThreadProxy::SetNeedsCommitOnImplThread() {
scheduler_on_impl_thread_->SetNeedsCommit();
}
-void ThreadProxy::SetNeedsManageTilesOnImplThread() {
- if (manage_tiles_pending_)
- return;
- Proxy::ImplThread()->PostTask(
- base::Bind(&ThreadProxy::ManageTilesOnImplThread, impl_thread_weak_ptr_));
- manage_tiles_pending_ = true;
-}
-
-void ThreadProxy::ManageTilesOnImplThread() {
- // TODO(nduca): If needed, move this into CCSchedulerStateMachine.
- manage_tiles_pending_ = false;
- if (layer_tree_host_impl_)
- layer_tree_host_impl_->ManageTiles();
-}
-
void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events,
base::Time wall_clock_time) {
@@ -986,6 +971,12 @@ ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) {
if (draw_frame)
CheckOutputSurfaceStatusOnImplThread();
+ // Update the tile state after drawing. This prevents manage tiles from
+ // being in the critical path for getting things on screen, but still
+ // makes sure that tile state is updated on a semi-regular basis.
+ if (layer_tree_host_impl_->settings().impl_side_painting)
+ layer_tree_host_impl_->ManageTiles();
+
return result;
}
diff --git a/cc/trees/thread_proxy.h b/cc/trees/thread_proxy.h
index 8d62dd1..3cc905d 100644
--- a/cc/trees/thread_proxy.h
+++ b/cc/trees/thread_proxy.h
@@ -76,7 +76,6 @@ class ThreadProxy : public Proxy,
virtual void SetNeedsRedrawRectOnImplThread(gfx::Rect dirty_rect) OVERRIDE;
virtual void DidInitializeVisibleTileOnImplThread() OVERRIDE;
virtual void SetNeedsCommitOnImplThread() OVERRIDE;
- virtual void SetNeedsManageTilesOnImplThread() OVERRIDE;
virtual void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> queue,
base::Time wall_clock_time) OVERRIDE;
@@ -176,7 +175,6 @@ class ThreadProxy : public Proxy,
RendererCapabilities* capabilities);
void FinishGLOnImplThread(CompletionEvent* completion);
void LayerTreeHostClosedOnImplThread(CompletionEvent* completion);
- void ManageTilesOnImplThread();
void AcquireLayerTexturesForMainThreadOnImplThread(
CompletionEvent* completion);
ScheduledActionDrawAndSwapResult ScheduledActionDrawAndSwapInternal(