Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: cc/resources/tile_manager.cc

Issue 228173002: cc: Separate RasterWorkerPool interface from implementation details. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/test/fake_tile_manager.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/test/fake_tile_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698