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 |