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 |