Chromium Code Reviews| 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 } | 93 } |
| 94 | 94 |
| 95 int num_pending_tasks_; | 95 int num_pending_tasks_; |
| 96 | 96 |
| 97 DISALLOW_COPY_AND_ASSIGN(RasterThread); | 97 DISALLOW_COPY_AND_ASSIGN(RasterThread); |
| 98 }; | 98 }; |
| 99 | 99 |
| 100 ManagedTileState::ManagedTileState() | 100 ManagedTileState::ManagedTileState() |
| 101 : can_use_gpu_memory(false), | 101 : can_use_gpu_memory(false), |
| 102 can_be_freed(true), | 102 can_be_freed(true), |
| 103 resource_id(0), | |
| 103 resource_is_being_initialized(false), | 104 resource_is_being_initialized(false), |
| 104 contents_swizzled(false) { | 105 contents_swizzled(false) { |
| 105 } | 106 } |
| 106 | 107 |
| 107 ManagedTileState::~ManagedTileState() { | 108 ManagedTileState::~ManagedTileState() { |
| 108 DCHECK(!resource); | 109 DCHECK(!resource); |
| 109 DCHECK(!resource_is_being_initialized); | 110 DCHECK(!resource_is_being_initialized); |
| 110 } | 111 } |
| 111 | 112 |
| 112 TileManager::TileManager( | 113 TileManager::TileManager( |
| 113 TileManagerClient* client, | 114 TileManagerClient* client, |
| 114 ResourceProvider* resource_provider, | 115 ResourceProvider* resource_provider, |
| 115 size_t num_raster_threads) | 116 size_t num_raster_threads) |
| 116 : client_(client), | 117 : client_(client), |
| 117 resource_pool_(ResourcePool::Create(resource_provider, | 118 resource_pool_(ResourcePool::Create(resource_provider, |
| 118 Renderer::ImplPool)), | 119 Renderer::ImplPool)), |
| 119 manage_tiles_pending_(false) { | 120 manage_tiles_pending_(false), |
| 121 check_for_completed_set_pixels_pending_(false) { | |
| 120 // Initialize all threads. | 122 // Initialize all threads. |
| 121 const std::string thread_name_prefix = kRasterThreadNamePrefix; | 123 const std::string thread_name_prefix = kRasterThreadNamePrefix; |
| 122 while (raster_threads_.size() < num_raster_threads) { | 124 while (raster_threads_.size() < num_raster_threads) { |
| 123 int thread_number = raster_threads_.size() + 1; | 125 int thread_number = raster_threads_.size() + 1; |
| 124 scoped_ptr<RasterThread> thread = make_scoped_ptr( | 126 scoped_ptr<RasterThread> thread = make_scoped_ptr( |
| 125 new RasterThread(thread_name_prefix + | 127 new RasterThread(thread_name_prefix + |
| 126 StringPrintf("Worker%d", thread_number).c_str())); | 128 StringPrintf("Worker%d", thread_number).c_str())); |
| 127 raster_threads_.append(thread.Pass()); | 129 raster_threads_.append(thread.Pass()); |
| 128 } | 130 } |
| 129 } | 131 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 ScheduleManageTiles(); | 170 ScheduleManageTiles(); |
| 169 } | 171 } |
| 170 | 172 |
| 171 void TileManager::ScheduleManageTiles() { | 173 void TileManager::ScheduleManageTiles() { |
| 172 if (manage_tiles_pending_) | 174 if (manage_tiles_pending_) |
| 173 return; | 175 return; |
| 174 client_->ScheduleManageTiles(); | 176 client_->ScheduleManageTiles(); |
| 175 manage_tiles_pending_ = true; | 177 manage_tiles_pending_ = true; |
| 176 } | 178 } |
| 177 | 179 |
| 180 void TileManager::ScheduleCheckForCompletedSetPixels() { | |
| 181 if (check_for_completed_set_pixels_pending_) | |
| 182 return; | |
| 183 client_->ScheduleCheckForCompletedSetPixels(); | |
| 184 check_for_completed_set_pixels_pending_ = true; | |
| 185 } | |
| 186 | |
| 178 class BinComparator { | 187 class BinComparator { |
| 179 public: | 188 public: |
| 180 bool operator() (const Tile* a, const Tile* b) const { | 189 bool operator() (const Tile* a, const Tile* b) const { |
| 181 const ManagedTileState& ams = a->managed_state(); | 190 const ManagedTileState& ams = a->managed_state(); |
| 182 const ManagedTileState& bms = b->managed_state(); | 191 const ManagedTileState& bms = b->managed_state(); |
| 183 if (ams.bin != bms.bin) | 192 if (ams.bin != bms.bin) |
| 184 return ams.bin < bms.bin; | 193 return ams.bin < bms.bin; |
| 185 | 194 |
| 186 if (ams.resolution != bms.resolution) | 195 if (ams.resolution != bms.resolution) |
| 187 return ams.resolution < ams.resolution; | 196 return ams.resolution < ams.resolution; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 | 280 |
| 272 // Sort by bin. | 281 // Sort by bin. |
| 273 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); | 282 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); |
| 274 | 283 |
| 275 // Assign gpu memory and determine what tiles need to be rasterized. | 284 // Assign gpu memory and determine what tiles need to be rasterized. |
| 276 AssignGpuMemoryToTiles(); | 285 AssignGpuMemoryToTiles(); |
| 277 | 286 |
| 278 // Finally, kick the rasterizer. | 287 // Finally, kick the rasterizer. |
| 279 DispatchMoreRasterTasks(); | 288 DispatchMoreRasterTasks(); |
| 280 } | 289 } |
| 281 | 290 |
|
epennerAtGoogle
2012/12/06 00:33:17
Could this possibly just be called at the beginnin
reveman
2012/12/06 15:28:20
For minimal latency I think we want to call this j
| |
| 291 void TileManager::CheckForCompletedSetPixels() { | |
|
nduca
2012/12/06 03:21:30
I had asked for this before, and I'll ask again.
reveman
2012/12/06 15:28:20
We've moved away from using the "upload" term in r
| |
| 292 check_for_completed_set_pixels_pending_ = false; | |
| 293 | |
| 294 while (!tiles_with_pending_set_pixels_.empty()) { | |
| 295 Tile* tile = tiles_with_pending_set_pixels_.front(); | |
| 296 DCHECK(tile->managed_state().resource); | |
| 297 | |
| 298 // Set pixel tasks complete in the order they are posted. | |
|
nduca
2012/12/06 16:37:09
does async upload extension guarantee completion o
reveman
2012/12/06 20:40:35
Yes and it's advantages not to relax this requirem
| |
| 299 if (!resource_pool_->resource_provider()->didSetPixelsComplete( | |
| 300 tile->managed_state().resource->id())) { | |
| 301 ScheduleCheckForCompletedSetPixels(); | |
| 302 break; | |
| 303 } | |
| 304 | |
| 305 // It's now safe to release the pixel buffer. | |
| 306 resource_pool_->resource_provider()->releasePixelBuffer( | |
| 307 tile->managed_state().resource->id()); | |
| 308 | |
| 309 DidFinishTileInitialization(tile); | |
| 310 tiles_with_pending_set_pixels_.pop(); | |
| 311 } | |
| 312 } | |
| 313 | |
| 282 void TileManager::renderingStats(RenderingStats* stats) { | 314 void TileManager::renderingStats(RenderingStats* stats) { |
| 283 stats->totalRasterizeTimeInSeconds = | 315 stats->totalRasterizeTimeInSeconds = |
| 284 rendering_stats_.totalRasterizeTimeInSeconds; | 316 rendering_stats_.totalRasterizeTimeInSeconds; |
| 285 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized; | 317 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized; |
| 286 } | 318 } |
| 287 | 319 |
| 288 void TileManager::AssignGpuMemoryToTiles() { | 320 void TileManager::AssignGpuMemoryToTiles() { |
| 289 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); | 321 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 290 // Some memory cannot be released. Figure out which. | 322 // Some memory cannot be released. Figure out which. |
| 291 size_t unreleasable_bytes = 0; | 323 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 | 445 // Tile can be freed after the completion of the raster task. Call |
| 414 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 446 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| 415 // tiles. The result of this could be that this tile is no longer | 447 // 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 | 448 // allowed to use gpu memory and in that case we need to abort |
| 417 // initialization and free all associated resources before calling | 449 // initialization and free all associated resources before calling |
| 418 // DispatchMoreRasterTasks(). | 450 // DispatchMoreRasterTasks(). |
| 419 AssignGpuMemoryToTiles(); | 451 AssignGpuMemoryToTiles(); |
| 420 | 452 |
| 421 // Finish resource initialization if |can_use_gpu_memory| is true. | 453 // Finish resource initialization if |can_use_gpu_memory| is true. |
| 422 if (managed_tile_state.can_use_gpu_memory) { | 454 if (managed_tile_state.can_use_gpu_memory) { |
| 423 resource_pool_->resource_provider()->setPixelsFromBuffer(resource->id()); | 455 // 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 | 456 // texture. Mark contents as swizzled if image component order is |
| 428 // different than texture format. | 457 // different than texture format. |
| 429 managed_tile_state.contents_swizzled = | 458 managed_tile_state.contents_swizzled = |
| 430 !PlatformColor::sameComponentOrder(tile->format_); | 459 !PlatformColor::sameComponentOrder(tile->format_); |
| 431 | 460 |
| 432 DidFinishTileInitialization(tile, resource.Pass()); | 461 // Tile resources can't be freed until upload has completed. |
| 462 managed_tile_state.can_be_freed = false; | |
| 463 | |
| 464 resource_pool_->resource_provider()->beginSetPixels(resource->id()); | |
| 465 managed_tile_state.resource = resource.Pass(); | |
|
nduca
2012/12/06 16:37:09
this is getting really insane to me that you have
reveman
2012/12/06 20:40:35
I got rid of ManagedTileState::resource_id by just
| |
| 466 tiles_with_pending_set_pixels_.push(tile); | |
| 467 | |
| 468 ScheduleCheckForCompletedSetPixels(); | |
| 433 } else { | 469 } else { |
| 434 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 470 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| 435 resource_pool_->ReleaseResource(resource.Pass()); | 471 resource_pool_->ReleaseResource(resource.Pass()); |
| 436 managed_tile_state.resource_is_being_initialized = false; | 472 managed_tile_state.resource_is_being_initialized = false; |
| 437 } | 473 } |
| 438 | 474 |
| 439 DispatchMoreRasterTasks(); | 475 DispatchMoreRasterTasks(); |
| 440 } | 476 } |
| 441 | 477 |
| 442 void TileManager::DidFinishTileInitialization( | 478 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 443 Tile* tile, scoped_ptr<ResourcePool::Resource> resource) { | |
| 444 ManagedTileState& managed_tile_state = tile->managed_state(); | 479 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 445 DCHECK(!managed_tile_state.resource); | 480 DCHECK(managed_tile_state.resource); |
| 446 managed_tile_state.resource = resource.Pass(); | 481 managed_tile_state.resource_id = managed_tile_state.resource->id(); |
| 447 managed_tile_state.resource_is_being_initialized = false; | 482 managed_tile_state.resource_is_being_initialized = false; |
| 448 // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. | 483 managed_tile_state.can_be_freed = true; |
| 449 client_->ScheduleRedraw(); | |
| 450 } | 484 } |
| 451 | 485 |
| 452 } | 486 } |
| OLD | NEW |