summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
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(