Chromium Code Reviews| Index: cc/tile_manager.cc |
| diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc |
| index 9935de5d2e84e1a130b685ac8ef0864213a46ae0..00d1268ad7dbbdaf5210f472dae78a08efc297aa 100644 |
| --- a/cc/tile_manager.cc |
| +++ b/cc/tile_manager.cc |
| @@ -94,19 +94,26 @@ scoped_ptr<base::Value> TileManagerBinAsValue(TileManagerBin bin) { |
| } |
| } |
| -ManagedTileState::ManagedTileState() |
| - : can_use_gpu_memory(false), |
| +ManagedTileState::ManagedTileState(TileManager* tile_manager) |
| + : tile_manager(tile_manager), |
| + can_use_gpu_memory(false), |
| can_be_freed(true), |
| resource_is_being_initialized(false), |
| contents_swizzled(false), |
| need_to_gather_pixel_refs(true), |
| gpu_memmgr_stats_bin(NEVER_BIN), |
| - raster_state(IDLE_STATE) { |
| + raster_state(IDLE_STATE), |
| + bytes_consumed_if_allocated(0), |
|
nduca
2013/02/05 06:50:01
I'm worried about the duplication of state here. T
reveman
2013/02/05 18:04:51
With this patch ManagedTileState can now outlive a
|
| + visible_high_resolution(false), |
| + contents_scale(1), |
| + format(GL_RGBA) { |
| for (int i = 0; i < NUM_TREES; ++i) |
| tree_bin[i] = NEVER_BIN; |
| + tile_manager->RegisterManagedTile(this); |
| } |
| ManagedTileState::~ManagedTileState() { |
| + tile_manager->UnregisterManagedTile(this); |
| DCHECK(!resource); |
| DCHECK(!resource_is_being_initialized); |
| } |
| @@ -118,7 +125,8 @@ TileManager::TileManager( |
| bool record_rendering_stats) |
| : client_(client), |
| resource_pool_(ResourcePool::Create(resource_provider)), |
| - raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, record_rendering_stats)), |
| + raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, |
| + record_rendering_stats)), |
| manage_tiles_pending_(false), |
| manage_tiles_call_count_(0), |
| bytes_pending_set_pixels_(0), |
| @@ -133,16 +141,18 @@ TileManager::TileManager( |
| } |
| TileManager::~TileManager() { |
| + DCHECK_EQ(tiles_.size(), 0); |
| // Reset global state and manage. This should cause |
| // our memory usage to drop to zero. |
| global_state_ = GlobalStateThatImpactsTilePriority(); |
| - AssignGpuMemoryToTiles(); |
| + ManageTiles(); |
| // This should finish all pending tasks and release any uninitialized |
| // resources. |
| raster_worker_pool_.reset(); |
| CheckForCompletedTileUploads(); |
| - DCHECK(tiles_with_pending_set_pixels_.size() == 0); |
| - DCHECK(tiles_.size() == 0); |
| + DCHECK_EQ(tiles_that_need_to_be_rasterized_.size(), 0); |
| + DCHECK_EQ(tiles_with_pending_set_pixels_.size(), 0); |
| + DCHECK_EQ(managed_tiles_.size(), 0); |
| } |
| void TileManager::SetGlobalState( |
| @@ -153,62 +163,48 @@ void TileManager::SetGlobalState( |
| } |
| void TileManager::RegisterTile(Tile* tile) { |
| - tiles_.push_back(tile); |
| - |
| - const ManagedTileState& mts = tile->managed_state(); |
| - for (int i = 0; i < NUM_TREES; ++i) |
| - ++raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; |
| - |
| + DCHECK(tiles_.find(tile) == tiles_.end()); |
| + scoped_refptr<ManagedTileState> mts(new ManagedTileState(this)); |
| + tile->set_managed_state(mts); |
| + tiles_.insert(tile); |
| ScheduleManageTiles(); |
| } |
| void TileManager::UnregisterTile(Tile* tile) { |
| - for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| - it != tiles_with_image_decoding_tasks_.end(); it++) { |
| - if (*it == tile) { |
| - tiles_with_image_decoding_tasks_.erase(it); |
| - break; |
| - } |
| - } |
| - for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); |
| - it != tiles_that_need_to_be_rasterized_.end(); it++) { |
| - if (*it == tile) { |
| - tiles_that_need_to_be_rasterized_.erase(it); |
| - break; |
| - } |
| - } |
| - for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); it++) { |
| - if (*it == tile) { |
| - const ManagedTileState& mts = tile->managed_state(); |
| - for (int i = 0; i < NUM_TREES; ++i) |
| - --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; |
| - FreeResourcesForTile(tile); |
| - tiles_.erase(it); |
| - return; |
| - } |
| - } |
| - DCHECK(false) << "Could not find tile version."; |
| + DCHECK(tiles_.find(tile) != tiles_.end()); |
| + tiles_.erase(tile); |
| + ScheduleManageTiles(); |
| +} |
| + |
| +void TileManager::RegisterManagedTile(ManagedTileState* mts) { |
| + for (int i = 0; i < NUM_TREES; ++i) |
| + ++raster_state_count_[mts->raster_state][i][mts->tree_bin[i]]; |
| +} |
| + |
| +void TileManager::UnregisterManagedTile(ManagedTileState* mts) { |
| + FreeResourcesForTile(mts); |
| + for (int i = 0; i < NUM_TREES; ++i) |
| + --raster_state_count_[mts->raster_state][i][mts->tree_bin[i]]; |
| } |
| class BinComparator { |
| public: |
| - bool operator() (const Tile* a, const Tile* b) const { |
| - const ManagedTileState& ams = a->managed_state(); |
| - const ManagedTileState& bms = b->managed_state(); |
| - if (ams.bin[HIGH_PRIORITY_BIN] != bms.bin[HIGH_PRIORITY_BIN]) |
| - return ams.bin[HIGH_PRIORITY_BIN] < bms.bin[HIGH_PRIORITY_BIN]; |
| + bool operator() (const ManagedTileState* a, |
| + const ManagedTileState* b) const { |
| + if (a->bin[HIGH_PRIORITY_BIN] != b->bin[HIGH_PRIORITY_BIN]) |
| + return a->bin[HIGH_PRIORITY_BIN] < b->bin[HIGH_PRIORITY_BIN]; |
| - if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN]) |
| - return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN]; |
| + if (a->bin[LOW_PRIORITY_BIN] != b->bin[LOW_PRIORITY_BIN]) |
| + return a->bin[LOW_PRIORITY_BIN] < b->bin[LOW_PRIORITY_BIN]; |
| - if (ams.resolution != bms.resolution) |
| - return ams.resolution < bms.resolution; |
| + if (a->resolution != b->resolution) |
| + return a->resolution < b->resolution; |
| - if (ams.time_to_needed_in_seconds != bms.time_to_needed_in_seconds) |
| - return ams.time_to_needed_in_seconds < bms.time_to_needed_in_seconds; |
| + if (a->time_to_needed_in_seconds != b->time_to_needed_in_seconds) |
| + return a->time_to_needed_in_seconds < b->time_to_needed_in_seconds; |
| - gfx::Rect a_rect = a->content_rect(); |
| - gfx::Rect b_rect = b->content_rect(); |
| + gfx::Rect a_rect = a->content_rect; |
| + gfx::Rect b_rect = b->content_rect; |
| if (a_rect.y() != b_rect.y()) |
| return a_rect.y() < b_rect.y(); |
| return a_rect.x() < b_rect.x(); |
| @@ -219,7 +215,7 @@ void TileManager::SortTiles() { |
| TRACE_EVENT0("cc", "TileManager::SortTiles"); |
| // Sort by bin, resolution and time until needed. |
| - std::sort(tiles_.begin(), tiles_.end(), BinComparator()); |
| + std::sort(managed_tiles_.begin(), managed_tiles_.end(), BinComparator()); |
| } |
| void TileManager::ManageTiles() { |
| @@ -230,16 +226,25 @@ void TileManager::ManageTiles() { |
| const TreePriority tree_priority = global_state_.tree_priority; |
| TRACE_COUNTER_ID1("cc", "TileCount", this, tiles_.size()); |
| + // Determine tiles that should be managed by rebuilding managed_tiles_ |
| + // vector. |
| + managed_tiles_.erase(managed_tiles_.begin(), managed_tiles_.end()); |
| + |
| // For each tree, bin into different categories of tiles. |
| - for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| + for (TileSet::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| Tile* tile = *it; |
| - ManagedTileState& mts = tile->managed_state(); |
| + |
| + TilePriority combined_priority = tile->combined_priority(); |
| + if (!combined_priority.is_live) { |
| + if (tile->managed_state()->can_be_freed) |
| + FreeResourcesForTile(tile->managed_state()); |
| + continue; |
| + } |
| TilePriority prio[NUM_BIN_PRIORITIES]; |
| switch (tree_priority) { |
| case SAME_PRIORITY_FOR_BOTH_TREES: |
| - prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = |
| - tile->combined_priority(); |
| + prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = combined_priority; |
| break; |
| case SMOOTHNESS_TAKES_PRIORITY: |
| prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); |
| @@ -251,21 +256,35 @@ void TileManager::ManageTiles() { |
| break; |
| } |
| - mts.resolution = prio[HIGH_PRIORITY_BIN].resolution; |
| - mts.time_to_needed_in_seconds = |
| + ManagedTileState* mts = tile->managed_state(); |
| + mts->resolution = prio[HIGH_PRIORITY_BIN].resolution; |
| + mts->time_to_needed_in_seconds = |
| prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds; |
| - mts.bin[HIGH_PRIORITY_BIN] = BinFromTilePriority(prio[HIGH_PRIORITY_BIN]); |
| - mts.bin[LOW_PRIORITY_BIN] = BinFromTilePriority(prio[LOW_PRIORITY_BIN]); |
| - mts.gpu_memmgr_stats_bin = BinFromTilePriority(tile->combined_priority()); |
| - |
| - DidTileBinChange(tile, |
| + mts->bin[HIGH_PRIORITY_BIN] = BinFromTilePriority(prio[HIGH_PRIORITY_BIN]); |
| + mts->bin[LOW_PRIORITY_BIN] = BinFromTilePriority(prio[LOW_PRIORITY_BIN]); |
| + mts->gpu_memmgr_stats_bin = BinFromTilePriority(combined_priority); |
| + mts->bytes_consumed_if_allocated = tile->bytes_consumed_if_allocated(); |
| + mts->visible_high_resolution = |
| + tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && |
| + tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION; |
| + mts->picture_pile = tile->picture_pile(); |
| + mts->content_rect = tile->content_rect_; |
| + mts->contents_scale = tile->contents_scale_; |
| + mts->tile_size = tile->tile_size_.size(); |
| + mts->format = tile->format_; |
| + |
| + DidTileBinChange(mts, |
| BinFromTilePriority(tile->priority(ACTIVE_TREE)), |
| ACTIVE_TREE); |
| - DidTileBinChange(tile, |
| + DidTileBinChange(mts, |
| BinFromTilePriority(tile->priority(PENDING_TREE)), |
| PENDING_TREE); |
| + |
| + managed_tiles_.push_back(mts); |
| } |
| + TRACE_COUNTER_ID1("cc", "ManagedTileCount", this, managed_tiles_.size()); |
| + |
| // Memory limit policy works by mapping some bin states to the NEVER bin. |
| TileManagerBin bin_map[NUM_BINS]; |
| if (global_state_.memory_limit_policy == ALLOW_NOTHING) { |
| @@ -289,14 +308,13 @@ void TileManager::ManageTiles() { |
| bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN; |
| bin_map[NEVER_BIN] = NEVER_BIN; |
| } |
| - for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| - Tile* tile = *it; |
| - ManagedTileState& mts = tile->managed_state(); |
| + for (ManagedTileVector::iterator it = managed_tiles_.begin(); |
| + it != managed_tiles_.end(); ++it) { |
| + ManagedTileState* mts = *it; |
| for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) |
| - mts.bin[i] = bin_map[mts.bin[i]]; |
| - |
| - DidTileBinChange(tile, bin_map[mts.tree_bin[ACTIVE_TREE]], ACTIVE_TREE); |
| - DidTileBinChange(tile, bin_map[mts.tree_bin[PENDING_TREE]], PENDING_TREE); |
| + mts->bin[i] = bin_map[mts->bin[i]]; |
| + DidTileBinChange(mts, bin_map[mts->tree_bin[ACTIVE_TREE]], ACTIVE_TREE); |
| + DidTileBinChange(mts, bin_map[mts->tree_bin[PENDING_TREE]], PENDING_TREE); |
| } |
| SortTiles(); |
| @@ -312,27 +330,26 @@ void TileManager::ManageTiles() { |
| void TileManager::CheckForCompletedTileUploads() { |
| while (!tiles_with_pending_set_pixels_.empty()) { |
| - Tile* tile = tiles_with_pending_set_pixels_.front(); |
| - DCHECK(tile->managed_state().resource); |
| + ManagedTileState* mts = tiles_with_pending_set_pixels_.front(); |
| + DCHECK(mts->resource); |
| // Set pixel tasks complete in the order they are posted. |
| if (!resource_pool_->resource_provider()->didSetPixelsComplete( |
| - tile->managed_state().resource->id())) { |
| + mts->resource->id())) { |
| break; |
| } |
| - if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && |
| - tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) |
| + if (mts->visible_high_resolution) |
| client_->DidUploadVisibleHighResolutionTile(); |
| // It's now safe to release the pixel buffer. |
| resource_pool_->resource_provider()->releasePixelBuffer( |
| - tile->managed_state().resource->id()); |
| + mts->resource->id()); |
| - DidFinishTileInitialization(tile); |
| + DidFinishTileInitialization(mts); |
| - bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated(); |
| - DidTileRasterStateChange(tile, IDLE_STATE); |
| + bytes_pending_set_pixels_ -= mts->bytes_consumed_if_allocated; |
| + DidTileRasterStateChange(mts, IDLE_STATE); |
| tiles_with_pending_set_pixels_.pop(); |
| } |
| @@ -340,48 +357,47 @@ void TileManager::CheckForCompletedTileUploads() { |
| } |
| void TileManager::GetMemoryStats( |
| - size_t* memoryRequiredBytes, |
| - size_t* memoryNiceToHaveBytes, |
| - size_t* memoryUsedBytes) const { |
| - *memoryRequiredBytes = 0; |
| - *memoryNiceToHaveBytes = 0; |
| - *memoryUsedBytes = 0; |
| - for(size_t i = 0; i < tiles_.size(); i++) { |
| - const Tile* tile = tiles_[i]; |
| - const ManagedTileState& mts = tile->managed_state(); |
| - size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
| - if (mts.gpu_memmgr_stats_bin == NOW_BIN) |
| - *memoryRequiredBytes += tile_bytes; |
| - if (mts.gpu_memmgr_stats_bin != NEVER_BIN) |
| - *memoryNiceToHaveBytes += tile_bytes; |
| - if (mts.can_use_gpu_memory) |
| - *memoryUsedBytes += tile_bytes; |
| + size_t* memory_required_bytes, |
| + size_t* memory_nice_to_have_bytes, |
| + size_t* memory_used_bytes) const { |
| + *memory_required_bytes = 0; |
| + *memory_nice_to_have_bytes = 0; |
| + *memory_used_bytes = 0; |
| + for (ManagedTileVector::const_iterator it = managed_tiles_.begin(); |
| + it != managed_tiles_.end(); ++it) { |
| + const ManagedTileState* mts = *it; |
| + size_t tile_bytes = mts->bytes_consumed_if_allocated; |
| + if (mts->gpu_memmgr_stats_bin == NOW_BIN) |
| + *memory_required_bytes += tile_bytes; |
| + if (mts->gpu_memmgr_stats_bin != NEVER_BIN) |
| + *memory_nice_to_have_bytes += tile_bytes; |
| + if (mts->can_use_gpu_memory) |
| + *memory_used_bytes += tile_bytes; |
| } |
| } |
| scoped_ptr<base::Value> TileManager::AsValue() const { |
| - scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| - state->SetInteger("tile_count", tiles_.size()); |
| - |
| - state->Set("global_state", global_state_.AsValue().release()); |
| - |
| - state->Set("memory_requirements", GetMemoryRequirementsAsValue().release()); |
| - return state.PassAs<base::Value>(); |
| + scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| + state->SetInteger("tile_count", tiles_.size()); |
| + state->SetInteger("managed_tile_count", managed_tiles_.size()); |
| + state->Set("global_state", global_state_.AsValue().release()); |
| + state->Set("memory_requirements", GetMemoryRequirementsAsValue().release()); |
| + return state.PassAs<base::Value>(); |
| } |
| scoped_ptr<base::Value> TileManager::GetMemoryRequirementsAsValue() const { |
| - scoped_ptr<base::DictionaryValue> requirements( |
| - new base::DictionaryValue()); |
| - |
| - size_t memoryRequiredBytes; |
| - size_t memoryNiceToHaveBytes; |
| - size_t memoryUsedBytes; |
| - GetMemoryStats(&memoryRequiredBytes, |
| - &memoryNiceToHaveBytes, |
| - &memoryUsedBytes); |
| - requirements->SetInteger("memory_required_bytes", memoryRequiredBytes); |
| - requirements->SetInteger("memory_nice_to_have_bytes", memoryNiceToHaveBytes); |
| - requirements->SetInteger("memory_used_bytes", memoryUsedBytes); |
| + scoped_ptr<base::DictionaryValue> requirements(new base::DictionaryValue()); |
| + |
| + size_t memory_required_bytes; |
| + size_t memory_nice_to_have_bytes; |
| + size_t memory_used_bytes; |
| + GetMemoryStats(&memory_required_bytes, |
| + &memory_nice_to_have_bytes, |
| + &memory_used_bytes); |
| + requirements->SetInteger("memory_required_bytes", memory_required_bytes); |
| + requirements->SetInteger("memory_nice_to_have_bytes", |
| + memory_nice_to_have_bytes); |
| + requirements->SetInteger("memory_used_bytes", memory_used_bytes); |
| return requirements.PassAs<base::Value>(); |
| } |
| @@ -424,10 +440,11 @@ void TileManager::AssignGpuMemoryToTiles() { |
| TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| // Some memory cannot be released. Figure out which. |
| size_t unreleasable_bytes = 0; |
| - for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| - Tile* tile = *it; |
| - if (!tile->managed_state().can_be_freed) |
| - unreleasable_bytes += tile->bytes_consumed_if_allocated(); |
| + for (ManagedTileVector::iterator it = managed_tiles_.begin(); |
| + it != managed_tiles_.end(); ++it) { |
| + ManagedTileState* mts = *it; |
| + if (!mts->can_be_freed) |
| + unreleasable_bytes += mts->bytes_consumed_if_allocated; |
| } |
| // Now give memory out to the tiles until we're out, and build |
| @@ -446,45 +463,46 @@ void TileManager::AssignGpuMemoryToTiles() { |
| // currently waiting for raster to idle state. |
| // Call DidTileRasterStateChange() for each of these tiles to |
| // have this state change take effect. |
| - for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| - Tile* tile = *it; |
| - if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) |
| - DidTileRasterStateChange(tile, IDLE_STATE); |
| + for (ManagedTileVector::iterator it = managed_tiles_.begin(); |
| + it != managed_tiles_.end(); ++it) { |
| + ManagedTileState* mts = *it; |
| + if (mts->raster_state == WAITING_FOR_RASTER_STATE) |
| + DidTileRasterStateChange(mts, IDLE_STATE); |
| } |
| - size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_bytes; |
| + size_t bytes_allocatable = global_state_.memory_limit_in_bytes - |
| + unreleasable_bytes; |
| size_t bytes_that_exceeded_memory_budget = 0; |
| size_t bytes_left = bytes_allocatable; |
| - for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| - Tile* tile = *it; |
| - size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
| - ManagedTileState& managed_tile_state = tile->managed_state(); |
| - if (!managed_tile_state.can_be_freed) |
| + for (ManagedTileVector::iterator it = managed_tiles_.begin(); |
| + it != managed_tiles_.end(); ++it) { |
| + ManagedTileState* mts = *it; |
| + if (!mts->can_be_freed) |
| continue; |
| - if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
| - managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
| - managed_tile_state.can_use_gpu_memory = false; |
| - FreeResourcesForTile(tile); |
| + if (mts->bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
| + mts->bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
| + mts->can_use_gpu_memory = false; |
| + FreeResourcesForTile(mts); |
| continue; |
| } |
| + size_t tile_bytes = mts->bytes_consumed_if_allocated; |
| if (tile_bytes > bytes_left) { |
| - managed_tile_state.can_use_gpu_memory = false; |
| + mts->can_use_gpu_memory = false; |
| bytes_that_exceeded_memory_budget += tile_bytes; |
| - FreeResourcesForTile(tile); |
| + FreeResourcesForTile(mts); |
| continue; |
| } |
| bytes_left -= tile_bytes; |
| - managed_tile_state.can_use_gpu_memory = true; |
| - if (!managed_tile_state.resource && |
| - !managed_tile_state.resource_is_being_initialized) { |
| - tiles_that_need_to_be_rasterized_.push_back(tile); |
| - DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); |
| + mts->can_use_gpu_memory = true; |
| + if (!mts->resource && !mts->resource_is_being_initialized) { |
| + tiles_that_need_to_be_rasterized_.push_back(mts); |
| + DidTileRasterStateChange(mts, WAITING_FOR_RASTER_STATE); |
| } |
| } |
| ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; |
| if (ever_exceeded_memory_budget_) { |
| - TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| + TRACE_COUNTER_ID2("cc", "OverMemoryBudget", this, |
| "budget", global_state_.memory_limit_in_bytes, |
| "over", bytes_that_exceeded_memory_budget); |
| } |
| @@ -494,25 +512,24 @@ void TileManager::AssignGpuMemoryToTiles() { |
| memory_stats_from_last_assign_.bytes_over = |
| bytes_that_exceeded_memory_budget; |
| - // Reverse two tiles_that_need_* vectors such that pop_back gets |
| - // the highest priority tile. |
| + // Reverse the tiles_that_need_to_be_rasterized_ vector such that pop_back |
| + // gets the highest priority tile. |
| std::reverse( |
| tiles_that_need_to_be_rasterized_.begin(), |
| tiles_that_need_to_be_rasterized_.end()); |
| } |
| -void TileManager::FreeResourcesForTile(Tile* tile) { |
| - ManagedTileState& managed_tile_state = tile->managed_state(); |
| - DCHECK(managed_tile_state.can_be_freed); |
| - if (managed_tile_state.resource) |
| - resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); |
| +void TileManager::FreeResourcesForTile(ManagedTileState* mts) { |
| + DCHECK(mts->can_be_freed); |
| + if (mts->resource) |
| + resource_pool_->ReleaseResource(mts->resource.Pass()); |
| } |
| -bool TileManager::CanDispatchRasterTask(Tile* tile) { |
| +bool TileManager::CanDispatchRasterTask(ManagedTileState* mts) { |
| if (raster_worker_pool_->IsBusy()) |
| return false; |
| size_t new_bytes_pending = bytes_pending_set_pixels_; |
| - new_bytes_pending += tile->bytes_consumed_if_allocated(); |
| + new_bytes_pending += mts->bytes_consumed_if_allocated; |
| return new_bytes_pending <= kMaxPendingUploadBytes; |
| } |
| @@ -522,12 +539,12 @@ void TileManager::DispatchMoreTasks() { |
| // in the need_to_be_rasterized queue. |
| for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| it != tiles_with_image_decoding_tasks_.end(); ) { |
| - DispatchImageDecodeTasksForTile(*it); |
| - ManagedTileState& managed_state = (*it)->managed_state(); |
| - if (managed_state.pending_pixel_refs.empty()) { |
| - if (!CanDispatchRasterTask(*it)) |
| + ManagedTileState* mts = *it; |
| + DispatchImageDecodeTasksForTile(mts); |
| + if (mts->pending_pixel_refs.empty()) { |
| + if (!CanDispatchRasterTask(mts)) |
| return; |
| - DispatchOneRasterTask(*it); |
| + DispatchOneRasterTask(mts); |
| tiles_with_image_decoding_tasks_.erase(it++); |
| } else { |
| ++it; |
| @@ -537,32 +554,30 @@ void TileManager::DispatchMoreTasks() { |
| // Process all tiles in the need_to_be_rasterized queue. If a tile has |
| // image decoding tasks, put it to the back of the image decoding list. |
| while (!tiles_that_need_to_be_rasterized_.empty()) { |
| - Tile* tile = tiles_that_need_to_be_rasterized_.back(); |
| - DispatchImageDecodeTasksForTile(tile); |
| - ManagedTileState& managed_state = tile->managed_state(); |
| - if (!managed_state.pending_pixel_refs.empty()) { |
| - tiles_with_image_decoding_tasks_.push_back(tile); |
| + ManagedTileState* mts = tiles_that_need_to_be_rasterized_.back(); |
| + DispatchImageDecodeTasksForTile(mts); |
| + if (!mts->pending_pixel_refs.empty()) { |
| + tiles_with_image_decoding_tasks_.push_back(mts); |
| } else { |
| - if (!CanDispatchRasterTask(tile)) |
| + if (!CanDispatchRasterTask(mts)) |
| return; |
| - DispatchOneRasterTask(tile); |
| + DispatchOneRasterTask(mts); |
| } |
| tiles_that_need_to_be_rasterized_.pop_back(); |
| } |
| } |
| -void TileManager::GatherPixelRefsForTile(Tile* tile) { |
| +void TileManager::GatherPixelRefsForTile(ManagedTileState* mts) { |
| TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForTile"); |
| - ManagedTileState& managed_state = tile->managed_state(); |
| - if (managed_state.need_to_gather_pixel_refs) { |
| + if (mts->need_to_gather_pixel_refs) { |
| base::TimeTicks gather_begin_time; |
| if (record_rendering_stats_) |
| gather_begin_time = base::TimeTicks::Now(); |
| - tile->picture_pile()->GatherPixelRefs( |
| - tile->content_rect_, |
| - tile->contents_scale_, |
| - managed_state.pending_pixel_refs); |
| - managed_state.need_to_gather_pixel_refs = false; |
| + mts->picture_pile->GatherPixelRefs( |
| + mts->content_rect, |
| + mts->contents_scale, |
| + mts->pending_pixel_refs); |
| + mts->need_to_gather_pixel_refs = false; |
| if (record_rendering_stats_) { |
| rendering_stats_.totalImageGatheringCount++; |
| rendering_stats_.totalImageGatheringTime += |
| @@ -571,10 +586,9 @@ void TileManager::GatherPixelRefsForTile(Tile* tile) { |
| } |
| } |
| -void TileManager::DispatchImageDecodeTasksForTile(Tile* tile) { |
| - GatherPixelRefsForTile(tile); |
| - std::list<skia::LazyPixelRef*>& pending_pixel_refs = |
| - tile->managed_state().pending_pixel_refs; |
| +void TileManager::DispatchImageDecodeTasksForTile(ManagedTileState* mts) { |
| + GatherPixelRefsForTile(mts); |
| + std::list<skia::LazyPixelRef*>& pending_pixel_refs = mts->pending_pixel_refs; |
| std::list<skia::LazyPixelRef*>::iterator it = pending_pixel_refs.begin(); |
| while (it != pending_pixel_refs.end()) { |
| if (pending_decode_tasks_.end() != pending_decode_tasks_.find( |
| @@ -589,14 +603,14 @@ void TileManager::DispatchImageDecodeTasksForTile(Tile* tile) { |
| } else { |
| if (raster_worker_pool_->IsBusy()) |
| return; |
| - DispatchOneImageDecodeTask(tile, *it); |
| + DispatchOneImageDecodeTask(mts, *it); |
| ++it; |
| } |
| } |
| } |
| void TileManager::DispatchOneImageDecodeTask( |
| - scoped_refptr<Tile> tile, skia::LazyPixelRef* pixel_ref) { |
| + scoped_refptr<ManagedTileState> mts, skia::LazyPixelRef* pixel_ref) { |
| TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodeTask"); |
| uint32_t pixel_ref_id = pixel_ref->getGenerationID(); |
| DCHECK(pending_decode_tasks_.end() == |
| @@ -607,19 +621,18 @@ void TileManager::DispatchOneImageDecodeTask( |
| base::Bind(&TileManager::RunImageDecodeTask, pixel_ref), |
| base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
| base::Unretained(this), |
| - tile, |
| + mts, |
| pixel_ref_id)); |
| } |
| void TileManager::OnImageDecodeTaskCompleted( |
| - scoped_refptr<Tile> tile, uint32_t pixel_ref_id) { |
| + scoped_refptr<ManagedTileState> mts, uint32_t pixel_ref_id) { |
| TRACE_EVENT0("cc", "TileManager::OnImageDecodeTaskCompleted"); |
| pending_decode_tasks_.erase(pixel_ref_id); |
| for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| it != tiles_with_image_decoding_tasks_.end(); ++it) { |
| - std::list<skia::LazyPixelRef*>& pixel_refs = |
| - (*it)->managed_state().pending_pixel_refs; |
| + std::list<skia::LazyPixelRef*>& pixel_refs = (*it)->pending_pixel_refs; |
| for (std::list<skia::LazyPixelRef*>::iterator pixel_it = |
| pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { |
| if (pixel_ref_id == (*pixel_it)->getGenerationID()) { |
| @@ -632,37 +645,36 @@ void TileManager::OnImageDecodeTaskCompleted( |
| DispatchMoreTasks(); |
| } |
| -void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
| +void TileManager::DispatchOneRasterTask(scoped_refptr<ManagedTileState> mts) { |
| TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
| - ManagedTileState& managed_tile_state = tile->managed_state(); |
| - DCHECK(managed_tile_state.can_use_gpu_memory); |
| + DCHECK(mts->can_use_gpu_memory); |
| scoped_ptr<ResourcePool::Resource> resource = |
| - resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); |
| + resource_pool_->AcquireResource(mts->tile_size, mts->format); |
| resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); |
| - managed_tile_state.resource_is_being_initialized = true; |
| - managed_tile_state.can_be_freed = false; |
| + mts->resource_is_being_initialized = true; |
| + mts->can_be_freed = false; |
| - DidTileRasterStateChange(tile, RASTER_STATE); |
| + DidTileRasterStateChange(mts, RASTER_STATE); |
| ResourceProvider::ResourceId resource_id = resource->id(); |
| raster_worker_pool_->PostRasterTaskAndReply( |
| - tile->picture_pile(), |
| + mts->picture_pile, |
| base::Bind(&TileManager::RunRasterTask, |
| resource_pool_->resource_provider()->mapPixelBuffer( |
| resource_id), |
| - tile->content_rect_, |
| - tile->contents_scale()), |
| + mts->content_rect, |
| + mts->contents_scale), |
| base::Bind(&TileManager::OnRasterTaskCompleted, |
| base::Unretained(this), |
| - tile, |
| + mts, |
| base::Passed(&resource), |
| manage_tiles_call_count_)); |
| } |
| void TileManager::OnRasterTaskCompleted( |
| - scoped_refptr<Tile> tile, |
| + scoped_refptr<ManagedTileState> mts, |
| scoped_ptr<ResourcePool::Resource> resource, |
| int manage_tiles_call_count_when_dispatched) { |
| TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); |
| @@ -670,8 +682,7 @@ void TileManager::OnRasterTaskCompleted( |
| // Release raster resources. |
| resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); |
| - ManagedTileState& managed_tile_state = tile->managed_state(); |
| - managed_tile_state.can_be_freed = true; |
| + mts->can_be_freed = true; |
| // Tile can be freed after the completion of the raster task. Call |
| // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| @@ -683,69 +694,66 @@ void TileManager::OnRasterTaskCompleted( |
| AssignGpuMemoryToTiles(); |
| // Finish resource initialization if |can_use_gpu_memory| is true. |
| - if (managed_tile_state.can_use_gpu_memory) { |
| + if (mts->can_use_gpu_memory) { |
| // The component order may be bgra if we're uploading bgra pixels to rgba |
| // texture. Mark contents as swizzled if image component order is |
| // different than texture format. |
| - managed_tile_state.contents_swizzled = |
| - !PlatformColor::sameComponentOrder(tile->format_); |
| + mts->contents_swizzled = !PlatformColor::sameComponentOrder(mts->format); |
| // Tile resources can't be freed until upload has completed. |
| - managed_tile_state.can_be_freed = false; |
| + mts->can_be_freed = false; |
| resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
| resource_pool_->resource_provider()->shallowFlushIfSupported(); |
| - managed_tile_state.resource = resource.Pass(); |
| + mts->resource = resource.Pass(); |
| - bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); |
| - DidTileRasterStateChange(tile, SET_PIXELS_STATE); |
| - tiles_with_pending_set_pixels_.push(tile); |
| + bytes_pending_set_pixels_ += mts->bytes_consumed_if_allocated; |
| + DidTileRasterStateChange(mts, SET_PIXELS_STATE); |
| + tiles_with_pending_set_pixels_.push(mts); |
| } else { |
| resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| resource_pool_->ReleaseResource(resource.Pass()); |
| - managed_tile_state.resource_is_being_initialized = false; |
| - DidTileRasterStateChange(tile, IDLE_STATE); |
| + mts->resource_is_being_initialized = false; |
| + DidTileRasterStateChange(mts, IDLE_STATE); |
| } |
| DispatchMoreTasks(); |
| } |
| -void TileManager::DidFinishTileInitialization(Tile* tile) { |
| - ManagedTileState& managed_tile_state = tile->managed_state(); |
| - DCHECK(managed_tile_state.resource); |
| - managed_tile_state.resource_is_being_initialized = false; |
| - managed_tile_state.can_be_freed = true; |
| +void TileManager::DidFinishTileInitialization(ManagedTileState* mts) { |
| + DCHECK(mts->resource); |
| + mts->resource_is_being_initialized = false; |
| + mts->can_be_freed = true; |
| } |
| -void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { |
| - ManagedTileState& mts = tile->managed_state(); |
| +void TileManager::DidTileRasterStateChange( |
| + ManagedTileState* mts, TileRasterState state) { |
| DCHECK_LT(state, NUM_STATES); |
| for (int i = 0; i < NUM_TREES; ++i) { |
| // Decrement count for current state. |
| - --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; |
| - DCHECK_GE(raster_state_count_[mts.raster_state][i][mts.tree_bin[i]], 0); |
| + --raster_state_count_[mts->raster_state][i][mts->tree_bin[i]]; |
| + DCHECK_GE(raster_state_count_[mts->raster_state][i][mts->tree_bin[i]], 0); |
| // Increment count for new state. |
| - ++raster_state_count_[state][i][mts.tree_bin[i]]; |
| + ++raster_state_count_[state][i][mts->tree_bin[i]]; |
| } |
| - mts.raster_state = state; |
| + mts->raster_state = state; |
| } |
| -void TileManager::DidTileBinChange(Tile* tile, |
| +void TileManager::DidTileBinChange(ManagedTileState* mts, |
| TileManagerBin bin, |
| WhichTree tree) { |
| - ManagedTileState& mts = tile->managed_state(); |
| - |
| // Decrement count for current bin. |
| - --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; |
| - DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); |
| + --raster_state_count_[mts->raster_state][tree][mts->tree_bin[tree]]; |
| + DCHECK_GE( |
| + raster_state_count_[mts->raster_state][tree][mts->tree_bin[tree]], 0); |
| // Increment count for new bin. |
| - ++raster_state_count_[mts.raster_state][tree][bin]; |
| + ++raster_state_count_[mts->raster_state][tree][bin]; |
| - mts.tree_bin[tree] = bin; |
| + mts->tree_bin[tree] = bin; |
| } |
| // static |