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 <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 25 matching lines...) Expand all Loading... |
36 // a tile is of solid color. | 36 // a tile is of solid color. |
37 const bool kUseColorEstimator = true; | 37 const bool kUseColorEstimator = true; |
38 | 38 |
39 DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( | 39 DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( |
40 ScopedRasterTaskTimer, | 40 ScopedRasterTaskTimer, |
41 "Compositing.%s.RasterTask.RasterUs", | 41 "Compositing.%s.RasterTask.RasterUs", |
42 "Compositing.%s.RasterTask.RasterPixelsPerMs"); | 42 "Compositing.%s.RasterTask.RasterPixelsPerMs"); |
43 | 43 |
44 class RasterTaskImpl : public TileTask { | 44 class RasterTaskImpl : public TileTask { |
45 public: | 45 public: |
46 RasterTaskImpl(const Resource* resource, | 46 RasterTaskImpl(Resource* resource, |
47 scoped_refptr<RasterSource> raster_source, | 47 scoped_refptr<RasterSource> raster_source, |
48 const gfx::Rect& content_rect, | 48 const gfx::Rect& content_rect, |
49 const gfx::Rect& invalid_content_rect, | 49 const gfx::Rect& invalid_content_rect, |
50 float contents_scale, | 50 float contents_scale, |
51 const RasterSource::PlaybackSettings& playback_settings, | 51 const RasterSource::PlaybackSettings& playback_settings, |
52 TileResolution tile_resolution, | 52 TileResolution tile_resolution, |
53 int layer_id, | 53 int layer_id, |
54 uint64_t source_prepare_tiles_id, | 54 uint64_t source_prepare_tiles_id, |
55 const void* tile, | 55 Tile* tile, |
56 uint64_t new_content_id, | 56 uint64_t new_content_id, |
57 uint64_t previous_content_id, | 57 uint64_t previous_content_id, |
58 uint64_t resource_content_id, | 58 uint64_t resource_content_id, |
59 int source_frame_number, | 59 int source_frame_number, |
60 const base::Callback<void(bool)>& reply, | 60 std::unique_ptr<RasterBuffer> raster_buffer, |
61 TileTask::Vector* dependencies, | 61 TileTask::Vector* dependencies, |
62 bool supports_concurrent_execution) | 62 bool supports_concurrent_execution) |
63 : TileTask(supports_concurrent_execution, dependencies), | 63 : TileTask(TileTask::Type::RASTER, |
| 64 supports_concurrent_execution, |
| 65 dependencies), |
64 resource_(resource), | 66 resource_(resource), |
65 raster_source_(std::move(raster_source)), | 67 raster_source_(std::move(raster_source)), |
66 content_rect_(content_rect), | 68 content_rect_(content_rect), |
67 invalid_content_rect_(invalid_content_rect), | 69 invalid_content_rect_(invalid_content_rect), |
68 contents_scale_(contents_scale), | 70 contents_scale_(contents_scale), |
69 playback_settings_(playback_settings), | 71 playback_settings_(playback_settings), |
70 tile_resolution_(tile_resolution), | 72 tile_resolution_(tile_resolution), |
71 layer_id_(layer_id), | 73 layer_id_(layer_id), |
72 source_prepare_tiles_id_(source_prepare_tiles_id), | 74 source_prepare_tiles_id_(source_prepare_tiles_id), |
73 tile_(tile), | 75 tile_(tile), |
74 new_content_id_(new_content_id), | 76 new_content_id_(new_content_id), |
75 previous_content_id_(previous_content_id), | 77 previous_content_id_(previous_content_id), |
76 resource_content_id_(resource_content_id), | 78 resource_content_id_(resource_content_id), |
77 source_frame_number_(source_frame_number), | 79 source_frame_number_(source_frame_number), |
78 reply_(reply) {} | 80 raster_buffer_(std::move(raster_buffer)) {} |
79 | 81 |
80 // Overridden from Task: | 82 // Overridden from Task: |
81 void RunOnWorkerThread() override { | 83 void RunOnWorkerThread() override { |
82 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", | 84 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", |
83 "source_prepare_tiles_id", source_prepare_tiles_id_); | 85 "source_prepare_tiles_id", source_prepare_tiles_id_); |
84 | 86 |
85 DCHECK(raster_source_.get()); | 87 DCHECK(raster_source_.get()); |
86 DCHECK(raster_buffer_); | 88 DCHECK(raster_buffer_); |
87 | 89 |
88 frame_viewer_instrumentation::ScopedRasterTask raster_task( | 90 frame_viewer_instrumentation::ScopedRasterTask raster_task( |
89 tile_, tile_resolution_, source_frame_number_, layer_id_); | 91 tile_, tile_resolution_, source_frame_number_, layer_id_); |
90 ScopedRasterTaskTimer timer; | 92 ScopedRasterTaskTimer timer; |
91 timer.SetArea(content_rect_.size().GetArea()); | 93 timer.SetArea(content_rect_.size().GetArea()); |
92 | 94 |
93 DCHECK(raster_source_); | 95 DCHECK(raster_source_); |
94 | 96 |
95 raster_buffer_->Playback(raster_source_.get(), content_rect_, | 97 raster_buffer_->Playback(raster_source_.get(), content_rect_, |
96 invalid_content_rect_, new_content_id_, | 98 invalid_content_rect_, new_content_id_, |
97 contents_scale_, playback_settings_); | 99 contents_scale_, playback_settings_); |
98 } | 100 } |
99 | 101 |
100 // Overridden from TileTask: | |
101 void ScheduleOnOriginThread(RasterBufferProvider* provider) override { | |
102 DCHECK(!raster_buffer_); | |
103 raster_buffer_ = provider->AcquireBufferForRaster( | |
104 resource_, resource_content_id_, previous_content_id_); | |
105 } | |
106 void CompleteOnOriginThread(RasterBufferProvider* provider) override { | |
107 provider->ReleaseBufferForRaster(std::move(raster_buffer_)); | |
108 reply_.Run(!state().IsFinished()); | |
109 } | |
110 | |
111 protected: | 102 protected: |
112 ~RasterTaskImpl() override { DCHECK(!raster_buffer_); } | 103 ~RasterTaskImpl() override { DCHECK(!raster_buffer_); } |
113 | 104 |
114 private: | 105 // TODO(prashant.n) Move this class from unnamed namespace to |
115 const Resource* resource_; | 106 // tile_task_manager.cc and use friend class. crbug.com/599863. |
| 107 public: |
| 108 Resource* resource_; |
116 scoped_refptr<RasterSource> raster_source_; | 109 scoped_refptr<RasterSource> raster_source_; |
117 gfx::Rect content_rect_; | 110 gfx::Rect content_rect_; |
118 gfx::Rect invalid_content_rect_; | 111 gfx::Rect invalid_content_rect_; |
119 float contents_scale_; | 112 float contents_scale_; |
120 RasterSource::PlaybackSettings playback_settings_; | 113 RasterSource::PlaybackSettings playback_settings_; |
121 TileResolution tile_resolution_; | 114 TileResolution tile_resolution_; |
122 int layer_id_; | 115 int layer_id_; |
123 uint64_t source_prepare_tiles_id_; | 116 uint64_t source_prepare_tiles_id_; |
124 const void* tile_; | 117 Tile* tile_; |
125 uint64_t new_content_id_; | 118 uint64_t new_content_id_; |
126 uint64_t previous_content_id_; | 119 uint64_t previous_content_id_; |
127 uint64_t resource_content_id_; | 120 uint64_t resource_content_id_; |
128 int source_frame_number_; | 121 int source_frame_number_; |
129 const base::Callback<void(bool)> reply_; | |
130 std::unique_ptr<RasterBuffer> raster_buffer_; | 122 std::unique_ptr<RasterBuffer> raster_buffer_; |
131 | 123 |
| 124 private: |
132 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); | 125 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); |
133 }; | 126 }; |
134 | 127 |
135 TaskCategory TaskCategoryForTileTask(TileTask* task, | 128 TaskCategory TaskCategoryForTileTask(TileTask* task, |
136 bool use_foreground_category) { | 129 bool use_foreground_category) { |
137 if (!task->supports_concurrent_execution()) | 130 if (!task->supports_concurrent_execution()) |
138 return TASK_CATEGORY_NONCONCURRENT_FOREGROUND; | 131 return TASK_CATEGORY_NONCONCURRENT_FOREGROUND; |
139 | 132 |
140 if (use_foreground_category) | 133 if (use_foreground_category) |
141 return TASK_CATEGORY_FOREGROUND; | 134 return TASK_CATEGORY_FOREGROUND; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 } | 174 } |
182 | 175 |
183 void InsertNodeForDecodeTask(TaskGraph* graph, | 176 void InsertNodeForDecodeTask(TaskGraph* graph, |
184 TileTask* task, | 177 TileTask* task, |
185 bool use_foreground_category, | 178 bool use_foreground_category, |
186 uint16_t priority) { | 179 uint16_t priority) { |
187 uint32_t dependency_count = 0u; | 180 uint32_t dependency_count = 0u; |
188 if (task->dependencies().size()) { | 181 if (task->dependencies().size()) { |
189 DCHECK_EQ(task->dependencies().size(), 1u); | 182 DCHECK_EQ(task->dependencies().size(), 1u); |
190 auto* dependency = task->dependencies()[0].get(); | 183 auto* dependency = task->dependencies()[0].get(); |
191 if (!dependency->HasCompleted()) { | 184 if (!dependency->state().IsCompleted()) { |
192 InsertNodeForDecodeTask(graph, dependency, use_foreground_category, | 185 InsertNodeForDecodeTask(graph, dependency, use_foreground_category, |
193 priority); | 186 priority); |
194 graph->edges.push_back(TaskGraph::Edge(dependency, task)); | 187 graph->edges.push_back(TaskGraph::Edge(dependency, task)); |
195 dependency_count = 1u; | 188 dependency_count = 1u; |
196 } | 189 } |
197 } | 190 } |
198 InsertNodeForTask(graph, task, | 191 InsertNodeForTask(graph, task, |
199 TaskCategoryForTileTask(task, use_foreground_category), | 192 TaskCategoryForTileTask(task, use_foreground_category), |
200 priority, dependency_count); | 193 priority, dependency_count); |
201 } | 194 } |
202 | 195 |
203 void InsertNodesForRasterTask(TaskGraph* graph, | 196 void InsertNodesForRasterTask(TaskGraph* graph, |
204 TileTask* raster_task, | 197 TileTask* raster_task, |
205 const TileTask::Vector& decode_tasks, | 198 const TileTask::Vector& decode_tasks, |
206 size_t priority, | 199 size_t priority, |
207 bool use_foreground_category) { | 200 bool use_foreground_category) { |
208 size_t dependencies = 0u; | 201 size_t dependencies = 0u; |
209 | 202 |
210 // Insert image decode tasks. | 203 // Insert image decode tasks. |
211 for (TileTask::Vector::const_iterator it = decode_tasks.begin(); | 204 for (TileTask::Vector::const_iterator it = decode_tasks.begin(); |
212 it != decode_tasks.end(); ++it) { | 205 it != decode_tasks.end(); ++it) { |
213 TileTask* decode_task = it->get(); | 206 TileTask* decode_task = it->get(); |
214 | 207 |
215 // Skip if already decoded. | 208 // Skip if already decoded. |
216 if (decode_task->HasCompleted()) | 209 if (decode_task->state().IsCompleted()) |
217 continue; | 210 continue; |
218 | 211 |
219 dependencies++; | 212 dependencies++; |
220 | 213 |
221 // Add decode task if it doesn't already exist in graph. | 214 // Add decode task if it doesn't already exist in graph. |
222 TaskGraph::Node::Vector::iterator decode_it = | 215 TaskGraph::Node::Vector::iterator decode_it = |
223 std::find_if(graph->nodes.begin(), graph->nodes.end(), | 216 std::find_if(graph->nodes.begin(), graph->nodes.end(), |
224 [decode_task](const TaskGraph::Node& node) { | 217 [decode_task](const TaskGraph::Node& node) { |
225 return node.task == decode_task; | 218 return node.task == decode_task; |
226 }); | 219 }); |
(...skipping 22 matching lines...) Expand all Loading... |
249 graph, raster_task, | 242 graph, raster_task, |
250 TaskCategoryForTileTask(raster_task, use_foreground_category), priority, | 243 TaskCategoryForTileTask(raster_task, use_foreground_category), priority, |
251 dependencies); | 244 dependencies); |
252 } | 245 } |
253 | 246 |
254 class TaskSetFinishedTaskImpl : public TileTask { | 247 class TaskSetFinishedTaskImpl : public TileTask { |
255 public: | 248 public: |
256 explicit TaskSetFinishedTaskImpl( | 249 explicit TaskSetFinishedTaskImpl( |
257 base::SequencedTaskRunner* task_runner, | 250 base::SequencedTaskRunner* task_runner, |
258 const base::Closure& on_task_set_finished_callback) | 251 const base::Closure& on_task_set_finished_callback) |
259 : TileTask(true), | 252 : TileTask(TileTask::Type::DEFAULT, true), |
260 task_runner_(task_runner), | 253 task_runner_(task_runner), |
261 on_task_set_finished_callback_(on_task_set_finished_callback) {} | 254 on_task_set_finished_callback_(on_task_set_finished_callback) {} |
262 | 255 |
263 // Overridden from Task: | 256 // Overridden from Task: |
264 void RunOnWorkerThread() override { | 257 void RunOnWorkerThread() override { |
265 TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread"); | 258 TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread"); |
266 TaskSetFinished(); | 259 TaskSetFinished(); |
267 } | 260 } |
268 | 261 |
269 // Overridden from TileTask: | |
270 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {} | |
271 void CompleteOnOriginThread(RasterBufferProvider* provider) override {} | |
272 | |
273 protected: | 262 protected: |
274 ~TaskSetFinishedTaskImpl() override {} | 263 ~TaskSetFinishedTaskImpl() override {} |
275 | 264 |
276 void TaskSetFinished() { | 265 void TaskSetFinished() { |
277 task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_); | 266 task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_); |
278 } | 267 } |
279 | 268 |
280 private: | 269 private: |
281 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 270 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
282 const base::Closure on_task_set_finished_callback_; | 271 const base::Closure on_task_set_finished_callback_; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 global_state_ = GlobalStateThatImpactsTilePriority(); | 339 global_state_ = GlobalStateThatImpactsTilePriority(); |
351 | 340 |
352 // This cancels tasks if possible, finishes pending tasks, and release any | 341 // This cancels tasks if possible, finishes pending tasks, and release any |
353 // uninitialized resources. | 342 // uninitialized resources. |
354 tile_task_manager_->Shutdown(); | 343 tile_task_manager_->Shutdown(); |
355 | 344 |
356 // Now that all tasks have been finished, we can clear any | 345 // Now that all tasks have been finished, we can clear any |
357 // |orphan_tasks_|. | 346 // |orphan_tasks_|. |
358 orphan_tasks_.clear(); | 347 orphan_tasks_.clear(); |
359 | 348 |
360 tile_task_manager_->CheckForCompletedTasks(); | 349 CheckForCompletedTasks(); |
361 | 350 |
362 FreeResourcesForReleasedTiles(); | 351 FreeResourcesForReleasedTiles(); |
363 CleanUpReleasedTiles(); | 352 CleanUpReleasedTiles(); |
364 | 353 |
365 tile_task_manager_ = nullptr; | 354 tile_task_manager_ = nullptr; |
366 resource_pool_ = nullptr; | 355 resource_pool_ = nullptr; |
367 more_tiles_need_prepare_check_notifier_.Cancel(); | 356 more_tiles_need_prepare_check_notifier_.Cancel(); |
368 signals_check_notifier_.Cancel(); | 357 signals_check_notifier_.Cancel(); |
369 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 358 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
370 } | 359 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted", | 451 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted", |
463 TRACE_EVENT_SCOPE_THREAD); | 452 TRACE_EVENT_SCOPE_THREAD); |
464 return false; | 453 return false; |
465 } | 454 } |
466 | 455 |
467 signals_.reset(); | 456 signals_.reset(); |
468 global_state_ = state; | 457 global_state_ = state; |
469 | 458 |
470 // We need to call CheckForCompletedTasks() once in-between each call | 459 // We need to call CheckForCompletedTasks() once in-between each call |
471 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 460 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
472 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 461 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) |
473 tile_task_manager_->CheckForCompletedTasks(); | 462 CheckForCompletedTasks(); |
474 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | |
475 } | |
476 | 463 |
477 FreeResourcesForReleasedTiles(); | 464 FreeResourcesForReleasedTiles(); |
478 CleanUpReleasedTiles(); | 465 CleanUpReleasedTiles(); |
479 | 466 |
480 PrioritizedTileVector tiles_that_need_to_be_rasterized; | 467 PrioritizedTileVector tiles_that_need_to_be_rasterized; |
481 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( | 468 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( |
482 client_->BuildRasterQueue(global_state_.tree_priority, | 469 client_->BuildRasterQueue(global_state_.tree_priority, |
483 RasterTilePriorityQueue::Type::ALL)); | 470 RasterTilePriorityQueue::Type::ALL)); |
484 AssignGpuMemoryToTiles(raster_priority_queue.get(), | 471 AssignGpuMemoryToTiles(raster_priority_queue.get(), |
485 scheduled_raster_task_limit_, | 472 scheduled_raster_task_limit_, |
(...skipping 14 matching lines...) Expand all Loading... |
500 } | 487 } |
501 | 488 |
502 void TileManager::Flush() { | 489 void TileManager::Flush() { |
503 TRACE_EVENT0("cc", "TileManager::Flush"); | 490 TRACE_EVENT0("cc", "TileManager::Flush"); |
504 | 491 |
505 if (!tile_task_manager_) { | 492 if (!tile_task_manager_) { |
506 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); | 493 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); |
507 return; | 494 return; |
508 } | 495 } |
509 | 496 |
510 tile_task_manager_->CheckForCompletedTasks(); | 497 CheckForCompletedTasks(); |
511 | |
512 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | |
513 | 498 |
514 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", | 499 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
515 RasterTaskCompletionStatsAsValue(flush_stats_)); | 500 RasterTaskCompletionStatsAsValue(flush_stats_)); |
516 flush_stats_ = RasterTaskCompletionStats(); | 501 flush_stats_ = RasterTaskCompletionStats(); |
517 } | 502 } |
518 | 503 |
519 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 504 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
520 TileManager::BasicStateAsValue() const { | 505 TileManager::BasicStateAsValue() const { |
521 std::unique_ptr<base::trace_event::TracedValue> value( | 506 std::unique_ptr<base::trace_event::TracedValue> value( |
522 new base::trace_event::TracedValue()); | 507 new base::trace_event::TracedValue()); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { | 773 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
789 Tile* tile = prioritized_tile.tile(); | 774 Tile* tile = prioritized_tile.tile(); |
790 | 775 |
791 DCHECK(tile->draw_info().requires_resource()); | 776 DCHECK(tile->draw_info().requires_resource()); |
792 DCHECK(!tile->draw_info().resource_); | 777 DCHECK(!tile->draw_info().resource_); |
793 | 778 |
794 if (!tile->raster_task_) | 779 if (!tile->raster_task_) |
795 tile->raster_task_ = CreateRasterTask(prioritized_tile); | 780 tile->raster_task_ = CreateRasterTask(prioritized_tile); |
796 | 781 |
797 TileTask* task = tile->raster_task_.get(); | 782 TileTask* task = tile->raster_task_.get(); |
798 DCHECK(!task->HasCompleted()); | 783 DCHECK(!task->state().IsCompleted()); |
799 | 784 |
800 if (tile->required_for_activation()) { | 785 if (tile->required_for_activation()) { |
801 required_for_activate_count++; | 786 required_for_activate_count++; |
802 graph_.edges.push_back( | 787 graph_.edges.push_back( |
803 TaskGraph::Edge(task, required_for_activation_done_task.get())); | 788 TaskGraph::Edge(task, required_for_activation_done_task.get())); |
804 } | 789 } |
805 if (tile->required_for_draw()) { | 790 if (tile->required_for_draw()) { |
806 required_for_draw_count++; | 791 required_for_draw_count++; |
807 graph_.edges.push_back( | 792 graph_.edges.push_back( |
808 TaskGraph::Edge(task, required_for_draw_done_task.get())); | 793 TaskGraph::Edge(task, required_for_draw_done_task.get())); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 if (task) | 893 if (task) |
909 decode_tasks.push_back(task); | 894 decode_tasks.push_back(task); |
910 | 895 |
911 if (need_to_unref_when_finished) | 896 if (need_to_unref_when_finished) |
912 ++it; | 897 ++it; |
913 else | 898 else |
914 it = images.erase(it); | 899 it = images.erase(it); |
915 } | 900 } |
916 | 901 |
917 bool supports_concurrent_execution = !use_gpu_rasterization_; | 902 bool supports_concurrent_execution = !use_gpu_rasterization_; |
| 903 std::unique_ptr<RasterBuffer> raster_buffer = |
| 904 tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster( |
| 905 resource, resource_content_id, tile->invalidated_id()); |
918 return make_scoped_refptr(new RasterTaskImpl( | 906 return make_scoped_refptr(new RasterTaskImpl( |
919 resource, prioritized_tile.raster_source(), tile->content_rect(), | 907 resource, prioritized_tile.raster_source(), tile->content_rect(), |
920 tile->invalidated_content_rect(), tile->contents_scale(), | 908 tile->invalidated_content_rect(), tile->contents_scale(), |
921 playback_settings, prioritized_tile.priority().resolution, | 909 playback_settings, prioritized_tile.priority().resolution, |
922 tile->layer_id(), prepare_tiles_count_, static_cast<const void*>(tile), | 910 tile->layer_id(), prepare_tiles_count_, tile, tile->id(), |
923 tile->id(), tile->invalidated_id(), resource_content_id, | 911 tile->invalidated_id(), resource_content_id, tile->source_frame_number(), |
924 tile->source_frame_number(), | 912 std::move(raster_buffer), &decode_tasks, supports_concurrent_execution)); |
925 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this), | |
926 tile->id(), resource), | |
927 &decode_tasks, supports_concurrent_execution)); | |
928 } | 913 } |
929 | 914 |
930 void TileManager::OnRasterTaskCompleted( | 915 void TileManager::CheckForCompletedTasks() { |
931 Tile::Id tile_id, | 916 Task::Vector completed_tasks; |
932 Resource* resource, | 917 tile_task_manager_->CollectCompletedTasks(&completed_tasks); |
933 bool was_canceled) { | |
934 DCHECK(tiles_.find(tile_id) != tiles_.end()); | |
935 | 918 |
936 Tile* tile = tiles_[tile_id]; | 919 for (auto task : completed_tasks) { |
937 TileDrawInfo& draw_info = tile->draw_info(); | 920 TileTask* tile_task = static_cast<TileTask*>(task.get()); |
938 DCHECK(tile->raster_task_.get()); | 921 switch (tile_task->type()) { |
939 orphan_tasks_.push_back(tile->raster_task_); | 922 case TileTask::Type::RASTER: |
940 tile->raster_task_ = nullptr; | 923 OnRasterTaskCompleted(tile_task); |
| 924 break; |
| 925 case TileTask::Type::IMAGE_DECODE: |
| 926 image_decode_controller_->OnImageDecodeTaskCompleted(tile_task); |
| 927 break; |
| 928 case TileTask::Type::IMAGE_UPLOAD: |
| 929 image_decode_controller_->OnImageUploadTaskCompleted(tile_task); |
| 930 break; |
| 931 case TileTask::Type::DEFAULT: |
| 932 // Do nothing. |
| 933 break; |
| 934 default: |
| 935 NOTREACHED(); |
| 936 } |
| 937 |
| 938 task->state().DidComplete(); |
| 939 } |
| 940 |
| 941 completed_tasks.clear(); |
| 942 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 943 } |
| 944 |
| 945 void TileManager::OnRasterTaskCompleted(TileTask* task) { |
| 946 DCHECK(task); |
| 947 RasterTaskImpl* raster_task = static_cast<RasterTaskImpl*>(task); |
| 948 tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster( |
| 949 std::move(raster_task->raster_buffer_)); |
| 950 |
| 951 DCHECK(tiles_.find(raster_task->tile_->id()) != tiles_.end()); |
| 952 TileDrawInfo& draw_info = raster_task->tile_->draw_info(); |
| 953 DCHECK(raster_task->tile_->raster_task_.get()); |
| 954 orphan_tasks_.push_back(raster_task->tile_->raster_task_); |
| 955 raster_task->tile_->raster_task_ = nullptr; |
941 | 956 |
942 // Unref all the images. | 957 // Unref all the images. |
943 auto images_it = scheduled_draw_images_.find(tile->id()); | 958 auto images_it = scheduled_draw_images_.find(raster_task->tile_->id()); |
944 const std::vector<DrawImage>& images = images_it->second; | 959 const std::vector<DrawImage>& images = images_it->second; |
945 for (const auto& image : images) | 960 for (const auto& image : images) |
946 image_decode_controller_->UnrefImage(image); | 961 image_decode_controller_->UnrefImage(image); |
947 scheduled_draw_images_.erase(images_it); | 962 scheduled_draw_images_.erase(images_it); |
948 | 963 |
949 if (was_canceled) { | 964 if (raster_task->state().IsCanceled()) { |
950 ++flush_stats_.canceled_count; | 965 ++flush_stats_.canceled_count; |
951 // TODO(ericrk): If more partial raster work is done in the future, it may | 966 // TODO(ericrk): If more partial raster work is done in the future, it may |
952 // be worth returning the resource to the pool with its previous ID (not | 967 // be worth returning the resource to the pool with its previous ID (not |
953 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method | 968 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method |
954 // of achieving this. | 969 // of achieving this. |
955 resource_pool_->ReleaseResource(resource, 0 /* content_id */); | 970 resource_pool_->ReleaseResource(raster_task->resource_, 0 /* content_id */); |
956 return; | 971 return; |
957 } | 972 } |
958 | 973 |
959 ++flush_stats_.completed_count; | 974 ++flush_stats_.completed_count; |
960 | 975 |
961 draw_info.set_use_resource(); | 976 draw_info.set_use_resource(); |
962 draw_info.resource_ = resource; | 977 draw_info.resource_ = raster_task->resource_; |
963 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); | 978 draw_info.contents_swizzled_ = |
| 979 DetermineResourceRequiresSwizzle(raster_task->tile_); |
964 | 980 |
965 DCHECK(draw_info.IsReadyToDraw()); | 981 DCHECK(draw_info.IsReadyToDraw()); |
966 draw_info.set_was_ever_ready_to_draw(); | 982 draw_info.set_was_ever_ready_to_draw(); |
967 | 983 |
968 client_->NotifyTileStateChanged(tile); | 984 client_->NotifyTileStateChanged(raster_task->tile_); |
969 } | 985 } |
970 | 986 |
971 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, | 987 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, |
972 int layer_id, | 988 int layer_id, |
973 int source_frame_number, | 989 int source_frame_number, |
974 int flags) { | 990 int flags) { |
975 // We need to have a tile task worker pool to do anything meaningful with | 991 // We need to have a tile task worker pool to do anything meaningful with |
976 // tiles. | 992 // tiles. |
977 DCHECK(tile_task_manager_); | 993 DCHECK(tile_task_manager_); |
978 ScopedTilePtr tile( | 994 ScopedTilePtr tile( |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1021 } | 1037 } |
1022 | 1038 |
1023 bool TileManager::IsReadyToDraw() const { | 1039 bool TileManager::IsReadyToDraw() const { |
1024 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); | 1040 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
1025 return AreRequiredTilesReadyToDraw( | 1041 return AreRequiredTilesReadyToDraw( |
1026 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 1042 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
1027 } | 1043 } |
1028 | 1044 |
1029 void TileManager::CheckAndIssueSignals() { | 1045 void TileManager::CheckAndIssueSignals() { |
1030 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); | 1046 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); |
1031 tile_task_manager_->CheckForCompletedTasks(); | 1047 CheckForCompletedTasks(); |
1032 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | |
1033 | 1048 |
1034 // Ready to activate. | 1049 // Ready to activate. |
1035 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { | 1050 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { |
1036 signals_.ready_to_activate = false; | 1051 signals_.ready_to_activate = false; |
1037 if (IsReadyToActivate()) { | 1052 if (IsReadyToActivate()) { |
1038 TRACE_EVENT0("disabled-by-default-cc.debug", | 1053 TRACE_EVENT0("disabled-by-default-cc.debug", |
1039 "TileManager::CheckAndIssueSignals - ready to activate"); | 1054 "TileManager::CheckAndIssueSignals - ready to activate"); |
1040 signals_.did_notify_ready_to_activate = true; | 1055 signals_.did_notify_ready_to_activate = true; |
1041 client_->NotifyReadyToActivate(); | 1056 client_->NotifyReadyToActivate(); |
1042 } | 1057 } |
(...skipping 18 matching lines...) Expand all Loading... |
1061 TRACE_EVENT0( | 1076 TRACE_EVENT0( |
1062 "disabled-by-default-cc.debug", | 1077 "disabled-by-default-cc.debug", |
1063 "TileManager::CheckAndIssueSignals - all tile tasks completed"); | 1078 "TileManager::CheckAndIssueSignals - all tile tasks completed"); |
1064 signals_.did_notify_all_tile_tasks_completed = true; | 1079 signals_.did_notify_all_tile_tasks_completed = true; |
1065 client_->NotifyAllTileTasksCompleted(); | 1080 client_->NotifyAllTileTasksCompleted(); |
1066 } | 1081 } |
1067 } | 1082 } |
1068 } | 1083 } |
1069 | 1084 |
1070 void TileManager::CheckIfMoreTilesNeedToBePrepared() { | 1085 void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
1071 tile_task_manager_->CheckForCompletedTasks(); | 1086 CheckForCompletedTasks(); |
1072 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | |
1073 | 1087 |
1074 // When OOM, keep re-assigning memory until we reach a steady state | 1088 // When OOM, keep re-assigning memory until we reach a steady state |
1075 // where top-priority tiles are initialized. | 1089 // where top-priority tiles are initialized. |
1076 PrioritizedTileVector tiles_that_need_to_be_rasterized; | 1090 PrioritizedTileVector tiles_that_need_to_be_rasterized; |
1077 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( | 1091 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( |
1078 client_->BuildRasterQueue(global_state_.tree_priority, | 1092 client_->BuildRasterQueue(global_state_.tree_priority, |
1079 RasterTilePriorityQueue::Type::ALL)); | 1093 RasterTilePriorityQueue::Type::ALL)); |
1080 AssignGpuMemoryToTiles(raster_priority_queue.get(), | 1094 AssignGpuMemoryToTiles(raster_priority_queue.get(), |
1081 scheduled_raster_task_limit_, | 1095 scheduled_raster_task_limit_, |
1082 &tiles_that_need_to_be_rasterized); | 1096 &tiles_that_need_to_be_rasterized); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 void TileManager::Signals::reset() { | 1270 void TileManager::Signals::reset() { |
1257 ready_to_activate = false; | 1271 ready_to_activate = false; |
1258 did_notify_ready_to_activate = false; | 1272 did_notify_ready_to_activate = false; |
1259 ready_to_draw = false; | 1273 ready_to_draw = false; |
1260 did_notify_ready_to_draw = false; | 1274 did_notify_ready_to_draw = false; |
1261 all_tile_tasks_completed = false; | 1275 all_tile_tasks_completed = false; |
1262 did_notify_all_tile_tasks_completed = false; | 1276 did_notify_all_tile_tasks_completed = false; |
1263 } | 1277 } |
1264 | 1278 |
1265 } // namespace cc | 1279 } // namespace cc |
OLD | NEW |