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 |