| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/tile_manager.h" | 5 #include "cc/tile_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 DCHECK(!resource_is_being_initialized); | 109 DCHECK(!resource_is_being_initialized); |
| 110 } | 110 } |
| 111 | 111 |
| 112 TileManager::TileManager( | 112 TileManager::TileManager( |
| 113 TileManagerClient* client, | 113 TileManagerClient* client, |
| 114 ResourceProvider* resource_provider, | 114 ResourceProvider* resource_provider, |
| 115 size_t num_raster_threads) | 115 size_t num_raster_threads) |
| 116 : client_(client), | 116 : client_(client), |
| 117 resource_pool_(ResourcePool::Create(resource_provider, | 117 resource_pool_(ResourcePool::Create(resource_provider, |
| 118 Renderer::ImplPool)), | 118 Renderer::ImplPool)), |
| 119 manage_tiles_pending_(false) { | 119 manage_tiles_pending_(false), |
| 120 check_for_completed_set_pixels_pending_(false) { |
| 120 // Initialize all threads. | 121 // Initialize all threads. |
| 121 const std::string thread_name_prefix = kRasterThreadNamePrefix; | 122 const std::string thread_name_prefix = kRasterThreadNamePrefix; |
| 122 while (raster_threads_.size() < num_raster_threads) { | 123 while (raster_threads_.size() < num_raster_threads) { |
| 123 int thread_number = raster_threads_.size() + 1; | 124 int thread_number = raster_threads_.size() + 1; |
| 124 scoped_ptr<RasterThread> thread = make_scoped_ptr( | 125 scoped_ptr<RasterThread> thread = make_scoped_ptr( |
| 125 new RasterThread(thread_name_prefix + | 126 new RasterThread(thread_name_prefix + |
| 126 StringPrintf("Worker%d", thread_number).c_str())); | 127 StringPrintf("Worker%d", thread_number).c_str())); |
| 127 raster_threads_.append(thread.Pass()); | 128 raster_threads_.append(thread.Pass()); |
| 128 } | 129 } |
| 129 } | 130 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 ScheduleManageTiles(); | 169 ScheduleManageTiles(); |
| 169 } | 170 } |
| 170 | 171 |
| 171 void TileManager::ScheduleManageTiles() { | 172 void TileManager::ScheduleManageTiles() { |
| 172 if (manage_tiles_pending_) | 173 if (manage_tiles_pending_) |
| 173 return; | 174 return; |
| 174 client_->ScheduleManageTiles(); | 175 client_->ScheduleManageTiles(); |
| 175 manage_tiles_pending_ = true; | 176 manage_tiles_pending_ = true; |
| 176 } | 177 } |
| 177 | 178 |
| 179 void TileManager::ScheduleCheckForCompletedSetPixels() { |
| 180 if (check_for_completed_set_pixels_pending_) |
| 181 return; |
| 182 client_->ScheduleCheckForCompletedSetPixels(); |
| 183 check_for_completed_set_pixels_pending_ = true; |
| 184 } |
| 185 |
| 178 class BinComparator { | 186 class BinComparator { |
| 179 public: | 187 public: |
| 180 bool operator() (const Tile* a, const Tile* b) const { | 188 bool operator() (const Tile* a, const Tile* b) const { |
| 181 const ManagedTileState& ams = a->managed_state(); | 189 const ManagedTileState& ams = a->managed_state(); |
| 182 const ManagedTileState& bms = b->managed_state(); | 190 const ManagedTileState& bms = b->managed_state(); |
| 183 if (ams.bin != bms.bin) | 191 if (ams.bin != bms.bin) |
| 184 return ams.bin < bms.bin; | 192 return ams.bin < bms.bin; |
| 185 | 193 |
| 186 if (ams.resolution != bms.resolution) | 194 if (ams.resolution != bms.resolution) |
| 187 return ams.resolution < ams.resolution; | 195 return ams.resolution < ams.resolution; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 // Sort by bin. | 280 // Sort by bin. |
| 273 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); | 281 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); |
| 274 | 282 |
| 275 // Assign gpu memory and determine what tiles need to be rasterized. | 283 // Assign gpu memory and determine what tiles need to be rasterized. |
| 276 AssignGpuMemoryToTiles(); | 284 AssignGpuMemoryToTiles(); |
| 277 | 285 |
| 278 // Finally, kick the rasterizer. | 286 // Finally, kick the rasterizer. |
| 279 DispatchMoreRasterTasks(); | 287 DispatchMoreRasterTasks(); |
| 280 } | 288 } |
| 281 | 289 |
| 290 void TileManager::CheckForCompletedSetPixels() { |
| 291 check_for_completed_set_pixels_pending_ = false; |
| 292 |
| 293 while (!tiles_with_pending_set_pixels_.empty()) { |
| 294 Tile* tile = tiles_with_pending_set_pixels_.front(); |
| 295 DCHECK(tile->managed_state().resource); |
| 296 |
| 297 // Set pixel tasks complete in the order they are posted. |
| 298 if (!resource_pool_->resource_provider()->didSetPixelsComplete( |
| 299 tile->managed_state().resource->id())) { |
| 300 ScheduleCheckForCompletedSetPixels(); |
| 301 break; |
| 302 } |
| 303 |
| 304 // It's now safe to release the pixel buffer. |
| 305 resource_pool_->resource_provider()->releasePixelBuffer( |
| 306 tile->managed_state().resource->id()); |
| 307 |
| 308 DidFinishTileInitialization(tile); |
| 309 tiles_with_pending_set_pixels_.pop(); |
| 310 } |
| 311 } |
| 312 |
| 282 void TileManager::renderingStats(RenderingStats* stats) { | 313 void TileManager::renderingStats(RenderingStats* stats) { |
| 283 stats->totalRasterizeTimeInSeconds = | 314 stats->totalRasterizeTimeInSeconds = |
| 284 rendering_stats_.totalRasterizeTimeInSeconds; | 315 rendering_stats_.totalRasterizeTimeInSeconds; |
| 285 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized; | 316 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized; |
| 286 } | 317 } |
| 287 | 318 |
| 288 void TileManager::AssignGpuMemoryToTiles() { | 319 void TileManager::AssignGpuMemoryToTiles() { |
| 289 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); | 320 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 290 // Some memory cannot be released. Figure out which. | 321 // Some memory cannot be released. Figure out which. |
| 291 size_t unreleasable_bytes = 0; | 322 size_t unreleasable_bytes = 0; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 // Tile can be freed after the completion of the raster task. Call | 444 // Tile can be freed after the completion of the raster task. Call |
| 414 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 445 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| 415 // tiles. The result of this could be that this tile is no longer | 446 // tiles. The result of this could be that this tile is no longer |
| 416 // allowed to use gpu memory and in that case we need to abort | 447 // allowed to use gpu memory and in that case we need to abort |
| 417 // initialization and free all associated resources before calling | 448 // initialization and free all associated resources before calling |
| 418 // DispatchMoreRasterTasks(). | 449 // DispatchMoreRasterTasks(). |
| 419 AssignGpuMemoryToTiles(); | 450 AssignGpuMemoryToTiles(); |
| 420 | 451 |
| 421 // Finish resource initialization if |can_use_gpu_memory| is true. | 452 // Finish resource initialization if |can_use_gpu_memory| is true. |
| 422 if (managed_tile_state.can_use_gpu_memory) { | 453 if (managed_tile_state.can_use_gpu_memory) { |
| 423 resource_pool_->resource_provider()->setPixelsFromBuffer(resource->id()); | 454 // The component order may be bgra if we're uploading bgra pixels to rgba |
| 424 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | |
| 425 | |
| 426 // The component order may be bgra if we uploaded bgra pixels to rgba | |
| 427 // texture. Mark contents as swizzled if image component order is | 455 // texture. Mark contents as swizzled if image component order is |
| 428 // different than texture format. | 456 // different than texture format. |
| 429 managed_tile_state.contents_swizzled = | 457 managed_tile_state.contents_swizzled = |
| 430 !PlatformColor::sameComponentOrder(tile->format_); | 458 !PlatformColor::sameComponentOrder(tile->format_); |
| 431 | 459 |
| 432 DidFinishTileInitialization(tile, resource.Pass()); | 460 // Tile resources can't be freed until upload has completed. |
| 461 managed_tile_state.can_be_freed = false; |
| 462 |
| 463 resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
| 464 managed_tile_state.resource = resource.Pass(); |
| 465 tiles_with_pending_set_pixels_.push(tile); |
| 466 |
| 467 ScheduleCheckForCompletedSetPixels(); |
| 433 } else { | 468 } else { |
| 434 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 469 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| 435 resource_pool_->ReleaseResource(resource.Pass()); | 470 resource_pool_->ReleaseResource(resource.Pass()); |
| 436 managed_tile_state.resource_is_being_initialized = false; | 471 managed_tile_state.resource_is_being_initialized = false; |
| 437 } | 472 } |
| 438 | 473 |
| 439 DispatchMoreRasterTasks(); | 474 DispatchMoreRasterTasks(); |
| 440 } | 475 } |
| 441 | 476 |
| 442 void TileManager::DidFinishTileInitialization( | 477 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 443 Tile* tile, scoped_ptr<ResourcePool::Resource> resource) { | |
| 444 ManagedTileState& managed_tile_state = tile->managed_state(); | 478 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 445 DCHECK(!managed_tile_state.resource); | 479 DCHECK(managed_tile_state.resource); |
| 446 managed_tile_state.resource = resource.Pass(); | |
| 447 managed_tile_state.resource_is_being_initialized = false; | 480 managed_tile_state.resource_is_being_initialized = false; |
| 448 // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. | 481 managed_tile_state.can_be_freed = true; |
| 449 client_->ScheduleRedraw(); | |
| 450 } | 482 } |
| 451 | 483 |
| 452 } | 484 } |
| OLD | NEW |