| Index: cc/tile_manager.cc
|
| diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc
|
| index 3dd12b2ce35077cf5d2d8c8f453e2a6c1e40997f..68ec45e5f07c309990031a6d50248d2d38be1cdb 100644
|
| --- a/cc/tile_manager.cc
|
| +++ b/cc/tile_manager.cc
|
| @@ -73,11 +73,11 @@ std::string ValueToString(scoped_ptr<base::Value> value)
|
| return str;
|
| }
|
|
|
| -RasterTaskMetadata GetRasterTaskMetadata(const ManagedTileState& mts) {
|
| +RasterTaskMetadata GetRasterTaskMetadata(const ManagedTileState* mts) {
|
| RasterTaskMetadata raster_task_metadata;
|
| raster_task_metadata.is_tile_in_pending_tree_now_bin =
|
| - mts.tree_bin[PENDING_TREE] == NOW_BIN;
|
| - raster_task_metadata.tile_resolution = mts.resolution;
|
| + mts->tree_bin[PENDING_TREE] == NOW_BIN;
|
| + raster_task_metadata.tile_resolution = mts->resolution;
|
| return raster_task_metadata;
|
| }
|
|
|
| @@ -142,8 +142,9 @@ scoped_ptr<base::Value> TileRasterStateAsValue(
|
| }
|
| }
|
|
|
| -ManagedTileState::ManagedTileState()
|
| - : can_use_gpu_memory(false),
|
| +ManagedTileState::ManagedTileState(Tile* tile)
|
| + : tile(tile),
|
| + can_use_gpu_memory(false),
|
| can_be_freed(true),
|
| resource_is_being_initialized(false),
|
| contents_swizzled(false),
|
| @@ -157,9 +158,11 @@ ManagedTileState::ManagedTileState()
|
| tree_bin[i] = NEVER_BIN;
|
| bin[i] = NEVER_BIN;
|
| }
|
| + tile->tile_manager()->RegisterManagedTile(this);
|
| }
|
|
|
| ManagedTileState::~ManagedTileState() {
|
| + tile->tile_manager()->UnregisterManagedTile(this);
|
| DCHECK(!resource);
|
| DCHECK(!resource_is_being_initialized);
|
| }
|
| @@ -224,69 +227,75 @@ void TileManager::SetGlobalState(
|
| ScheduleManageTiles();
|
| }
|
|
|
| -void TileManager::RegisterTile(Tile* tile) {
|
| - all_tiles_.insert(tile);
|
| +scoped_refptr<ManagedTileState> TileManager::RegisterTile(Tile* tile) {
|
| + if (!tile->managed_state_) {
|
| + tile->managed_state_ = new ManagedTileState(tile);
|
| + return make_scoped_refptr(tile->managed_state_);
|
| + }
|
| + return tile->managed_state_;
|
| +}
|
|
|
| - const ManagedTileState& mts = tile->managed_state();
|
| +void TileManager::RegisterManagedTile(ManagedTileState* mts) {
|
| + all_tiles_.insert(mts);
|
| for (int i = 0; i < NUM_TREES; ++i)
|
| - ++raster_state_count_[mts.raster_state][i][mts.tree_bin[i]];
|
| + ++raster_state_count_[mts->raster_state][i][mts->tree_bin[i]];
|
|
|
| ScheduleManageTiles();
|
| }
|
|
|
| -void TileManager::UnregisterTile(Tile* tile) {
|
| +void TileManager::UnregisterManagedTile(ManagedTileState* mts) {
|
| for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin();
|
| it != tiles_with_image_decoding_tasks_.end(); it++) {
|
| - if (*it == tile) {
|
| + if (*it == mts) {
|
| 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) {
|
| + if (*it == mts) {
|
| tiles_that_need_to_be_rasterized_.erase(it);
|
| break;
|
| }
|
| }
|
| for (TileVector::iterator it = live_or_allocated_tiles_.begin();
|
| it != live_or_allocated_tiles_.end(); it++) {
|
| - if (*it == tile) {
|
| + if (*it == mts) {
|
| live_or_allocated_tiles_.erase(it);
|
| break;
|
| }
|
| }
|
| - TileSet::iterator it = all_tiles_.find(tile);
|
| + TileSet::iterator it = all_tiles_.find(mts);
|
| DCHECK(it != all_tiles_.end());
|
| - 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);
|
| + --raster_state_count_[mts->raster_state][i][mts->tree_bin[i]];
|
| + FreeResourcesForTile(mts);
|
| all_tiles_.erase(it);
|
| + mts->tile->managed_state_ = NULL;
|
| + mts->tile = NULL;
|
| }
|
|
|
| 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* ams,
|
| + const ManagedTileState* bms) const {
|
| + if (ams->bin[HIGH_PRIORITY_BIN] != bms->bin[HIGH_PRIORITY_BIN])
|
| + return ams->bin[HIGH_PRIORITY_BIN] < bms->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 (ams->bin[LOW_PRIORITY_BIN] != bms->bin[LOW_PRIORITY_BIN])
|
| + return ams->bin[LOW_PRIORITY_BIN] < bms->bin[LOW_PRIORITY_BIN];
|
|
|
| - if (ams.resolution != bms.resolution)
|
| - return ams.resolution < bms.resolution;
|
| + if (ams->resolution != bms->resolution)
|
| + return ams->resolution < bms->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 (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 (ams.distance_to_visible_in_pixels != bms.distance_to_visible_in_pixels)
|
| - return ams.distance_to_visible_in_pixels < bms.distance_to_visible_in_pixels;
|
| + if (ams->distance_to_visible_in_pixels != bms->distance_to_visible_in_pixels)
|
| + return ams->distance_to_visible_in_pixels < bms->distance_to_visible_in_pixels;
|
|
|
| - gfx::Rect a_rect = a->content_rect();
|
| - gfx::Rect b_rect = b->content_rect();
|
| + gfx::Rect a_rect = ams->tile->content_rect();
|
| + gfx::Rect b_rect = bms->tile->content_rect();
|
| if (a_rect.y() != b_rect.y())
|
| return a_rect.y() < b_rect.y();
|
| return a_rect.x() < b_rect.x();
|
| @@ -338,54 +347,56 @@ void TileManager::ManageTiles() {
|
| // For each tree, bin into different categories of tiles.
|
| for (TileSet::iterator it = all_tiles_.begin();
|
| it != all_tiles_.end(); ++it) {
|
| - Tile* tile = *it;
|
| - ManagedTileState& mts = tile->managed_state();
|
| + ManagedTileState* mts = *it;
|
|
|
| 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();
|
| + mts->tile->combined_priority();
|
| break;
|
| case SMOOTHNESS_TAKES_PRIORITY:
|
| - prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE);
|
| - prio[LOW_PRIORITY_BIN] = tile->priority(PENDING_TREE);
|
| + prio[HIGH_PRIORITY_BIN] = mts->tile->priority(ACTIVE_TREE);
|
| + prio[LOW_PRIORITY_BIN] = mts->tile->priority(PENDING_TREE);
|
| break;
|
| case NEW_CONTENT_TAKES_PRIORITY:
|
| - prio[HIGH_PRIORITY_BIN] = tile->priority(PENDING_TREE);
|
| - prio[LOW_PRIORITY_BIN] = tile->priority(ACTIVE_TREE);
|
| + prio[HIGH_PRIORITY_BIN] = mts->tile->priority(PENDING_TREE);
|
| + prio[LOW_PRIORITY_BIN] = mts->tile->priority(ACTIVE_TREE);
|
| break;
|
| }
|
|
|
| - mts.resolution = prio[HIGH_PRIORITY_BIN].resolution;
|
| - mts.time_to_needed_in_seconds =
|
| + mts->resolution = prio[HIGH_PRIORITY_BIN].resolution;
|
| + mts->time_to_needed_in_seconds =
|
| prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds;
|
| - mts.distance_to_visible_in_pixels =
|
| + mts->distance_to_visible_in_pixels =
|
| prio[HIGH_PRIORITY_BIN].distance_to_visible_in_pixels;
|
| - 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());
|
| -
|
| - DidTileTreeBinChange(tile,
|
| - BinFromTilePriority(tile->priority(ACTIVE_TREE)),
|
| - ACTIVE_TREE);
|
| - DidTileTreeBinChange(tile,
|
| - BinFromTilePriority(tile->priority(PENDING_TREE)),
|
| - PENDING_TREE);
|
| + 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(
|
| + mts->tile->combined_priority());
|
| +
|
| + DidTileTreeBinChange(
|
| + mts,
|
| + BinFromTilePriority(mts->tile->priority(ACTIVE_TREE)),
|
| + ACTIVE_TREE);
|
| + DidTileTreeBinChange(
|
| + mts,
|
| + BinFromTilePriority(mts->tile->priority(PENDING_TREE)),
|
| + PENDING_TREE);
|
|
|
| for (int i = 0; i < NUM_BIN_PRIORITIES; ++i)
|
| - mts.bin[i] = bin_map[mts.bin[i]];
|
| + mts->bin[i] = bin_map[mts->bin[i]];
|
|
|
| - DidTileTreeBinChange(tile, bin_map[mts.tree_bin[ACTIVE_TREE]],
|
| + DidTileTreeBinChange(mts, bin_map[mts->tree_bin[ACTIVE_TREE]],
|
| ACTIVE_TREE);
|
| - DidTileTreeBinChange(tile, bin_map[mts.tree_bin[PENDING_TREE]],
|
| + DidTileTreeBinChange(mts, bin_map[mts->tree_bin[PENDING_TREE]],
|
| PENDING_TREE);
|
|
|
| - if (tile->priority(ACTIVE_TREE).is_live ||
|
| - tile->priority(PENDING_TREE).is_live ||
|
| - tile->managed_state().resource ||
|
| - tile->managed_state().resource_is_being_initialized) {
|
| - live_or_allocated_tiles_.push_back(tile);
|
| + if (mts->tile->priority(ACTIVE_TREE).is_live ||
|
| + mts->tile->priority(PENDING_TREE).is_live ||
|
| + mts->resource ||
|
| + mts->resource_is_being_initialized) {
|
| + live_or_allocated_tiles_.push_back(mts);
|
| }
|
| }
|
| TRACE_COUNTER_ID1("cc", "LiveOrAllocatedTileCount", this,
|
| @@ -405,27 +416,27 @@ 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->tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 &&
|
| + mts->tile->priority(ACTIVE_TREE).resolution == 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->tile->bytes_consumed_if_allocated();
|
| + DidTileRasterStateChange(mts, IDLE_STATE);
|
| tiles_with_pending_set_pixels_.pop();
|
| }
|
|
|
| @@ -434,22 +445,21 @@ void TileManager::CheckForCompletedTileUploads() {
|
|
|
| void TileManager::AbortPendingTileUploads() {
|
| while (!tiles_with_pending_set_pixels_.empty()) {
|
| - Tile* tile = tiles_with_pending_set_pixels_.front();
|
| - ManagedTileState& managed_tile_state = tile->managed_state();
|
| - DCHECK(managed_tile_state.resource);
|
| + ManagedTileState* mts = tiles_with_pending_set_pixels_.front();
|
| + DCHECK(mts->resource);
|
|
|
| resource_pool_->resource_provider()->abortSetPixels(
|
| - managed_tile_state.resource->id());
|
| + mts->resource->id());
|
| resource_pool_->resource_provider()->releasePixelBuffer(
|
| - managed_tile_state.resource->id());
|
| + mts->resource->id());
|
|
|
| - managed_tile_state.resource_is_being_initialized = false;
|
| - managed_tile_state.can_be_freed = true;
|
| - managed_tile_state.can_use_gpu_memory = false;
|
| - FreeResourcesForTile(tile);
|
| + mts->resource_is_being_initialized = false;
|
| + mts->can_be_freed = true;
|
| + mts->can_use_gpu_memory = false;
|
| + FreeResourcesForTile(mts);
|
|
|
| - bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated();
|
| - DidTileRasterStateChange(tile, IDLE_STATE);
|
| + bytes_pending_set_pixels_ -= mts->tile->bytes_consumed_if_allocated();
|
| + DidTileRasterStateChange(mts, IDLE_STATE);
|
| tiles_with_pending_set_pixels_.pop();
|
| }
|
| }
|
| @@ -462,14 +472,13 @@ void TileManager::GetMemoryStats(
|
| *memoryNiceToHaveBytes = 0;
|
| *memoryUsedBytes = 0;
|
| for (size_t i = 0; i < live_or_allocated_tiles_.size(); i++) {
|
| - const Tile* tile = live_or_allocated_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)
|
| + const ManagedTileState* mts = live_or_allocated_tiles_[i];
|
| + size_t tile_bytes = mts->tile->bytes_consumed_if_allocated();
|
| + if (mts->gpu_memmgr_stats_bin == NOW_BIN)
|
| *memoryRequiredBytes += tile_bytes;
|
| - if (mts.gpu_memmgr_stats_bin != NEVER_BIN)
|
| + if (mts->gpu_memmgr_stats_bin != NEVER_BIN)
|
| *memoryNiceToHaveBytes += tile_bytes;
|
| - if (mts.can_use_gpu_memory)
|
| + if (mts->can_use_gpu_memory)
|
| *memoryUsedBytes += tile_bytes;
|
| }
|
| }
|
| @@ -583,42 +592,41 @@ void TileManager::AssignGpuMemoryToTiles() {
|
| // loop as well.
|
| for (TileVector::iterator it = live_or_allocated_tiles_.begin();
|
| it != live_or_allocated_tiles_.end(); ++it) {
|
| - Tile* tile = *it;
|
| - if (!tile->managed_state().can_be_freed)
|
| - unreleasable_bytes += tile->bytes_consumed_if_allocated();
|
| - if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE)
|
| - DidTileRasterStateChange(tile, IDLE_STATE);
|
| + ManagedTileState* mts = *it;
|
| + if (!mts->can_be_freed)
|
| + unreleasable_bytes += mts->tile->bytes_consumed_if_allocated();
|
| + 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_that_exceeded_memory_budget_in_now_bin = 0;
|
| size_t bytes_left = bytes_allocatable;
|
| for (TileVector::iterator it = live_or_allocated_tiles_.begin(); it != live_or_allocated_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)
|
| + ManagedTileState* mts = *it;
|
| + size_t tile_bytes = mts->tile->bytes_consumed_if_allocated();
|
| + 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;
|
| }
|
| if (tile_bytes > bytes_left) {
|
| - managed_tile_state.can_use_gpu_memory = false;
|
| - if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NOW_BIN ||
|
| - managed_tile_state.bin[LOW_PRIORITY_BIN] == NOW_BIN)
|
| + mts->can_use_gpu_memory = false;
|
| + if (mts->bin[HIGH_PRIORITY_BIN] == NOW_BIN ||
|
| + mts->bin[LOW_PRIORITY_BIN] == NOW_BIN)
|
| bytes_that_exceeded_memory_budget_in_now_bin += 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);
|
| }
|
| }
|
|
|
| @@ -644,18 +652,17 @@ void TileManager::AssignGpuMemoryToTiles() {
|
| 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->tile->bytes_consumed_if_allocated();
|
| return new_bytes_pending <= kMaxPendingUploadBytes &&
|
| tiles_with_pending_set_pixels_.size() < kMaxPendingUploads;
|
| }
|
| @@ -666,12 +673,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;
|
| @@ -681,32 +688,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::HighResNow();
|
| - tile->picture_pile()->GatherPixelRefs(
|
| - tile->content_rect_,
|
| - tile->contents_scale_,
|
| - managed_state.pending_pixel_refs);
|
| - managed_state.need_to_gather_pixel_refs = false;
|
| + mts->tile->picture_pile()->GatherPixelRefs(
|
| + mts->tile->content_rect_,
|
| + mts->tile->contents_scale_,
|
| + mts->pending_pixel_refs);
|
| + mts->need_to_gather_pixel_refs = false;
|
| if (record_rendering_stats_) {
|
| rendering_stats_.totalImageGatheringCount++;
|
| rendering_stats_.totalImageGatheringTime +=
|
| @@ -715,10 +720,10 @@ void TileManager::GatherPixelRefsForTile(Tile* tile) {
|
| }
|
| }
|
|
|
| -void TileManager::DispatchImageDecodeTasksForTile(Tile* tile) {
|
| - GatherPixelRefsForTile(tile);
|
| +void TileManager::DispatchImageDecodeTasksForTile(ManagedTileState* mts) {
|
| + GatherPixelRefsForTile(mts);
|
| std::list<skia::LazyPixelRef*>& pending_pixel_refs =
|
| - tile->managed_state().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(
|
| @@ -733,14 +738,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() ==
|
| @@ -751,19 +756,19 @@ 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;
|
| + (*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()) {
|
| @@ -775,59 +780,59 @@ void TileManager::OnImageDecodeTaskCompleted(
|
| }
|
|
|
| scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster(
|
| - Tile* tile) {
|
| - ManagedTileState& managed_tile_state = tile->managed_state();
|
| - DCHECK(managed_tile_state.can_use_gpu_memory);
|
| + ManagedTileState* mts) {
|
| + 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->tile_size_.size(),
|
| + mts->tile->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);
|
| return resource.Pass();
|
| }
|
|
|
| -void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) {
|
| +void TileManager::DispatchOneRasterTask(scoped_refptr<ManagedTileState> mts) {
|
| TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask");
|
| - scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile);
|
| + scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(mts);
|
| ResourceProvider::ResourceId resource_id = resource->id();
|
|
|
| raster_worker_pool_->PostRasterTaskAndReply(
|
| - tile->picture_pile(),
|
| + mts->tile->picture_pile(),
|
| base::Bind(&TileManager::PerformRaster,
|
| resource_pool_->resource_provider()->mapPixelBuffer(
|
| resource_id),
|
| - tile->content_rect_,
|
| - tile->contents_scale(),
|
| + mts->tile->content_rect_,
|
| + mts->tile->contents_scale(),
|
| use_cheapness_estimator_,
|
| - GetRasterTaskMetadata(tile->managed_state())),
|
| + GetRasterTaskMetadata(mts)),
|
| base::Bind(&TileManager::OnRasterTaskCompleted,
|
| base::Unretained(this),
|
| - tile,
|
| + mts,
|
| base::Passed(&resource),
|
| manage_tiles_call_count_));
|
| }
|
|
|
| -void TileManager::PerformOneRaster(Tile* tile) {
|
| - scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile);
|
| +void TileManager::PerformOneRaster(ManagedTileState* mts) {
|
| + scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(mts);
|
| ResourceProvider::ResourceId resource_id = resource->id();
|
|
|
| PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer(
|
| resource_id),
|
| - tile->content_rect_,
|
| - tile->contents_scale(),
|
| + mts->tile->content_rect_,
|
| + mts->tile->contents_scale(),
|
| use_cheapness_estimator_,
|
| - GetRasterTaskMetadata(tile->managed_state()),
|
| - tile->picture_pile(),
|
| + GetRasterTaskMetadata(mts->tile->managed_state()),
|
| + mts->tile->picture_pile(),
|
| &rendering_stats_);
|
|
|
| - OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_);
|
| + OnRasterCompleted(mts, resource.Pass(), manage_tiles_call_count_);
|
| }
|
|
|
| void TileManager::OnRasterCompleted(
|
| - scoped_refptr<Tile> tile,
|
| + scoped_refptr<ManagedTileState> mts,
|
| scoped_ptr<ResourcePool::Resource> resource,
|
| int manage_tiles_call_count_when_dispatched) {
|
| TRACE_EVENT0("cc", "TileManager::OnRasterCompleted");
|
| @@ -835,8 +840,7 @@ void TileManager::OnRasterCompleted(
|
| // 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
|
| @@ -848,76 +852,73 @@ void TileManager::OnRasterCompleted(
|
| 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->tile->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());
|
| has_performed_uploads_since_last_flush_ = true;
|
|
|
| - 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->tile->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);
|
| }
|
| }
|
|
|
| void TileManager::OnRasterTaskCompleted(
|
| - scoped_refptr<Tile> tile,
|
| + scoped_refptr<ManagedTileState> mts,
|
| scoped_ptr<ResourcePool::Resource> resource,
|
| int manage_tiles_call_count_when_dispatched) {
|
| - OnRasterCompleted(tile, resource.Pass(),
|
| + OnRasterCompleted(mts, resource.Pass(),
|
| manage_tiles_call_count_when_dispatched);
|
| }
|
|
|
| -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::DidTileTreeBinChange(Tile* tile,
|
| +void TileManager::DidTileTreeBinChange(ManagedTileState* mts,
|
| TileManagerBin new_tree_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][new_tree_bin];
|
| + ++raster_state_count_[mts->raster_state][tree][new_tree_bin];
|
|
|
| - mts.tree_bin[tree] = new_tree_bin;
|
| + mts->tree_bin[tree] = new_tree_bin;
|
| }
|
|
|
| // static
|
|
|