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/resources/tile_manager.h" | 5 #include "cc/resources/tile_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 namespace { | 24 namespace { |
25 | 25 |
26 // If we raster too fast we become upload bound, and pending | 26 // If we raster too fast we become upload bound, and pending |
27 // uploads consume memory. For maximum upload throughput, we would | 27 // uploads consume memory. For maximum upload throughput, we would |
28 // want to allow for upload_throughput * pipeline_time of pending | 28 // want to allow for upload_throughput * pipeline_time of pending |
29 // uploads, after which we are just wasting memory. Since we don't | 29 // uploads, after which we are just wasting memory. Since we don't |
30 // know our upload throughput yet, this just caps our memory usage. | 30 // know our upload throughput yet, this just caps our memory usage. |
31 #if defined(OS_ANDROID) | 31 #if defined(OS_ANDROID) |
32 // For reference, the Nexus10 can upload 1MB in about 2.5ms. | 32 // For reference, the Nexus10 can upload 1MB in about 2.5ms. |
33 // Assuming a three frame deep pipeline this implies ~20MB. | 33 // Assuming a three frame deep pipeline this implies ~20MB. |
34 const size_t kMaxPendingUploadBytes = 20 * 1024 * 1024; | 34 const int kMaxPendingUploadBytes = 20 * 1024 * 1024; |
35 // TODO(epenner): We should remove this upload limit (crbug.com/176197) | 35 // TODO(epenner): We should remove this upload limit (crbug.com/176197) |
36 const size_t kMaxPendingUploads = 72; | 36 const int kMaxPendingUploads = 72; |
37 #else | 37 #else |
38 const size_t kMaxPendingUploadBytes = 100 * 1024 * 1024; | 38 const int kMaxPendingUploadBytes = 100 * 1024 * 1024; |
39 const size_t kMaxPendingUploads = 1000; | 39 const int kMaxPendingUploads = 1000; |
40 #endif | 40 #endif |
41 | 41 |
42 #if defined(OS_ANDROID) | 42 #if defined(OS_ANDROID) |
43 const int kMaxNumPendingTasksPerThread = 8; | 43 const int kMaxNumPendingTasksPerThread = 8; |
44 #else | 44 #else |
45 const int kMaxNumPendingTasksPerThread = 40; | 45 const int kMaxNumPendingTasksPerThread = 40; |
46 #endif | 46 #endif |
47 | 47 |
48 // Limit for time spent running cheap tasks during a single frame. | 48 // Limit for time spent running cheap tasks during a single frame. |
49 // TODO(skyostil): Determine this limit more dynamically. | 49 // TODO(skyostil): Determine this limit more dynamically. |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 bool prediction_benchmarking, | 158 bool prediction_benchmarking, |
159 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 159 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
160 : client_(client), | 160 : client_(client), |
161 resource_pool_(ResourcePool::Create(resource_provider)), | 161 resource_pool_(ResourcePool::Create(resource_provider)), |
162 raster_worker_pool_(RasterWorkerPool::Create(this, num_raster_threads)), | 162 raster_worker_pool_(RasterWorkerPool::Create(this, num_raster_threads)), |
163 manage_tiles_pending_(false), | 163 manage_tiles_pending_(false), |
164 manage_tiles_call_count_(0), | 164 manage_tiles_call_count_(0), |
165 bytes_pending_upload_(0), | 165 bytes_pending_upload_(0), |
166 has_performed_uploads_since_last_flush_(false), | 166 has_performed_uploads_since_last_flush_(false), |
167 ever_exceeded_memory_budget_(false), | 167 ever_exceeded_memory_budget_(false), |
168 rendering_stats_instrumentation_(rendering_stats_instrumentation), | |
169 max_prepaint_tile_distance_(max_prepaint_tile_distance), | 168 max_prepaint_tile_distance_(max_prepaint_tile_distance), |
170 use_cheapness_estimator_(use_cheapness_estimator), | 169 use_cheapness_estimator_(use_cheapness_estimator), |
171 use_color_estimator_(use_color_estimator), | 170 use_color_estimator_(use_color_estimator), |
172 prediction_benchmarking_(prediction_benchmarking), | 171 prediction_benchmarking_(prediction_benchmarking), |
173 did_initialize_visible_tile_(false), | 172 did_initialize_visible_tile_(false), |
174 pending_tasks_(0), | 173 pending_tasks_(0), |
175 max_pending_tasks_(kMaxNumPendingTasksPerThread * num_raster_threads) { | 174 max_pending_tasks_(kMaxNumPendingTasksPerThread * num_raster_threads), |
| 175 rendering_stats_instrumentation_(rendering_stats_instrumentation) { |
176 for (int i = 0; i < NUM_STATES; ++i) { | 176 for (int i = 0; i < NUM_STATES; ++i) { |
177 for (int j = 0; j < NUM_TREES; ++j) { | 177 for (int j = 0; j < NUM_TREES; ++j) { |
178 for (int k = 0; k < NUM_BINS; ++k) | 178 for (int k = 0; k < NUM_BINS; ++k) |
179 raster_state_count_[i][j][k] = 0; | 179 raster_state_count_[i][j][k] = 0; |
180 } | 180 } |
181 } | 181 } |
182 } | 182 } |
183 | 183 |
184 TileManager::~TileManager() { | 184 TileManager::~TileManager() { |
185 // Reset global state and manage. This should cause | 185 // Reset global state and manage. This should cause |
186 // our memory usage to drop to zero. | 186 // our memory usage to drop to zero. |
187 global_state_ = GlobalStateThatImpactsTilePriority(); | 187 global_state_ = GlobalStateThatImpactsTilePriority(); |
188 AssignGpuMemoryToTiles(); | 188 AssignGpuMemoryToTiles(); |
189 // This should finish all pending tasks and release any uninitialized | 189 // This should finish all pending tasks and release any uninitialized |
190 // resources. | 190 // resources. |
191 raster_worker_pool_.reset(); | 191 raster_worker_pool_.reset(); |
192 AbortPendingTileUploads(); | 192 AbortPendingTileUploads(); |
193 DCHECK_EQ(0u, tiles_with_pending_upload_.size()); | 193 DCHECK_EQ(tiles_with_pending_upload_.size(), 0); |
194 DCHECK_EQ(0u, all_tiles_.size()); | 194 DCHECK_EQ(all_tiles_.size(), 0); |
195 DCHECK_EQ(0u, live_or_allocated_tiles_.size()); | 195 DCHECK_EQ(live_or_allocated_tiles_.size(), 0); |
196 } | 196 } |
197 | 197 |
198 void TileManager::SetGlobalState( | 198 void TileManager::SetGlobalState( |
199 const GlobalStateThatImpactsTilePriority& global_state) { | 199 const GlobalStateThatImpactsTilePriority& global_state) { |
200 global_state_ = global_state; | 200 global_state_ = global_state; |
201 resource_pool_->SetMaxMemoryUsageBytes( | 201 resource_pool_->SetMaxMemoryUsageBytes( |
202 global_state_.memory_limit_in_bytes, | 202 global_state_.memory_limit_in_bytes, |
203 global_state_.unused_memory_limit_in_bytes); | 203 global_state_.unused_memory_limit_in_bytes); |
204 ScheduleManageTiles(); | 204 ScheduleManageTiles(); |
205 UpdateCheapTasksTimeLimit(); | 205 UpdateCheapTasksTimeLimit(); |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 10); | 1027 10); |
1028 | 1028 |
1029 if (metadata.prediction_benchmarking) { | 1029 if (metadata.prediction_benchmarking) { |
1030 PicturePileImpl::Analysis analysis; | 1030 PicturePileImpl::Analysis analysis; |
1031 picture_pile->AnalyzeInRect(rect, contents_scale, &analysis); | 1031 picture_pile->AnalyzeInRect(rect, contents_scale, &analysis); |
1032 bool is_predicted_cheap = analysis.is_cheap_to_raster; | 1032 bool is_predicted_cheap = analysis.is_cheap_to_raster; |
1033 bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f; | 1033 bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f; |
1034 RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap); | 1034 RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap); |
1035 | 1035 |
1036 DCHECK_EQ(bitmap.rowBytes(), | 1036 DCHECK_EQ(bitmap.rowBytes(), |
1037 static_cast<size_t>(bitmap.width() * bitmap.bytesPerPixel())); | 1037 bitmap.width() * bitmap.bytesPerPixel()); |
1038 | 1038 |
1039 RecordSolidColorPredictorResults( | 1039 RecordSolidColorPredictorResults( |
1040 reinterpret_cast<SkColor*>(bitmap.getPixels()), | 1040 reinterpret_cast<SkColor*>(bitmap.getPixels()), |
1041 bitmap.getSize() / bitmap.bytesPerPixel(), | 1041 bitmap.getSize() / bitmap.bytesPerPixel(), |
1042 analysis.is_solid_color, | 1042 analysis.is_solid_color, |
1043 analysis.solid_color, | 1043 analysis.solid_color, |
1044 analysis.is_transparent); | 1044 analysis.is_transparent); |
1045 } | 1045 } |
1046 } | 1046 } |
1047 } | 1047 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 skia::LazyPixelRef* pixel_ref, | 1115 skia::LazyPixelRef* pixel_ref, |
1116 RenderingStatsInstrumentation* stats_instrumentation) { | 1116 RenderingStatsInstrumentation* stats_instrumentation) { |
1117 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); | 1117 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); |
1118 base::TimeTicks start_time = stats_instrumentation->StartRecording(); | 1118 base::TimeTicks start_time = stats_instrumentation->StartRecording(); |
1119 pixel_ref->Decode(); | 1119 pixel_ref->Decode(); |
1120 base::TimeDelta duration = stats_instrumentation->EndRecording(start_time); | 1120 base::TimeDelta duration = stats_instrumentation->EndRecording(start_time); |
1121 stats_instrumentation->AddDeferredImageDecode(duration); | 1121 stats_instrumentation->AddDeferredImageDecode(duration); |
1122 } | 1122 } |
1123 | 1123 |
1124 } // namespace cc | 1124 } // namespace cc |
OLD | NEW |