| 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/tiles/tile_manager.h" | 5 #include "cc/tiles/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 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 class RasterTaskImpl : public RasterTask { | 39 class RasterTaskImpl : public RasterTask { |
| 40 public: | 40 public: |
| 41 RasterTaskImpl( | 41 RasterTaskImpl( |
| 42 const Resource* resource, | 42 const Resource* resource, |
| 43 RasterSource* raster_source, | 43 RasterSource* raster_source, |
| 44 const gfx::Rect& content_rect, | 44 const gfx::Rect& content_rect, |
| 45 const gfx::Rect& invalid_content_rect, | 45 const gfx::Rect& invalid_content_rect, |
| 46 float contents_scale, | 46 float contents_scale, |
| 47 TileResolution tile_resolution, | 47 TileResolution tile_resolution, |
| 48 int layer_id, | 48 int layer_id, |
| 49 uint64_t source_prepare_tiles_id, |
| 49 const void* tile, | 50 const void* tile, |
| 50 uint64_t new_content_id, | 51 uint64_t new_content_id, |
| 51 uint64_t previous_content_id, | 52 uint64_t previous_content_id, |
| 52 uint64_t resource_content_id, | 53 uint64_t resource_content_id, |
| 53 int source_frame_number, | 54 int source_frame_number, |
| 54 bool analyze_picture, | 55 bool analyze_picture, |
| 55 const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)>& | 56 const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)>& |
| 56 reply, | 57 reply, |
| 57 ImageDecodeTask::Vector* dependencies) | 58 ImageDecodeTask::Vector* dependencies) |
| 58 : RasterTask(resource, dependencies), | 59 : RasterTask(resource, dependencies), |
| 59 raster_source_(raster_source), | 60 raster_source_(raster_source), |
| 60 content_rect_(content_rect), | 61 content_rect_(content_rect), |
| 61 invalid_content_rect_(invalid_content_rect), | 62 invalid_content_rect_(invalid_content_rect), |
| 62 contents_scale_(contents_scale), | 63 contents_scale_(contents_scale), |
| 63 tile_resolution_(tile_resolution), | 64 tile_resolution_(tile_resolution), |
| 64 layer_id_(layer_id), | 65 layer_id_(layer_id), |
| 66 source_prepare_tiles_id_(source_prepare_tiles_id), |
| 65 tile_(tile), | 67 tile_(tile), |
| 66 new_content_id_(new_content_id), | 68 new_content_id_(new_content_id), |
| 67 previous_content_id_(previous_content_id), | 69 previous_content_id_(previous_content_id), |
| 68 resource_content_id_(resource_content_id), | 70 resource_content_id_(resource_content_id), |
| 69 source_frame_number_(source_frame_number), | 71 source_frame_number_(source_frame_number), |
| 70 analyze_picture_(analyze_picture), | 72 analyze_picture_(analyze_picture), |
| 71 reply_(reply) {} | 73 reply_(reply) {} |
| 72 | 74 |
| 73 // Overridden from Task: | 75 // Overridden from Task: |
| 74 void RunOnWorkerThread() override { | 76 void RunOnWorkerThread() override { |
| 75 TRACE_EVENT0("cc", "RasterizerTaskImpl::RunOnWorkerThread"); | 77 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", |
| 78 "source_prepare_tiles_id", source_prepare_tiles_id_); |
| 76 | 79 |
| 77 DCHECK(raster_source_.get()); | 80 DCHECK(raster_source_.get()); |
| 78 DCHECK(raster_buffer_); | 81 DCHECK(raster_buffer_); |
| 79 | 82 |
| 80 if (analyze_picture_) { | 83 if (analyze_picture_) { |
| 81 Analyze(raster_source_.get()); | 84 Analyze(raster_source_.get()); |
| 82 if (analysis_.is_solid_color) | 85 if (analysis_.is_solid_color) |
| 83 return; | 86 return; |
| 84 } | 87 } |
| 85 | 88 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 contents_scale_); | 132 contents_scale_); |
| 130 } | 133 } |
| 131 | 134 |
| 132 RasterSource::SolidColorAnalysis analysis_; | 135 RasterSource::SolidColorAnalysis analysis_; |
| 133 scoped_refptr<RasterSource> raster_source_; | 136 scoped_refptr<RasterSource> raster_source_; |
| 134 gfx::Rect content_rect_; | 137 gfx::Rect content_rect_; |
| 135 gfx::Rect invalid_content_rect_; | 138 gfx::Rect invalid_content_rect_; |
| 136 float contents_scale_; | 139 float contents_scale_; |
| 137 TileResolution tile_resolution_; | 140 TileResolution tile_resolution_; |
| 138 int layer_id_; | 141 int layer_id_; |
| 142 uint64_t source_prepare_tiles_id_; |
| 139 const void* tile_; | 143 const void* tile_; |
| 140 uint64_t new_content_id_; | 144 uint64_t new_content_id_; |
| 141 uint64_t previous_content_id_; | 145 uint64_t previous_content_id_; |
| 142 uint64_t resource_content_id_; | 146 uint64_t resource_content_id_; |
| 143 int source_frame_number_; | 147 int source_frame_number_; |
| 144 bool analyze_picture_; | 148 bool analyze_picture_; |
| 145 const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)> | 149 const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)> |
| 146 reply_; | 150 reply_; |
| 147 scoped_ptr<RasterBuffer> raster_buffer_; | 151 scoped_ptr<RasterBuffer> raster_buffer_; |
| 148 | 152 |
| 149 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); | 153 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); |
| 150 }; | 154 }; |
| 151 | 155 |
| 152 class ImageDecodeTaskImpl : public ImageDecodeTask { | 156 class ImageDecodeTaskImpl : public ImageDecodeTask { |
| 153 public: | 157 public: |
| 154 ImageDecodeTaskImpl(SkPixelRef* pixel_ref, | 158 ImageDecodeTaskImpl(SkPixelRef* pixel_ref, |
| 159 uint64_t source_prepare_tiles_id, |
| 155 const base::Callback<void(bool was_canceled)>& reply) | 160 const base::Callback<void(bool was_canceled)>& reply) |
| 156 : pixel_ref_(skia::SharePtr(pixel_ref)), | 161 : pixel_ref_(skia::SharePtr(pixel_ref)), |
| 162 source_prepare_tiles_id_(source_prepare_tiles_id), |
| 157 reply_(reply) {} | 163 reply_(reply) {} |
| 158 | 164 |
| 159 // Overridden from Task: | 165 // Overridden from Task: |
| 160 void RunOnWorkerThread() override { | 166 void RunOnWorkerThread() override { |
| 161 TRACE_EVENT0("cc", "ImageDecodeTaskImpl::RunOnWorkerThread"); | 167 TRACE_EVENT1("cc", "ImageDecodeTaskImpl::RunOnWorkerThread", |
| 168 "source_prepare_tiles_id", source_prepare_tiles_id_); |
| 162 | 169 |
| 163 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( | 170 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( |
| 164 pixel_ref_.get()); | 171 pixel_ref_.get()); |
| 165 // This will cause the image referred to by pixel ref to be decoded. | 172 // This will cause the image referred to by pixel ref to be decoded. |
| 166 pixel_ref_->lockPixels(); | 173 pixel_ref_->lockPixels(); |
| 167 pixel_ref_->unlockPixels(); | 174 pixel_ref_->unlockPixels(); |
| 168 | 175 |
| 169 // Release the reference after decoding image to ensure that it is not | 176 // Release the reference after decoding image to ensure that it is not |
| 170 // kept alive unless needed. | 177 // kept alive unless needed. |
| 171 pixel_ref_.clear(); | 178 pixel_ref_.clear(); |
| 172 } | 179 } |
| 173 | 180 |
| 174 // Overridden from TileTask: | 181 // Overridden from TileTask: |
| 175 void ScheduleOnOriginThread(TileTaskClient* client) override {} | 182 void ScheduleOnOriginThread(TileTaskClient* client) override {} |
| 176 void CompleteOnOriginThread(TileTaskClient* client) override {} | 183 void CompleteOnOriginThread(TileTaskClient* client) override {} |
| 177 void RunReplyOnOriginThread() override { reply_.Run(!HasFinishedRunning()); } | 184 void RunReplyOnOriginThread() override { reply_.Run(!HasFinishedRunning()); } |
| 178 | 185 |
| 179 protected: | 186 protected: |
| 180 ~ImageDecodeTaskImpl() override {} | 187 ~ImageDecodeTaskImpl() override {} |
| 181 | 188 |
| 182 private: | 189 private: |
| 183 skia::RefPtr<SkPixelRef> pixel_ref_; | 190 skia::RefPtr<SkPixelRef> pixel_ref_; |
| 191 uint64_t source_prepare_tiles_id_; |
| 184 const base::Callback<void(bool was_canceled)> reply_; | 192 const base::Callback<void(bool was_canceled)> reply_; |
| 185 | 193 |
| 186 DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl); | 194 DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl); |
| 187 }; | 195 }; |
| 188 | 196 |
| 189 const char* TaskSetName(TaskSet task_set) { | 197 const char* TaskSetName(TaskSet task_set) { |
| 190 switch (task_set) { | 198 switch (task_set) { |
| 191 case TileManager::ALL: | 199 case TileManager::ALL: |
| 192 return "ALL"; | 200 return "ALL"; |
| 193 case TileManager::REQUIRED_FOR_ACTIVATION: | 201 case TileManager::REQUIRED_FOR_ACTIVATION: |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 task_runner_.get(), | 261 task_runner_.get(), |
| 254 base::Bind(&TileManager::CheckIfAllTileTasksCompleted, | 262 base::Bind(&TileManager::CheckIfAllTileTasksCompleted, |
| 255 base::Unretained(this))), | 263 base::Unretained(this))), |
| 256 more_tiles_need_prepare_check_notifier_( | 264 more_tiles_need_prepare_check_notifier_( |
| 257 task_runner_.get(), | 265 task_runner_.get(), |
| 258 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, | 266 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
| 259 base::Unretained(this))), | 267 base::Unretained(this))), |
| 260 did_notify_ready_to_activate_(false), | 268 did_notify_ready_to_activate_(false), |
| 261 did_notify_ready_to_draw_(false), | 269 did_notify_ready_to_draw_(false), |
| 262 did_notify_all_tile_tasks_completed_(false), | 270 did_notify_all_tile_tasks_completed_(false), |
| 263 has_scheduled_tile_tasks_(false) { | 271 has_scheduled_tile_tasks_(false), |
| 272 prepare_tiles_count_(0u) { |
| 264 tile_task_runner_->SetClient(this); | 273 tile_task_runner_->SetClient(this); |
| 265 } | 274 } |
| 266 | 275 |
| 267 TileManager::~TileManager() { | 276 TileManager::~TileManager() { |
| 268 // Reset global state and manage. This should cause | 277 // Reset global state and manage. This should cause |
| 269 // our memory usage to drop to zero. | 278 // our memory usage to drop to zero. |
| 270 global_state_ = GlobalStateThatImpactsTilePriority(); | 279 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 271 | 280 |
| 272 TileTaskQueue empty; | 281 TileTaskQueue empty; |
| 273 tile_task_runner_->ScheduleTasks(&empty); | 282 tile_task_runner_->ScheduleTasks(&empty); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 case REQUIRED_FOR_DRAW: | 362 case REQUIRED_FOR_DRAW: |
| 354 ready_to_draw_check_notifier_.Schedule(); | 363 ready_to_draw_check_notifier_.Schedule(); |
| 355 return; | 364 return; |
| 356 } | 365 } |
| 357 | 366 |
| 358 NOTREACHED(); | 367 NOTREACHED(); |
| 359 } | 368 } |
| 360 | 369 |
| 361 void TileManager::PrepareTiles( | 370 void TileManager::PrepareTiles( |
| 362 const GlobalStateThatImpactsTilePriority& state) { | 371 const GlobalStateThatImpactsTilePriority& state) { |
| 363 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); | 372 ++prepare_tiles_count_; |
| 373 |
| 374 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", |
| 375 prepare_tiles_count_); |
| 364 | 376 |
| 365 global_state_ = state; | 377 global_state_ = state; |
| 366 | 378 |
| 367 // We need to call CheckForCompletedTasks() once in-between each call | 379 // We need to call CheckForCompletedTasks() once in-between each call |
| 368 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 380 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 369 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 381 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 370 tile_task_runner_->CheckForCompletedTasks(); | 382 tile_task_runner_->CheckForCompletedTasks(); |
| 371 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 383 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 372 } | 384 } |
| 373 | 385 |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 // been called. | 691 // been called. |
| 680 orphan_raster_tasks_.clear(); | 692 orphan_raster_tasks_.clear(); |
| 681 | 693 |
| 682 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 694 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| 683 } | 695 } |
| 684 | 696 |
| 685 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( | 697 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( |
| 686 Tile* tile, | 698 Tile* tile, |
| 687 SkPixelRef* pixel_ref) { | 699 SkPixelRef* pixel_ref) { |
| 688 return make_scoped_refptr(new ImageDecodeTaskImpl( | 700 return make_scoped_refptr(new ImageDecodeTaskImpl( |
| 689 pixel_ref, | 701 pixel_ref, prepare_tiles_count_, |
| 690 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 702 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
| 691 base::Unretained(this), | 703 base::Unretained(this), tile->layer_id(), |
| 692 tile->layer_id(), | |
| 693 base::Unretained(pixel_ref)))); | 704 base::Unretained(pixel_ref)))); |
| 694 } | 705 } |
| 695 | 706 |
| 696 scoped_refptr<RasterTask> TileManager::CreateRasterTask( | 707 scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
| 697 const PrioritizedTile& prioritized_tile) { | 708 const PrioritizedTile& prioritized_tile) { |
| 698 Tile* tile = prioritized_tile.tile(); | 709 Tile* tile = prioritized_tile.tile(); |
| 699 uint64_t resource_content_id = 0; | 710 uint64_t resource_content_id = 0; |
| 700 scoped_ptr<ScopedResource> resource; | 711 scoped_ptr<ScopedResource> resource; |
| 701 if (tile->invalidated_id()) { | 712 if (tile->invalidated_id()) { |
| 702 // TODO(danakj): For resources that are in use, we should still grab them | 713 // TODO(danakj): For resources that are in use, we should still grab them |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 scoped_refptr<ImageDecodeTask> decode_task = | 746 scoped_refptr<ImageDecodeTask> decode_task = |
| 736 CreateImageDecodeTask(tile, pixel_ref); | 747 CreateImageDecodeTask(tile, pixel_ref); |
| 737 decode_tasks.push_back(decode_task); | 748 decode_tasks.push_back(decode_task); |
| 738 existing_pixel_refs[id] = decode_task; | 749 existing_pixel_refs[id] = decode_task; |
| 739 } | 750 } |
| 740 | 751 |
| 741 return make_scoped_refptr(new RasterTaskImpl( | 752 return make_scoped_refptr(new RasterTaskImpl( |
| 742 const_resource, prioritized_tile.raster_source(), tile->content_rect(), | 753 const_resource, prioritized_tile.raster_source(), tile->content_rect(), |
| 743 tile->invalidated_content_rect(), tile->contents_scale(), | 754 tile->invalidated_content_rect(), tile->contents_scale(), |
| 744 prioritized_tile.priority().resolution, tile->layer_id(), | 755 prioritized_tile.priority().resolution, tile->layer_id(), |
| 745 static_cast<const void*>(tile), tile->id(), tile->invalidated_id(), | 756 prepare_tiles_count_, static_cast<const void*>(tile), tile->id(), |
| 746 resource_content_id, tile->source_frame_number(), | 757 tile->invalidated_id(), resource_content_id, tile->source_frame_number(), |
| 747 tile->use_picture_analysis(), | 758 tile->use_picture_analysis(), |
| 748 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this), | 759 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this), |
| 749 tile->id(), base::Passed(&resource)), | 760 tile->id(), base::Passed(&resource)), |
| 750 &decode_tasks)); | 761 &decode_tasks)); |
| 751 } | 762 } |
| 752 | 763 |
| 753 void TileManager::OnImageDecodeTaskCompleted(int layer_id, | 764 void TileManager::OnImageDecodeTaskCompleted(int layer_id, |
| 754 SkPixelRef* pixel_ref, | 765 SkPixelRef* pixel_ref, |
| 755 bool was_canceled) { | 766 bool was_canceled) { |
| 756 // If the task was canceled, we need to clean it up | 767 // If the task was canceled, we need to clean it up |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1060 result -= other; | 1071 result -= other; |
| 1061 return result; | 1072 return result; |
| 1062 } | 1073 } |
| 1063 | 1074 |
| 1064 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1075 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
| 1065 return memory_bytes_ > limit.memory_bytes_ || | 1076 return memory_bytes_ > limit.memory_bytes_ || |
| 1066 resource_count_ > limit.resource_count_; | 1077 resource_count_ > limit.resource_count_; |
| 1067 } | 1078 } |
| 1068 | 1079 |
| 1069 } // namespace cc | 1080 } // namespace cc |
| OLD | NEW |