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 <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
15 #include "cc/debug/devtools_instrumentation.h" | 15 #include "cc/debug/devtools_instrumentation.h" |
16 #include "cc/debug/traced_value.h" | 16 #include "cc/debug/traced_value.h" |
17 #include "cc/layers/picture_layer_impl.h" | 17 #include "cc/layers/picture_layer_impl.h" |
18 #include "cc/resources/raster_worker_pool_delegate.h" | 18 #include "cc/resources/raster_worker_pool.h" |
| 19 #include "cc/resources/rasterizer_delegate.h" |
19 #include "cc/resources/tile.h" | 20 #include "cc/resources/tile.h" |
20 #include "skia/ext/paint_simplifier.h" | 21 #include "skia/ext/paint_simplifier.h" |
21 #include "third_party/skia/include/core/SkBitmap.h" | 22 #include "third_party/skia/include/core/SkBitmap.h" |
22 #include "third_party/skia/include/core/SkPixelRef.h" | 23 #include "third_party/skia/include/core/SkPixelRef.h" |
23 #include "ui/gfx/rect_conversions.h" | 24 #include "ui/gfx/rect_conversions.h" |
24 | 25 |
25 namespace cc { | 26 namespace cc { |
26 namespace { | 27 namespace { |
27 | 28 |
28 // Flag to indicate whether we should try and detect that | 29 // Flag to indicate whether we should try and detect that |
29 // a tile is of solid color. | 30 // a tile is of solid color. |
30 const bool kUseColorEstimator = true; | 31 const bool kUseColorEstimator = true; |
31 | 32 |
32 // Minimum width/height of a pile that would require analysis for tiles. | 33 // Minimum width/height of a pile that would require analysis for tiles. |
33 const int kMinDimensionsForAnalysis = 256; | 34 const int kMinDimensionsForAnalysis = 256; |
34 | 35 |
35 class DisableLCDTextFilter : public SkDrawFilter { | 36 class DisableLCDTextFilter : public SkDrawFilter { |
36 public: | 37 public: |
37 // SkDrawFilter interface. | 38 // SkDrawFilter interface. |
38 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { | 39 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { |
39 if (type != SkDrawFilter::kText_Type) | 40 if (type != SkDrawFilter::kText_Type) |
40 return true; | 41 return true; |
41 | 42 |
42 paint->setLCDRenderText(false); | 43 paint->setLCDRenderText(false); |
43 return true; | 44 return true; |
44 } | 45 } |
45 }; | 46 }; |
46 | 47 |
47 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 48 class RasterTaskImpl : public internal::RasterTask { |
48 public: | 49 public: |
49 RasterWorkerPoolTaskImpl( | 50 RasterTaskImpl( |
50 const Resource* resource, | 51 const Resource* resource, |
51 PicturePileImpl* picture_pile, | 52 PicturePileImpl* picture_pile, |
52 const gfx::Rect& content_rect, | 53 const gfx::Rect& content_rect, |
53 float contents_scale, | 54 float contents_scale, |
54 RasterMode raster_mode, | 55 RasterMode raster_mode, |
55 TileResolution tile_resolution, | 56 TileResolution tile_resolution, |
56 int layer_id, | 57 int layer_id, |
57 const void* tile_id, | 58 const void* tile_id, |
58 int source_frame_number, | 59 int source_frame_number, |
59 bool analyze_picture, | 60 bool analyze_picture, |
60 RenderingStatsInstrumentation* rendering_stats, | 61 RenderingStatsInstrumentation* rendering_stats, |
61 const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, | 62 const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, |
62 internal::WorkerPoolTask::Vector* dependencies) | 63 internal::ImageDecodeTask::Vector* dependencies) |
63 : internal::RasterWorkerPoolTask(resource, dependencies), | 64 : internal::RasterTask(resource, dependencies), |
64 picture_pile_(picture_pile), | 65 picture_pile_(picture_pile), |
65 content_rect_(content_rect), | 66 content_rect_(content_rect), |
66 contents_scale_(contents_scale), | 67 contents_scale_(contents_scale), |
67 raster_mode_(raster_mode), | 68 raster_mode_(raster_mode), |
68 tile_resolution_(tile_resolution), | 69 tile_resolution_(tile_resolution), |
69 layer_id_(layer_id), | 70 layer_id_(layer_id), |
70 tile_id_(tile_id), | 71 tile_id_(tile_id), |
71 source_frame_number_(source_frame_number), | 72 source_frame_number_(source_frame_number), |
72 analyze_picture_(analyze_picture), | 73 analyze_picture_(analyze_picture), |
73 rendering_stats_(rendering_stats), | 74 rendering_stats_(rendering_stats), |
74 reply_(reply), | 75 reply_(reply), |
75 canvas_(NULL) {} | 76 canvas_(NULL) {} |
76 | 77 |
77 // Overridden from internal::Task: | 78 // Overridden from internal::Task: |
78 virtual void RunOnWorkerThread() OVERRIDE { | 79 virtual void RunOnWorkerThread() OVERRIDE { |
79 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::RunOnWorkerThread"); | 80 TRACE_EVENT0("cc", "RasterizerTaskImpl::RunOnWorkerThread"); |
80 | 81 |
81 DCHECK(picture_pile_); | 82 DCHECK(picture_pile_); |
82 if (canvas_) { | 83 if (canvas_) { |
83 AnalyzeAndRaster(picture_pile_->GetCloneForDrawingOnThread( | 84 AnalyzeAndRaster(picture_pile_->GetCloneForDrawingOnThread( |
84 RasterWorkerPool::GetPictureCloneIndexForCurrentThread())); | 85 RasterWorkerPool::GetPictureCloneIndexForCurrentThread())); |
85 } | 86 } |
86 } | 87 } |
87 | 88 |
88 // Overridden from internal::WorkerPoolTask: | 89 // Overridden from internal::RasterizerTask: |
89 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 90 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client) |
90 OVERRIDE { | 91 OVERRIDE { |
91 DCHECK(!canvas_); | 92 DCHECK(!canvas_); |
92 canvas_ = client->AcquireCanvasForRaster(this, resource()); | 93 canvas_ = client->AcquireCanvasForRaster(this); |
93 } | 94 } |
94 virtual void RunOnOriginThread() OVERRIDE { | 95 virtual void RunOnOriginThread() OVERRIDE { |
95 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::RunOnOriginThread"); | 96 TRACE_EVENT0("cc", "RasterTaskImpl::RunOnOriginThread"); |
96 if (canvas_) | 97 if (canvas_) |
97 AnalyzeAndRaster(picture_pile_); | 98 AnalyzeAndRaster(picture_pile_); |
98 } | 99 } |
99 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 100 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client) |
100 OVERRIDE { | 101 OVERRIDE { |
101 canvas_ = NULL; | 102 canvas_ = NULL; |
102 client->ReleaseCanvasForRaster(this, resource()); | 103 client->ReleaseCanvasForRaster(this); |
103 } | 104 } |
104 virtual void RunReplyOnOriginThread() OVERRIDE { | 105 virtual void RunReplyOnOriginThread() OVERRIDE { |
105 DCHECK(!canvas_); | 106 DCHECK(!canvas_); |
106 reply_.Run(analysis_, !HasFinishedRunning()); | 107 reply_.Run(analysis_, !HasFinishedRunning()); |
107 } | 108 } |
108 | 109 |
109 protected: | 110 protected: |
110 virtual ~RasterWorkerPoolTaskImpl() { DCHECK(!canvas_); } | 111 virtual ~RasterTaskImpl() { DCHECK(!canvas_); } |
111 | 112 |
112 private: | 113 private: |
113 scoped_ptr<base::Value> DataAsValue() const { | 114 scoped_ptr<base::Value> DataAsValue() const { |
114 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | 115 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
115 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); | 116 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); |
116 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); | 117 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); |
117 res->SetInteger("source_frame_number", source_frame_number_); | 118 res->SetInteger("source_frame_number", source_frame_number_); |
118 res->SetInteger("layer_id", layer_id_); | 119 res->SetInteger("layer_id", layer_id_); |
119 return res.PassAs<base::Value>(); | 120 return res.PassAs<base::Value>(); |
120 } | 121 } |
121 | 122 |
122 void AnalyzeAndRaster(PicturePileImpl* picture_pile) { | 123 void AnalyzeAndRaster(PicturePileImpl* picture_pile) { |
123 DCHECK(picture_pile); | 124 DCHECK(picture_pile); |
124 DCHECK(canvas_); | 125 DCHECK(canvas_); |
125 | 126 |
126 if (analyze_picture_) { | 127 if (analyze_picture_) { |
127 Analyze(picture_pile); | 128 Analyze(picture_pile); |
128 if (analysis_.is_solid_color) | 129 if (analysis_.is_solid_color) |
129 return; | 130 return; |
130 } | 131 } |
131 | 132 |
132 Raster(picture_pile); | 133 Raster(picture_pile); |
133 } | 134 } |
134 | 135 |
135 void Analyze(PicturePileImpl* picture_pile) { | 136 void Analyze(PicturePileImpl* picture_pile) { |
136 TRACE_EVENT1("cc", | 137 TRACE_EVENT1("cc", |
137 "RasterWorkerPoolTaskImpl::Analyze", | 138 "RasterTaskImpl::Analyze", |
138 "data", | 139 "data", |
139 TracedValue::FromValue(DataAsValue().release())); | 140 TracedValue::FromValue(DataAsValue().release())); |
140 | 141 |
141 DCHECK(picture_pile); | 142 DCHECK(picture_pile); |
142 | 143 |
143 picture_pile->AnalyzeInRect( | 144 picture_pile->AnalyzeInRect( |
144 content_rect_, contents_scale_, &analysis_, rendering_stats_); | 145 content_rect_, contents_scale_, &analysis_, rendering_stats_); |
145 | 146 |
146 // Record the solid color prediction. | 147 // Record the solid color prediction. |
147 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", | 148 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", |
148 analysis_.is_solid_color); | 149 analysis_.is_solid_color); |
149 | 150 |
150 // Clear the flag if we're not using the estimator. | 151 // Clear the flag if we're not using the estimator. |
151 analysis_.is_solid_color &= kUseColorEstimator; | 152 analysis_.is_solid_color &= kUseColorEstimator; |
152 } | 153 } |
153 | 154 |
154 void Raster(PicturePileImpl* picture_pile) { | 155 void Raster(PicturePileImpl* picture_pile) { |
155 TRACE_EVENT2( | 156 TRACE_EVENT2( |
156 "cc", | 157 "cc", |
157 "RasterWorkerPoolTaskImpl::Raster", | 158 "RasterTaskImpl::Raster", |
158 "data", | 159 "data", |
159 TracedValue::FromValue(DataAsValue().release()), | 160 TracedValue::FromValue(DataAsValue().release()), |
160 "raster_mode", | 161 "raster_mode", |
161 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); | 162 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); |
162 | 163 |
163 devtools_instrumentation::ScopedLayerTask raster_task( | 164 devtools_instrumentation::ScopedLayerTask raster_task( |
164 devtools_instrumentation::kRasterTask, layer_id_); | 165 devtools_instrumentation::kRasterTask, layer_id_); |
165 | 166 |
166 skia::RefPtr<SkDrawFilter> draw_filter; | 167 skia::RefPtr<SkDrawFilter> draw_filter; |
167 switch (raster_mode_) { | 168 switch (raster_mode_) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 RasterMode raster_mode_; | 212 RasterMode raster_mode_; |
212 TileResolution tile_resolution_; | 213 TileResolution tile_resolution_; |
213 int layer_id_; | 214 int layer_id_; |
214 const void* tile_id_; | 215 const void* tile_id_; |
215 int source_frame_number_; | 216 int source_frame_number_; |
216 bool analyze_picture_; | 217 bool analyze_picture_; |
217 RenderingStatsInstrumentation* rendering_stats_; | 218 RenderingStatsInstrumentation* rendering_stats_; |
218 const base::Callback<void(const PicturePileImpl::Analysis&, bool)> reply_; | 219 const base::Callback<void(const PicturePileImpl::Analysis&, bool)> reply_; |
219 SkCanvas* canvas_; | 220 SkCanvas* canvas_; |
220 | 221 |
221 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); | 222 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); |
222 }; | 223 }; |
223 | 224 |
224 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 225 class ImageDecodeTaskImpl : public internal::ImageDecodeTask { |
225 public: | 226 public: |
226 ImageDecodeWorkerPoolTaskImpl( | 227 ImageDecodeTaskImpl(SkPixelRef* pixel_ref, |
227 SkPixelRef* pixel_ref, | 228 int layer_id, |
228 int layer_id, | 229 RenderingStatsInstrumentation* rendering_stats, |
229 RenderingStatsInstrumentation* rendering_stats, | 230 const base::Callback<void(bool was_canceled)>& reply) |
230 const base::Callback<void(bool was_canceled)>& reply) | |
231 : pixel_ref_(skia::SharePtr(pixel_ref)), | 231 : pixel_ref_(skia::SharePtr(pixel_ref)), |
232 layer_id_(layer_id), | 232 layer_id_(layer_id), |
233 rendering_stats_(rendering_stats), | 233 rendering_stats_(rendering_stats), |
234 reply_(reply) {} | 234 reply_(reply) {} |
235 | 235 |
236 // Overridden from internal::Task: | 236 // Overridden from internal::Task: |
237 virtual void RunOnWorkerThread() OVERRIDE { | 237 virtual void RunOnWorkerThread() OVERRIDE { |
238 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); | 238 TRACE_EVENT0("cc", "ImageDecodeTaskImpl::RunOnWorkerThread"); |
239 Decode(); | 239 Decode(); |
240 } | 240 } |
241 | 241 |
242 // Overridden from internal::WorkerPoolTask: | 242 // Overridden from internal::RasterizerTask: |
243 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) | 243 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client) |
244 OVERRIDE {} | 244 OVERRIDE {} |
245 virtual void RunOnOriginThread() OVERRIDE { | 245 virtual void RunOnOriginThread() OVERRIDE { |
246 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnOriginThread"); | 246 TRACE_EVENT0("cc", "ImageDecodeTaskImpl::RunOnOriginThread"); |
247 Decode(); | 247 Decode(); |
248 } | 248 } |
249 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) | 249 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client) |
250 OVERRIDE {} | 250 OVERRIDE {} |
251 virtual void RunReplyOnOriginThread() OVERRIDE { | 251 virtual void RunReplyOnOriginThread() OVERRIDE { |
252 reply_.Run(!HasFinishedRunning()); | 252 reply_.Run(!HasFinishedRunning()); |
253 } | 253 } |
254 | 254 |
255 protected: | 255 protected: |
256 virtual ~ImageDecodeWorkerPoolTaskImpl() {} | 256 virtual ~ImageDecodeTaskImpl() {} |
257 | 257 |
258 private: | 258 private: |
259 void Decode() { | 259 void Decode() { |
260 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( | 260 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( |
261 pixel_ref_.get()); | 261 pixel_ref_.get()); |
262 // This will cause the image referred to by pixel ref to be decoded. | 262 // This will cause the image referred to by pixel ref to be decoded. |
263 pixel_ref_->lockPixels(); | 263 pixel_ref_->lockPixels(); |
264 pixel_ref_->unlockPixels(); | 264 pixel_ref_->unlockPixels(); |
265 } | 265 } |
266 | 266 |
267 skia::RefPtr<SkPixelRef> pixel_ref_; | 267 skia::RefPtr<SkPixelRef> pixel_ref_; |
268 int layer_id_; | 268 int layer_id_; |
269 RenderingStatsInstrumentation* rendering_stats_; | 269 RenderingStatsInstrumentation* rendering_stats_; |
270 const base::Callback<void(bool was_canceled)> reply_; | 270 const base::Callback<void(bool was_canceled)> reply_; |
271 | 271 |
272 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); | 272 DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl); |
273 }; | 273 }; |
274 | 274 |
275 const size_t kScheduledRasterTasksLimit = 32u; | 275 const size_t kScheduledRasterTasksLimit = 32u; |
276 | 276 |
277 // Memory limit policy works by mapping some bin states to the NEVER bin. | 277 // Memory limit policy works by mapping some bin states to the NEVER bin. |
278 const ManagedTileBin kBinPolicyMap[NUM_TILE_MEMORY_LIMIT_POLICIES][NUM_BINS] = { | 278 const ManagedTileBin kBinPolicyMap[NUM_TILE_MEMORY_LIMIT_POLICIES][NUM_BINS] = { |
279 // [ALLOW_NOTHING] | 279 // [ALLOW_NOTHING] |
280 {NEVER_BIN, // [NOW_AND_READY_TO_DRAW_BIN] | 280 {NEVER_BIN, // [NOW_AND_READY_TO_DRAW_BIN] |
281 NEVER_BIN, // [NOW_BIN] | 281 NEVER_BIN, // [NOW_BIN] |
282 NEVER_BIN, // [SOON_BIN] | 282 NEVER_BIN, // [SOON_BIN] |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 391 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
392 state->SetInteger("completed_count", stats.completed_count); | 392 state->SetInteger("completed_count", stats.completed_count); |
393 state->SetInteger("canceled_count", stats.canceled_count); | 393 state->SetInteger("canceled_count", stats.canceled_count); |
394 return state.PassAs<base::Value>(); | 394 return state.PassAs<base::Value>(); |
395 } | 395 } |
396 | 396 |
397 // static | 397 // static |
398 scoped_ptr<TileManager> TileManager::Create( | 398 scoped_ptr<TileManager> TileManager::Create( |
399 TileManagerClient* client, | 399 TileManagerClient* client, |
400 ResourceProvider* resource_provider, | 400 ResourceProvider* resource_provider, |
401 RasterWorkerPool* raster_worker_pool, | 401 Rasterizer* rasterizer, |
402 RasterWorkerPool* gpu_raster_worker_pool, | 402 Rasterizer* gpu_rasterizer, |
403 size_t max_raster_usage_bytes, | 403 size_t max_raster_usage_bytes, |
404 bool use_rasterize_on_demand, | 404 bool use_rasterize_on_demand, |
405 RenderingStatsInstrumentation* rendering_stats_instrumentation) { | 405 RenderingStatsInstrumentation* rendering_stats_instrumentation) { |
406 return make_scoped_ptr(new TileManager(client, | 406 return make_scoped_ptr(new TileManager(client, |
407 resource_provider, | 407 resource_provider, |
408 raster_worker_pool, | 408 rasterizer, |
409 gpu_raster_worker_pool, | 409 gpu_rasterizer, |
410 max_raster_usage_bytes, | 410 max_raster_usage_bytes, |
411 use_rasterize_on_demand, | 411 use_rasterize_on_demand, |
412 rendering_stats_instrumentation)); | 412 rendering_stats_instrumentation)); |
413 } | 413 } |
414 | 414 |
415 TileManager::TileManager( | 415 TileManager::TileManager( |
416 TileManagerClient* client, | 416 TileManagerClient* client, |
417 ResourceProvider* resource_provider, | 417 ResourceProvider* resource_provider, |
418 RasterWorkerPool* raster_worker_pool, | 418 Rasterizer* rasterizer, |
419 RasterWorkerPool* gpu_raster_worker_pool, | 419 Rasterizer* gpu_rasterizer, |
420 size_t max_raster_usage_bytes, | 420 size_t max_raster_usage_bytes, |
421 bool use_rasterize_on_demand, | 421 bool use_rasterize_on_demand, |
422 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 422 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
423 : client_(client), | 423 : client_(client), |
424 resource_pool_( | 424 resource_pool_(ResourcePool::Create(resource_provider, |
425 ResourcePool::Create(resource_provider, | 425 rasterizer->GetResourceTarget(), |
426 raster_worker_pool->GetResourceTarget(), | 426 rasterizer->GetResourceFormat())), |
427 raster_worker_pool->GetResourceFormat())), | |
428 prioritized_tiles_dirty_(false), | 427 prioritized_tiles_dirty_(false), |
429 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 428 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
430 all_tiles_required_for_activation_have_memory_(true), | 429 all_tiles_required_for_activation_have_memory_(true), |
431 memory_required_bytes_(0), | 430 memory_required_bytes_(0), |
432 memory_nice_to_have_bytes_(0), | 431 memory_nice_to_have_bytes_(0), |
433 bytes_releasable_(0), | 432 bytes_releasable_(0), |
434 resources_releasable_(0), | 433 resources_releasable_(0), |
435 max_raster_usage_bytes_(max_raster_usage_bytes), | 434 max_raster_usage_bytes_(max_raster_usage_bytes), |
436 ever_exceeded_memory_budget_(false), | 435 ever_exceeded_memory_budget_(false), |
437 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 436 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
438 did_initialize_visible_tile_(false), | 437 did_initialize_visible_tile_(false), |
439 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 438 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
440 use_rasterize_on_demand_(use_rasterize_on_demand), | 439 use_rasterize_on_demand_(use_rasterize_on_demand), |
441 resource_format_(raster_worker_pool->GetResourceFormat()) { | 440 resource_format_(rasterizer->GetResourceFormat()) { |
442 RasterWorkerPool* raster_worker_pools[NUM_RASTER_WORKER_POOL_TYPES] = { | 441 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = { |
443 raster_worker_pool, // RASTER_WORKER_POOL_TYPE_DEFAULT | 442 rasterizer, // RASTERIZER_TYPE_DEFAULT |
444 gpu_raster_worker_pool, // RASTER_WORKER_POOL_TYPE_GPU | 443 gpu_rasterizer, // RASTERIZER_TYPE_GPU |
445 }; | 444 }; |
446 raster_worker_pool_delegate_ = RasterWorkerPoolDelegate::Create( | 445 rasterizer_delegate_ = |
447 this, raster_worker_pools, arraysize(raster_worker_pools)); | 446 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers)); |
448 } | 447 } |
449 | 448 |
450 TileManager::~TileManager() { | 449 TileManager::~TileManager() { |
451 // Reset global state and manage. This should cause | 450 // Reset global state and manage. This should cause |
452 // our memory usage to drop to zero. | 451 // our memory usage to drop to zero. |
453 global_state_ = GlobalStateThatImpactsTilePriority(); | 452 global_state_ = GlobalStateThatImpactsTilePriority(); |
454 | 453 |
455 CleanUpReleasedTiles(); | 454 CleanUpReleasedTiles(); |
456 DCHECK_EQ(0u, tiles_.size()); | 455 DCHECK_EQ(0u, tiles_.size()); |
457 | 456 |
458 RasterTaskQueue empty[NUM_RASTER_WORKER_POOL_TYPES]; | 457 RasterTaskQueue empty[NUM_RASTERIZER_TYPES]; |
459 raster_worker_pool_delegate_->ScheduleTasks(empty); | 458 rasterizer_delegate_->ScheduleTasks(empty); |
460 orphan_raster_tasks_.clear(); | 459 orphan_raster_tasks_.clear(); |
461 | 460 |
462 // This should finish all pending tasks and release any uninitialized | 461 // This should finish all pending tasks and release any uninitialized |
463 // resources. | 462 // resources. |
464 raster_worker_pool_delegate_->Shutdown(); | 463 rasterizer_delegate_->Shutdown(); |
465 raster_worker_pool_delegate_->CheckForCompletedTasks(); | 464 rasterizer_delegate_->CheckForCompletedTasks(); |
466 | 465 |
467 DCHECK_EQ(0u, bytes_releasable_); | 466 DCHECK_EQ(0u, bytes_releasable_); |
468 DCHECK_EQ(0u, resources_releasable_); | 467 DCHECK_EQ(0u, resources_releasable_); |
469 | 468 |
470 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); | 469 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); |
471 it != layers_.end(); | 470 it != layers_.end(); |
472 ++it) { | 471 ++it) { |
473 (*it)->DidUnregisterLayer(); | 472 (*it)->DidUnregisterLayer(); |
474 } | 473 } |
475 layers_.clear(); | 474 layers_.clear(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 | 532 |
534 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > | 533 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > |
535 global_state_.soft_memory_limit_in_bytes; | 534 global_state_.soft_memory_limit_in_bytes; |
536 | 535 |
537 // When OOM, keep re-assigning memory until we reach a steady state | 536 // When OOM, keep re-assigning memory until we reach a steady state |
538 // where top-priority tiles are initialized. | 537 // where top-priority tiles are initialized. |
539 if (all_tiles_that_need_to_be_rasterized_have_memory_ && | 538 if (all_tiles_that_need_to_be_rasterized_have_memory_ && |
540 !memory_usage_above_limit) | 539 !memory_usage_above_limit) |
541 return; | 540 return; |
542 | 541 |
543 raster_worker_pool_delegate_->CheckForCompletedTasks(); | 542 rasterizer_delegate_->CheckForCompletedTasks(); |
544 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 543 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
545 | 544 |
546 TileVector tiles_that_need_to_be_rasterized; | 545 TileVector tiles_that_need_to_be_rasterized; |
547 AssignGpuMemoryToTiles(&prioritized_tiles_, | 546 AssignGpuMemoryToTiles(&prioritized_tiles_, |
548 &tiles_that_need_to_be_rasterized); | 547 &tiles_that_need_to_be_rasterized); |
549 | 548 |
550 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 549 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
551 // steady memory state. Keep scheduling tasks until we reach this state. | 550 // steady memory state. Keep scheduling tasks until we reach this state. |
552 if (!tiles_that_need_to_be_rasterized.empty()) { | 551 if (!tiles_that_need_to_be_rasterized.empty()) { |
553 ScheduleTasks(tiles_that_need_to_be_rasterized); | 552 ScheduleTasks(tiles_that_need_to_be_rasterized); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 // memory returns to soft limit after going over. | 727 // memory returns to soft limit after going over. |
729 resource_pool_->SetResourceUsageLimits( | 728 resource_pool_->SetResourceUsageLimits( |
730 global_state_.soft_memory_limit_in_bytes, | 729 global_state_.soft_memory_limit_in_bytes, |
731 global_state_.unused_memory_limit_in_bytes, | 730 global_state_.unused_memory_limit_in_bytes, |
732 global_state_.num_resources_limit); | 731 global_state_.num_resources_limit); |
733 } | 732 } |
734 | 733 |
735 // We need to call CheckForCompletedTasks() once in-between each call | 734 // We need to call CheckForCompletedTasks() once in-between each call |
736 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 735 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
737 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 736 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
738 raster_worker_pool_delegate_->CheckForCompletedTasks(); | 737 rasterizer_delegate_->CheckForCompletedTasks(); |
739 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 738 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
740 } | 739 } |
741 | 740 |
742 UpdatePrioritizedTileSetIfNeeded(); | 741 UpdatePrioritizedTileSetIfNeeded(); |
743 | 742 |
744 TileVector tiles_that_need_to_be_rasterized; | 743 TileVector tiles_that_need_to_be_rasterized; |
745 AssignGpuMemoryToTiles(&prioritized_tiles_, | 744 AssignGpuMemoryToTiles(&prioritized_tiles_, |
746 &tiles_that_need_to_be_rasterized); | 745 &tiles_that_need_to_be_rasterized); |
747 | 746 |
748 // Finally, schedule rasterizer tasks. | 747 // Finally, schedule rasterizer tasks. |
749 ScheduleTasks(tiles_that_need_to_be_rasterized); | 748 ScheduleTasks(tiles_that_need_to_be_rasterized); |
750 | 749 |
751 TRACE_EVENT_INSTANT1("cc", | 750 TRACE_EVENT_INSTANT1("cc", |
752 "DidManage", | 751 "DidManage", |
753 TRACE_EVENT_SCOPE_THREAD, | 752 TRACE_EVENT_SCOPE_THREAD, |
754 "state", | 753 "state", |
755 TracedValue::FromValue(BasicStateAsValue().release())); | 754 TracedValue::FromValue(BasicStateAsValue().release())); |
756 | 755 |
757 TRACE_COUNTER_ID1("cc", | 756 TRACE_COUNTER_ID1("cc", |
758 "unused_memory_bytes", | 757 "unused_memory_bytes", |
759 this, | 758 this, |
760 resource_pool_->total_memory_usage_bytes() - | 759 resource_pool_->total_memory_usage_bytes() - |
761 resource_pool_->acquired_memory_usage_bytes()); | 760 resource_pool_->acquired_memory_usage_bytes()); |
762 } | 761 } |
763 | 762 |
764 bool TileManager::UpdateVisibleTiles() { | 763 bool TileManager::UpdateVisibleTiles() { |
765 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 764 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
766 | 765 |
767 raster_worker_pool_delegate_->CheckForCompletedTasks(); | 766 rasterizer_delegate_->CheckForCompletedTasks(); |
768 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 767 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
769 | 768 |
770 TRACE_EVENT_INSTANT1( | 769 TRACE_EVENT_INSTANT1( |
771 "cc", | 770 "cc", |
772 "DidUpdateVisibleTiles", | 771 "DidUpdateVisibleTiles", |
773 TRACE_EVENT_SCOPE_THREAD, | 772 TRACE_EVENT_SCOPE_THREAD, |
774 "stats", | 773 "stats", |
775 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( | 774 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( |
776 update_visible_tiles_stats_).release())); | 775 update_visible_tiles_stats_).release())); |
777 update_visible_tiles_stats_ = RasterTaskCompletionStats(); | 776 update_visible_tiles_stats_ = RasterTaskCompletionStats(); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 | 1042 |
1044 void TileManager::ScheduleTasks( | 1043 void TileManager::ScheduleTasks( |
1045 const TileVector& tiles_that_need_to_be_rasterized) { | 1044 const TileVector& tiles_that_need_to_be_rasterized) { |
1046 TRACE_EVENT1("cc", | 1045 TRACE_EVENT1("cc", |
1047 "TileManager::ScheduleTasks", | 1046 "TileManager::ScheduleTasks", |
1048 "count", | 1047 "count", |
1049 tiles_that_need_to_be_rasterized.size()); | 1048 tiles_that_need_to_be_rasterized.size()); |
1050 | 1049 |
1051 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 1050 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
1052 | 1051 |
1053 for (size_t i = 0; i < NUM_RASTER_WORKER_POOL_TYPES; ++i) | 1052 for (size_t i = 0; i < NUM_RASTERIZER_TYPES; ++i) |
1054 raster_queue_[i].Reset(); | 1053 raster_queue_[i].Reset(); |
1055 | 1054 |
1056 // Build a new task queue containing all task currently needed. Tasks | 1055 // Build a new task queue containing all task currently needed. Tasks |
1057 // are added in order of priority, highest priority task first. | 1056 // are added in order of priority, highest priority task first. |
1058 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 1057 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
1059 it != tiles_that_need_to_be_rasterized.end(); | 1058 it != tiles_that_need_to_be_rasterized.end(); |
1060 ++it) { | 1059 ++it) { |
1061 Tile* tile = *it; | 1060 Tile* tile = *it; |
1062 ManagedTileState& mts = tile->managed_state(); | 1061 ManagedTileState& mts = tile->managed_state(); |
1063 ManagedTileState::TileVersion& tile_version = | 1062 ManagedTileState::TileVersion& tile_version = |
1064 mts.tile_versions[mts.raster_mode]; | 1063 mts.tile_versions[mts.raster_mode]; |
1065 | 1064 |
1066 DCHECK(tile_version.requires_resource()); | 1065 DCHECK(tile_version.requires_resource()); |
1067 DCHECK(!tile_version.resource_); | 1066 DCHECK(!tile_version.resource_); |
1068 | 1067 |
1069 if (!tile_version.raster_task_) | 1068 if (!tile_version.raster_task_) |
1070 tile_version.raster_task_ = CreateRasterTask(tile); | 1069 tile_version.raster_task_ = CreateRasterTask(tile); |
1071 | 1070 |
1072 size_t pool_type = tile->use_gpu_rasterization() | 1071 size_t pool_type = tile->use_gpu_rasterization() ? RASTERIZER_TYPE_GPU |
1073 ? RASTER_WORKER_POOL_TYPE_GPU | 1072 : RASTERIZER_TYPE_DEFAULT; |
1074 : RASTER_WORKER_POOL_TYPE_DEFAULT; | |
1075 | 1073 |
1076 raster_queue_[pool_type].items.push_back(RasterTaskQueue::Item( | 1074 raster_queue_[pool_type].items.push_back(RasterTaskQueue::Item( |
1077 tile_version.raster_task_.get(), tile->required_for_activation())); | 1075 tile_version.raster_task_.get(), tile->required_for_activation())); |
1078 raster_queue_[pool_type].required_for_activation_count += | 1076 raster_queue_[pool_type].required_for_activation_count += |
1079 tile->required_for_activation(); | 1077 tile->required_for_activation(); |
1080 } | 1078 } |
1081 | 1079 |
1082 // We must reduce the amount of unused resoruces before calling | 1080 // We must reduce the amount of unused resoruces before calling |
1083 // ScheduleTasks to prevent usage from rising above limits. | 1081 // ScheduleTasks to prevent usage from rising above limits. |
1084 resource_pool_->ReduceResourceUsage(); | 1082 resource_pool_->ReduceResourceUsage(); |
1085 | 1083 |
1086 // Schedule running of |raster_tasks_|. This replaces any previously | 1084 // Schedule running of |raster_tasks_|. This replaces any previously |
1087 // scheduled tasks and effectively cancels all tasks not present | 1085 // scheduled tasks and effectively cancels all tasks not present |
1088 // in |raster_tasks_|. | 1086 // in |raster_tasks_|. |
1089 raster_worker_pool_delegate_->ScheduleTasks(raster_queue_); | 1087 rasterizer_delegate_->ScheduleTasks(raster_queue_); |
1090 | 1088 |
1091 // It's now safe to clean up orphan tasks as raster worker pool is not | 1089 // It's now safe to clean up orphan tasks as raster worker pool is not |
1092 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has | 1090 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has |
1093 // been called. | 1091 // been called. |
1094 orphan_raster_tasks_.clear(); | 1092 orphan_raster_tasks_.clear(); |
1095 | 1093 |
1096 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 1094 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
1097 } | 1095 } |
1098 | 1096 |
1099 scoped_refptr<internal::WorkerPoolTask> TileManager::CreateImageDecodeTask( | 1097 scoped_refptr<internal::ImageDecodeTask> TileManager::CreateImageDecodeTask( |
1100 Tile* tile, | 1098 Tile* tile, |
1101 SkPixelRef* pixel_ref) { | 1099 SkPixelRef* pixel_ref) { |
1102 return make_scoped_refptr(new ImageDecodeWorkerPoolTaskImpl( | 1100 return make_scoped_refptr(new ImageDecodeTaskImpl( |
1103 pixel_ref, | 1101 pixel_ref, |
1104 tile->layer_id(), | 1102 tile->layer_id(), |
1105 rendering_stats_instrumentation_, | 1103 rendering_stats_instrumentation_, |
1106 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 1104 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
1107 base::Unretained(this), | 1105 base::Unretained(this), |
1108 tile->layer_id(), | 1106 tile->layer_id(), |
1109 base::Unretained(pixel_ref)))); | 1107 base::Unretained(pixel_ref)))); |
1110 } | 1108 } |
1111 | 1109 |
1112 scoped_refptr<internal::RasterWorkerPoolTask> TileManager::CreateRasterTask( | 1110 scoped_refptr<internal::RasterTask> TileManager::CreateRasterTask(Tile* tile) { |
1113 Tile* tile) { | |
1114 ManagedTileState& mts = tile->managed_state(); | 1111 ManagedTileState& mts = tile->managed_state(); |
1115 | 1112 |
1116 scoped_ptr<ScopedResource> resource = | 1113 scoped_ptr<ScopedResource> resource = |
1117 resource_pool_->AcquireResource(tile->tile_size_.size()); | 1114 resource_pool_->AcquireResource(tile->tile_size_.size()); |
1118 const ScopedResource* const_resource = resource.get(); | 1115 const ScopedResource* const_resource = resource.get(); |
1119 | 1116 |
1120 // Create and queue all image decode tasks that this tile depends on. | 1117 // Create and queue all image decode tasks that this tile depends on. |
1121 internal::WorkerPoolTask::Vector decode_tasks; | 1118 internal::ImageDecodeTask::Vector decode_tasks; |
1122 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; | 1119 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; |
1123 for (PicturePileImpl::PixelRefIterator iter( | 1120 for (PicturePileImpl::PixelRefIterator iter( |
1124 tile->content_rect(), tile->contents_scale(), tile->picture_pile()); | 1121 tile->content_rect(), tile->contents_scale(), tile->picture_pile()); |
1125 iter; | 1122 iter; |
1126 ++iter) { | 1123 ++iter) { |
1127 SkPixelRef* pixel_ref = *iter; | 1124 SkPixelRef* pixel_ref = *iter; |
1128 uint32_t id = pixel_ref->getGenerationID(); | 1125 uint32_t id = pixel_ref->getGenerationID(); |
1129 | 1126 |
1130 // Append existing image decode task if available. | 1127 // Append existing image decode task if available. |
1131 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); | 1128 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); |
1132 if (decode_task_it != existing_pixel_refs.end()) { | 1129 if (decode_task_it != existing_pixel_refs.end()) { |
1133 decode_tasks.push_back(decode_task_it->second); | 1130 decode_tasks.push_back(decode_task_it->second); |
1134 continue; | 1131 continue; |
1135 } | 1132 } |
1136 | 1133 |
1137 // Create and append new image decode task for this pixel ref. | 1134 // Create and append new image decode task for this pixel ref. |
1138 scoped_refptr<internal::WorkerPoolTask> decode_task = | 1135 scoped_refptr<internal::ImageDecodeTask> decode_task = |
1139 CreateImageDecodeTask(tile, pixel_ref); | 1136 CreateImageDecodeTask(tile, pixel_ref); |
1140 decode_tasks.push_back(decode_task); | 1137 decode_tasks.push_back(decode_task); |
1141 existing_pixel_refs[id] = decode_task; | 1138 existing_pixel_refs[id] = decode_task; |
1142 } | 1139 } |
1143 | 1140 |
1144 // We analyze picture before rasterization to detect solid-color tiles. | 1141 // We analyze picture before rasterization to detect solid-color tiles. |
1145 // If the tile is detected as such there is no need to raster or upload. | 1142 // If the tile is detected as such there is no need to raster or upload. |
1146 // It is drawn directly as a solid-color quad saving raster and upload cost. | 1143 // It is drawn directly as a solid-color quad saving raster and upload cost. |
1147 // The analysis step is however expensive and is not justified when doing | 1144 // The analysis step is however expensive and is not justified when doing |
1148 // gpu rasterization where there is no upload. | 1145 // gpu rasterization where there is no upload. |
1149 // | 1146 // |
1150 // Additionally, we do not want to do the analysis if the layer that produced | 1147 // Additionally, we do not want to do the analysis if the layer that produced |
1151 // this tile is narrow, since more likely than not the tile would not be | 1148 // this tile is narrow, since more likely than not the tile would not be |
1152 // solid. We use the picture pile size as a proxy for layer size, since it | 1149 // solid. We use the picture pile size as a proxy for layer size, since it |
1153 // represents the recorded (and thus rasterizable) content. | 1150 // represents the recorded (and thus rasterizable) content. |
1154 // Note that this last optimization is a heuristic that ensures that we don't | 1151 // Note that this last optimization is a heuristic that ensures that we don't |
1155 // spend too much time analyzing tiles on a multitude of small layers, as it | 1152 // spend too much time analyzing tiles on a multitude of small layers, as it |
1156 // is likely that these layers have some non-solid content. | 1153 // is likely that these layers have some non-solid content. |
1157 gfx::Size pile_size = tile->picture_pile()->size(); | 1154 gfx::Size pile_size = tile->picture_pile()->size(); |
1158 bool analyze_picture = !tile->use_gpu_rasterization() && | 1155 bool analyze_picture = !tile->use_gpu_rasterization() && |
1159 std::min(pile_size.width(), pile_size.height()) >= | 1156 std::min(pile_size.width(), pile_size.height()) >= |
1160 kMinDimensionsForAnalysis; | 1157 kMinDimensionsForAnalysis; |
1161 | 1158 |
1162 return make_scoped_refptr(new RasterWorkerPoolTaskImpl( | 1159 return make_scoped_refptr( |
1163 const_resource, | 1160 new RasterTaskImpl(const_resource, |
1164 tile->picture_pile(), | 1161 tile->picture_pile(), |
1165 tile->content_rect(), | 1162 tile->content_rect(), |
1166 tile->contents_scale(), | 1163 tile->contents_scale(), |
1167 mts.raster_mode, | 1164 mts.raster_mode, |
1168 mts.resolution, | 1165 mts.resolution, |
1169 tile->layer_id(), | 1166 tile->layer_id(), |
1170 static_cast<const void*>(tile), | 1167 static_cast<const void*>(tile), |
1171 tile->source_frame_number(), | 1168 tile->source_frame_number(), |
1172 analyze_picture, | 1169 analyze_picture, |
1173 rendering_stats_instrumentation_, | 1170 rendering_stats_instrumentation_, |
1174 base::Bind(&TileManager::OnRasterTaskCompleted, | 1171 base::Bind(&TileManager::OnRasterTaskCompleted, |
1175 base::Unretained(this), | 1172 base::Unretained(this), |
1176 tile->id(), | 1173 tile->id(), |
1177 base::Passed(&resource), | 1174 base::Passed(&resource), |
1178 mts.raster_mode), | 1175 mts.raster_mode), |
1179 &decode_tasks)); | 1176 &decode_tasks)); |
1180 } | 1177 } |
1181 | 1178 |
1182 void TileManager::OnImageDecodeTaskCompleted(int layer_id, | 1179 void TileManager::OnImageDecodeTaskCompleted(int layer_id, |
1183 SkPixelRef* pixel_ref, | 1180 SkPixelRef* pixel_ref, |
1184 bool was_canceled) { | 1181 bool was_canceled) { |
1185 // If the task was canceled, we need to clean it up | 1182 // If the task was canceled, we need to clean it up |
1186 // from |image_decode_tasks_|. | 1183 // from |image_decode_tasks_|. |
1187 if (!was_canceled) | 1184 if (!was_canceled) |
1188 return; | 1185 return; |
1189 | 1186 |
1190 LayerPixelRefTaskMap::iterator layer_it = image_decode_tasks_.find(layer_id); | 1187 LayerPixelRefTaskMap::iterator layer_it = image_decode_tasks_.find(layer_id); |
1191 | |
1192 if (layer_it == image_decode_tasks_.end()) | 1188 if (layer_it == image_decode_tasks_.end()) |
1193 return; | 1189 return; |
1194 | 1190 |
1195 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; | 1191 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; |
1196 PixelRefTaskMap::iterator task_it = | 1192 PixelRefTaskMap::iterator task_it = |
1197 pixel_ref_tasks.find(pixel_ref->getGenerationID()); | 1193 pixel_ref_tasks.find(pixel_ref->getGenerationID()); |
1198 | 1194 |
1199 if (task_it != pixel_ref_tasks.end()) | 1195 if (task_it != pixel_ref_tasks.end()) |
1200 pixel_ref_tasks.erase(task_it); | 1196 pixel_ref_tasks.erase(task_it); |
1201 } | 1197 } |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 b_tile->priority(b_pair.second), | 1516 b_tile->priority(b_pair.second), |
1521 false /* prioritize low res */); | 1517 false /* prioritize low res */); |
1522 } | 1518 } |
1523 | 1519 |
1524 NOTREACHED(); | 1520 NOTREACHED(); |
1525 // Keep the compiler happy. | 1521 // Keep the compiler happy. |
1526 return false; | 1522 return false; |
1527 } | 1523 } |
1528 | 1524 |
1529 } // namespace cc | 1525 } // namespace cc |
OLD | NEW |