Chromium Code Reviews| Index: cc/tile_manager.cc |
| diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc |
| index a80f1dd8380c04320c67fa1c4aa218efc86bd5bb..06aa08bd4238b1142f07952e248aa09153c4eabe 100644 |
| --- a/cc/tile_manager.cc |
| +++ b/cc/tile_manager.cc |
| @@ -57,6 +57,15 @@ ManagedTileState::~ManagedTileState() { |
| DCHECK(!resource_is_being_initialized); |
| } |
| +PendingSetPixels::PendingSetPixels( |
|
nduca
2012/12/04 23:59:26
I think this is overkill. Just do what I told you
reveman
2012/12/05 23:21:19
Done.
|
| + Tile* tile, scoped_ptr<ResourcePool::Resource> resource) |
| + : tile_(tile), |
| + resource_(resource.Pass()) { |
| +} |
| + |
| +PendingSetPixels::~PendingSetPixels() { |
| +} |
| + |
| TileManager::TileManager( |
| TileManagerClient* client, |
| ResourceProvider* resource_provider, |
| @@ -65,6 +74,7 @@ TileManager::TileManager( |
| resource_pool_(ResourcePool::Create(resource_provider, |
| Renderer::ImplPool)), |
| manage_tiles_pending_(false), |
| + in_prepare_to_draw_(false), |
| pending_raster_tasks_(0), |
| num_raster_threads_(num_raster_threads), |
| worker_pool_(new base::SequencedWorkerPool(num_raster_threads, |
| @@ -222,6 +232,12 @@ void TileManager::ManageTiles() { |
| DispatchMoreRasterTasks(); |
| } |
| +void TileManager::PrepareToDraw() { |
|
nduca
2012/12/04 23:59:26
Lets call this CheckForCompletedUploads() so its o
reveman
2012/12/05 23:21:19
Done. Now CheckForCompletedSetPixels().
|
| + in_prepare_to_draw_ = true; |
| + CheckForPendingSetPixelsCompletion(); |
| + in_prepare_to_draw_ = false; |
| +} |
| + |
| void TileManager::renderingStats(RenderingStats* stats) { |
| stats->totalRasterizeTimeInSeconds = |
| rendering_stats_.totalRasterizeTimeInSeconds; |
| @@ -294,6 +310,8 @@ void TileManager::DispatchMoreRasterTasks() { |
| DispatchOneRasterTask(tiles_that_need_to_be_rasterized_.back()); |
| tiles_that_need_to_be_rasterized_.pop_back(); |
| } |
| + |
| + CheckForPendingSetPixelsCompletion(); |
| } |
| void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
| @@ -360,16 +378,18 @@ void TileManager::OnRasterTaskCompleted( |
| // Finish resource initialization if |can_use_gpu_memory| is true. |
| if (managed_tile_state.can_use_gpu_memory) { |
| - resource_pool_->resource_provider()->setPixelsFromBuffer(resource->id()); |
| - resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| - |
| - // The component order may be bgra if we uploaded bgra pixels to rgba |
| + // 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_); |
| - DidFinishTileInitialization(tile, resource.Pass()); |
| + // Tile resources can't be freed until upload has completed. |
| + managed_tile_state.can_be_freed = false; |
| + |
| + resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
| + pending_set_pixels_.append( |
| + make_scoped_ptr(new PendingSetPixels(tile, resource.Pass()))); |
| } else { |
| resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| resource_pool_->ReleaseResource(resource.Pass()); |
| @@ -379,14 +399,33 @@ void TileManager::OnRasterTaskCompleted( |
| DispatchMoreRasterTasks(); |
| } |
| +void TileManager::CheckForPendingSetPixelsCompletion() { |
| + while (!pending_set_pixels_.isEmpty()) { |
| + // Set pixel tasks complete in the order they are posted. |
| + if (!resource_pool_->resource_provider()->didSetPixelsComplete( |
| + pending_set_pixels_.first()->resource()->id())) |
| + break; |
| + |
| + scoped_ptr<PendingSetPixels> set_pixels = pending_set_pixels_.takeFirst(); |
| + scoped_ptr<ResourcePool::Resource> resource = set_pixels->takeResource(); |
| + |
| + // It's now safe to release the pixel buffer. |
| + resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| + |
| + DidFinishTileInitialization(set_pixels->tile(), resource.Pass()); |
| + } |
| +} |
| + |
| void TileManager::DidFinishTileInitialization( |
| Tile* tile, scoped_ptr<ResourcePool::Resource> resource) { |
| ManagedTileState& managed_tile_state = tile->managed_state(); |
| DCHECK(!managed_tile_state.resource); |
| managed_tile_state.resource = resource.Pass(); |
| managed_tile_state.resource_is_being_initialized = false; |
| + managed_tile_state.can_be_freed = true; |
| // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. |
| - client_->ScheduleRedraw(); |
| + if (!in_prepare_to_draw_) |
| + client_->ScheduleRedraw(); |
| } |
| } |