| Index: cc/tile_manager.cc
|
| diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc
|
| index b8ff58ba5078b49ee3abaf0bbf439a0176f351ad..ceb909038ea80e29ef72f165e4e62bcf4496b5a4 100644
|
| --- a/cc/tile_manager.cc
|
| +++ b/cc/tile_manager.cc
|
| @@ -123,7 +123,7 @@ TileManager::TileManager(
|
| 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),
|
| + bytes_pending_upload_(0),
|
| ever_exceeded_memory_budget_(false),
|
| record_rendering_stats_(record_rendering_stats),
|
| use_cheapness_estimator_(use_cheapness_estimator) {
|
| @@ -144,7 +144,7 @@ TileManager::~TileManager() {
|
| // resources.
|
| raster_worker_pool_.reset();
|
| CheckForCompletedTileUploads();
|
| - DCHECK(tiles_with_pending_set_pixels_.size() == 0);
|
| + DCHECK(tiles_with_pending_upload_.size() == 0);
|
| DCHECK(tiles_.size() == 0);
|
| }
|
|
|
| @@ -314,8 +314,8 @@ void TileManager::ManageTiles() {
|
| }
|
|
|
| void TileManager::CheckForCompletedTileUploads() {
|
| - while (!tiles_with_pending_set_pixels_.empty()) {
|
| - Tile* tile = tiles_with_pending_set_pixels_.front();
|
| + while (!tiles_with_pending_upload_.empty()) {
|
| + Tile* tile = tiles_with_pending_upload_.front();
|
| DCHECK(tile->managed_state().resource);
|
|
|
| // Set pixel tasks complete in the order they are posted.
|
| @@ -324,24 +324,28 @@ void TileManager::CheckForCompletedTileUploads() {
|
| break;
|
| }
|
|
|
| - if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 &&
|
| - 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());
|
|
|
| - DidFinishTileInitialization(tile);
|
| + DidCompleteTileUpload(tile);
|
|
|
| - bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated();
|
| - DidTileRasterStateChange(tile, IDLE_STATE);
|
| - tiles_with_pending_set_pixels_.pop();
|
| + bytes_pending_upload_ -= tile->bytes_consumed_if_allocated();
|
| + tiles_with_pending_upload_.pop();
|
| }
|
|
|
| DispatchMoreTasks();
|
| }
|
|
|
| +void TileManager::DidCompleteTileUpload(Tile* tile) {
|
| + if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 &&
|
| + tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION)
|
| + client_->DidUploadVisibleHighResolutionTile();
|
| +
|
| + DidFinishTileInitialization(tile);
|
| + DidTileRasterStateChange(tile, IDLE_STATE);
|
| +}
|
| +
|
| void TileManager::GetMemoryStats(
|
| size_t* memoryRequiredBytes,
|
| size_t* memoryNiceToHaveBytes,
|
| @@ -407,7 +411,7 @@ bool TileManager::HasPendingWorkScheduled(WhichTree tree) const {
|
| switch (i) {
|
| case WAITING_FOR_RASTER_STATE:
|
| case RASTER_STATE:
|
| - case SET_PIXELS_STATE:
|
| + case UPLOAD_STATE:
|
| for (int j = 0; j < NEVER_BIN; ++j) {
|
| if (raster_state_count_[i][tree][j])
|
| return true;
|
| @@ -514,7 +518,7 @@ void TileManager::FreeResourcesForTile(Tile* tile) {
|
| bool TileManager::CanDispatchRasterTask(Tile* tile) const {
|
| if (raster_worker_pool_->IsBusy())
|
| return false;
|
| - size_t new_bytes_pending = bytes_pending_set_pixels_;
|
| + size_t new_bytes_pending = bytes_pending_upload_;
|
| new_bytes_pending += tile->bytes_consumed_if_allocated();
|
| return new_bytes_pending <= kMaxPendingUploadBytes;
|
| }
|
| @@ -524,10 +528,6 @@ bool TileManager::CanPerformCheapRaster(Tile* tile) const {
|
| return false;
|
| ManagedTileState& managed_state = tile->managed_state();
|
| DCHECK(managed_state.pending_pixel_refs.empty());
|
| - size_t new_bytes_pending = bytes_pending_set_pixels_;
|
| - new_bytes_pending += tile->bytes_consumed_if_allocated();
|
| - if (new_bytes_pending > kMaxPendingUploadBytes)
|
| - return false;
|
| return tile->picture_pile()->IsCheapInRect(tile->content_rect_,
|
| tile->contents_scale());
|
| }
|
| @@ -701,14 +701,16 @@ void TileManager::PerformOneCheapRaster(Tile* tile) {
|
| use_cheapness_estimator_,
|
| tile->picture_pile(),
|
| &rendering_stats_);
|
| - OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_);
|
| + OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_,
|
| + TILE_UPLOAD_SYNC);
|
| client_->DidPerformCheapRaster();
|
| }
|
|
|
| void TileManager::OnRasterCompleted(
|
| scoped_refptr<Tile> tile,
|
| scoped_ptr<ResourcePool::Resource> resource,
|
| - int manage_tiles_call_count_when_dispatched) {
|
| + int manage_tiles_call_count_when_dispatched,
|
| + TileUploadMethod upload_method) {
|
| TRACE_EVENT0("cc", "TileManager::OnRasterCompleted");
|
|
|
| // Release raster resources.
|
| @@ -734,16 +736,24 @@ void TileManager::OnRasterCompleted(
|
| managed_tile_state.contents_swizzled =
|
| !PlatformColor::sameComponentOrder(tile->format_);
|
|
|
| - // Tile resources can't be freed until upload has completed.
|
| - managed_tile_state.can_be_freed = false;
|
| + if (upload_method == TILE_UPLOAD_ASYNC) {
|
| + // Tile resources can't be freed until upload has completed.
|
| + managed_tile_state.can_be_freed = false;
|
|
|
| - resource_pool_->resource_provider()->beginSetPixels(resource->id());
|
| - resource_pool_->resource_provider()->shallowFlushIfSupported();
|
| - managed_tile_state.resource = resource.Pass();
|
| + resource_pool_->resource_provider()->beginSetPixels(resource->id());
|
| + resource_pool_->resource_provider()->shallowFlushIfSupported();
|
| + managed_tile_state.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_upload_ += tile->bytes_consumed_if_allocated();
|
| + DidTileRasterStateChange(tile, UPLOAD_STATE);
|
| + tiles_with_pending_upload_.push(tile);
|
| + } else {
|
| + DCHECK(upload_method == TILE_UPLOAD_SYNC);
|
| + resource_pool_->resource_provider()->setPixelsFromBuffer(resource->id());
|
| + resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
|
| + managed_tile_state.resource = resource.Pass();
|
| + DidCompleteTileUpload(tile);
|
| + }
|
| } else {
|
| resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
|
| resource_pool_->ReleaseResource(resource.Pass());
|
| @@ -757,7 +767,8 @@ void TileManager::OnRasterTaskCompleted(
|
| scoped_ptr<ResourcePool::Resource> resource,
|
| int manage_tiles_call_count_when_dispatched) {
|
| OnRasterCompleted(tile, resource.Pass(),
|
| - manage_tiles_call_count_when_dispatched);
|
| + manage_tiles_call_count_when_dispatched,
|
| + TILE_UPLOAD_ASYNC);
|
| DispatchMoreTasks();
|
| }
|
|
|
|
|