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/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
| 11 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/string_number_conversions.h" | |
| 12 #include "base/threading/sequenced_worker_pool.h" | 14 #include "base/threading/sequenced_worker_pool.h" |
| 13 #include "cc/platform_color.h" | 15 #include "cc/platform_color.h" |
| 14 #include "cc/rendering_stats.h" | 16 #include "cc/rendering_stats.h" |
| 15 #include "cc/resource_pool.h" | 17 #include "cc/resource_pool.h" |
| 18 #include "cc/switches.h" | |
| 16 #include "cc/tile.h" | 19 #include "cc/tile.h" |
| 17 #include "third_party/skia/include/core/SkDevice.h" | 20 #include "third_party/skia/include/core/SkDevice.h" |
| 18 | 21 |
| 19 namespace { | 22 namespace { |
| 20 | 23 |
| 21 void RasterizeTile(cc::PicturePileImpl* picture_pile, | 24 void RasterizeTile(cc::PicturePileImpl* picture_pile, |
| 22 uint8_t* mapped_buffer, | 25 uint8_t* mapped_buffer, |
| 23 const gfx::Rect& rect, | 26 const gfx::Rect& rect, |
| 24 cc::RenderingStats* stats) { | 27 cc::RenderingStats* stats) { |
| 25 TRACE_EVENT0("cc", "RasterizeTile"); | 28 TRACE_EVENT0("cc", "RasterizeTile"); |
| 26 DCHECK(mapped_buffer); | 29 DCHECK(mapped_buffer); |
| 27 DCHECK(picture_pile); | 30 DCHECK(picture_pile); |
| 28 SkBitmap bitmap; | 31 SkBitmap bitmap; |
| 29 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); | 32 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); |
| 30 bitmap.setPixels(mapped_buffer); | 33 bitmap.setPixels(mapped_buffer); |
| 31 SkDevice device(bitmap); | 34 SkDevice device(bitmap); |
| 32 SkCanvas canvas(&device); | 35 SkCanvas canvas(&device); |
| 33 picture_pile->Raster(&canvas, rect, stats); | 36 picture_pile->Raster(&canvas, rect, stats); |
| 34 } | 37 } |
| 35 | 38 |
| 36 const int kMaxRasterThreads = 1; | 39 const int kMaxRasterThreads = 64; |
| 40 const int kDefaultNumberOfRasterThreads = 1; | |
| 37 | 41 |
| 38 const char* kRasterThreadNamePrefix = "CompositorRaster"; | 42 const char* kRasterThreadNamePrefix = "CompositorRaster"; |
| 39 | 43 |
| 40 // Allow two pending raster tasks per thread. This keeps resource usage | 44 // Allow two pending raster tasks per thread. This keeps resource usage |
| 41 // low while making sure raster threads aren't unnecessarily idle. | 45 // low while making sure raster threads aren't unnecessarily idle. |
| 42 const int kNumPendingRasterTasksPerThread = 2; | 46 const int kNumPendingRasterTasksPerThread = 2; |
| 43 | 47 |
| 44 } // namespace | 48 } // namespace |
| 45 | 49 |
| 46 namespace cc { | 50 namespace cc { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 57 DCHECK(!resource_id); | 61 DCHECK(!resource_id); |
| 58 DCHECK(!resource_id_is_being_initialized); | 62 DCHECK(!resource_id_is_being_initialized); |
| 59 } | 63 } |
| 60 | 64 |
| 61 TileManager::TileManager( | 65 TileManager::TileManager( |
| 62 TileManagerClient* client, ResourceProvider* resource_provider) | 66 TileManagerClient* client, ResourceProvider* resource_provider) |
| 63 : client_(client), | 67 : client_(client), |
| 64 resource_pool_(ResourcePool::Create(resource_provider, | 68 resource_pool_(ResourcePool::Create(resource_provider, |
| 65 Renderer::ImplPool)), | 69 Renderer::ImplPool)), |
| 66 manage_tiles_pending_(false), | 70 manage_tiles_pending_(false), |
| 67 pending_raster_tasks_(0), | 71 pending_raster_tasks_(0) { |
| 68 worker_pool_(new base::SequencedWorkerPool(kMaxRasterThreads, | 72 size_t worker_threads = kDefaultNumberOfRasterThreads; |
| 69 kRasterThreadNamePrefix)) { | 73 if (CommandLine::ForCurrentProcess()->HasSwitch( |
|
enne (OOO)
2012/12/03 17:47:42
Given that ubercompositor may want to set properti
| |
| 74 cc::switches::kNumRasterThreads)) { | |
| 75 std::string num_raster_threads = | |
| 76 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 77 cc::switches::kNumRasterThreads); | |
| 78 int num_threads; | |
| 79 if (base::StringToInt(num_raster_threads, &num_threads) && | |
| 80 num_threads > 0 && num_threads <= kMaxRasterThreads) { | |
| 81 worker_threads = num_threads; | |
| 82 } else { | |
| 83 LOG(WARNING) << "Bad number of raster threads: " << num_raster_threads; | |
| 84 } | |
| 85 } | |
| 86 worker_pool_ = new base::SequencedWorkerPool(worker_threads, | |
| 87 kRasterThreadNamePrefix); | |
| 70 } | 88 } |
| 71 | 89 |
| 72 TileManager::~TileManager() { | 90 TileManager::~TileManager() { |
| 73 // Reset global state and manage. This should cause | 91 // Reset global state and manage. This should cause |
| 74 // our memory usage to drop to zero. | 92 // our memory usage to drop to zero. |
| 75 global_state_ = GlobalStateThatImpactsTilePriority(); | 93 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 76 ManageTiles(); | 94 ManageTiles(); |
| 77 DCHECK(tiles_.size() == 0); | 95 DCHECK(tiles_.size() == 0); |
| 78 // This should finish all pending raster tasks and release any | 96 // This should finish all pending raster tasks and release any |
| 79 // uninitialized resources. | 97 // uninitialized resources. |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 381 Tile* tile, ResourceProvider::ResourceId resource_id) { | 399 Tile* tile, ResourceProvider::ResourceId resource_id) { |
| 382 ManagedTileState& managed_tile_state = tile->managed_state(); | 400 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 383 DCHECK(!managed_tile_state.resource_id); | 401 DCHECK(!managed_tile_state.resource_id); |
| 384 managed_tile_state.resource_id = resource_id; | 402 managed_tile_state.resource_id = resource_id; |
| 385 managed_tile_state.resource_id_is_being_initialized = false; | 403 managed_tile_state.resource_id_is_being_initialized = false; |
| 386 // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. | 404 // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. |
| 387 client_->ScheduleRedraw(); | 405 client_->ScheduleRedraw(); |
| 388 } | 406 } |
| 389 | 407 |
| 390 } | 408 } |
| OLD | NEW |