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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 90 |
91 raster_buffer_->Playback(raster_source_.get(), content_rect_, | 91 raster_buffer_->Playback(raster_source_.get(), content_rect_, |
92 invalid_content_rect_, new_content_id_, | 92 invalid_content_rect_, new_content_id_, |
93 contents_scale_, playback_settings_); | 93 contents_scale_, playback_settings_); |
94 } | 94 } |
95 | 95 |
96 // Overridden from TileTask: | 96 // Overridden from TileTask: |
97 void OnTaskCompleted() override { | 97 void OnTaskCompleted() override { |
98 DCHECK(origin_thread_checker_.CalledOnValidThread()); | 98 DCHECK(origin_thread_checker_.CalledOnValidThread()); |
99 | 99 |
| 100 // Here calling state().IsCanceled() is thread-safe, because this task is |
| 101 // already concluded as FINISHED or CANCELLED and no longer will be worked |
| 102 // upon by task graph runner. |
100 tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, | 103 tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, |
101 resource_, state().IsCanceled()); | 104 resource_, state().IsCanceled()); |
102 } | 105 } |
103 | 106 |
104 protected: | 107 protected: |
105 ~RasterTaskImpl() override { | 108 ~RasterTaskImpl() override { |
106 DCHECK(origin_thread_checker_.CalledOnValidThread()); | 109 DCHECK(origin_thread_checker_.CalledOnValidThread()); |
107 DCHECK(!raster_buffer_); | 110 DCHECK(!raster_buffer_); |
108 } | 111 } |
109 | 112 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 186 } |
184 | 187 |
185 void InsertNodeForDecodeTask(TaskGraph* graph, | 188 void InsertNodeForDecodeTask(TaskGraph* graph, |
186 TileTask* task, | 189 TileTask* task, |
187 bool use_foreground_category, | 190 bool use_foreground_category, |
188 uint16_t priority) { | 191 uint16_t priority) { |
189 uint32_t dependency_count = 0u; | 192 uint32_t dependency_count = 0u; |
190 if (task->dependencies().size()) { | 193 if (task->dependencies().size()) { |
191 DCHECK_EQ(task->dependencies().size(), 1u); | 194 DCHECK_EQ(task->dependencies().size(), 1u); |
192 auto* dependency = task->dependencies()[0].get(); | 195 auto* dependency = task->dependencies()[0].get(); |
193 if (!dependency->state().IsFinished()) { | 196 if (!dependency->HasCompleted()) { |
194 InsertNodeForDecodeTask(graph, dependency, use_foreground_category, | 197 InsertNodeForDecodeTask(graph, dependency, use_foreground_category, |
195 priority); | 198 priority); |
196 graph->edges.push_back(TaskGraph::Edge(dependency, task)); | 199 graph->edges.push_back(TaskGraph::Edge(dependency, task)); |
197 dependency_count = 1u; | 200 dependency_count = 1u; |
198 } | 201 } |
199 } | 202 } |
200 InsertNodeForTask(graph, task, | 203 InsertNodeForTask(graph, task, |
201 TaskCategoryForTileTask(task, use_foreground_category), | 204 TaskCategoryForTileTask(task, use_foreground_category), |
202 priority, dependency_count); | 205 priority, dependency_count); |
203 } | 206 } |
204 | 207 |
205 void InsertNodesForRasterTask(TaskGraph* graph, | 208 void InsertNodesForRasterTask(TaskGraph* graph, |
206 TileTask* raster_task, | 209 TileTask* raster_task, |
207 const TileTask::Vector& decode_tasks, | 210 const TileTask::Vector& decode_tasks, |
208 size_t priority, | 211 size_t priority, |
209 bool use_foreground_category) { | 212 bool use_foreground_category) { |
210 size_t dependencies = 0u; | 213 size_t dependencies = 0u; |
211 | 214 |
212 // Insert image decode tasks. | 215 // Insert image decode tasks. |
213 for (TileTask::Vector::const_iterator it = decode_tasks.begin(); | 216 for (TileTask::Vector::const_iterator it = decode_tasks.begin(); |
214 it != decode_tasks.end(); ++it) { | 217 it != decode_tasks.end(); ++it) { |
215 TileTask* decode_task = it->get(); | 218 TileTask* decode_task = it->get(); |
216 | 219 |
217 // Skip if already decoded. | 220 // Skip if already decoded. |
218 if (decode_task->state().IsFinished()) | 221 if (decode_task->HasCompleted()) |
219 continue; | 222 continue; |
220 | 223 |
221 dependencies++; | 224 dependencies++; |
222 | 225 |
223 // Add decode task if it doesn't already exist in graph. | 226 // Add decode task if it doesn't already exist in graph. |
224 TaskGraph::Node::Vector::iterator decode_it = | 227 TaskGraph::Node::Vector::iterator decode_it = |
225 std::find_if(graph->nodes.begin(), graph->nodes.end(), | 228 std::find_if(graph->nodes.begin(), graph->nodes.end(), |
226 [decode_task](const TaskGraph::Node& node) { | 229 [decode_task](const TaskGraph::Node& node) { |
227 return node.task == decode_task; | 230 return node.task == decode_task; |
228 }); | 231 }); |
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 Tile* tile = prioritized_tile.tile(); | 800 Tile* tile = prioritized_tile.tile(); |
798 | 801 |
799 DCHECK(tile->draw_info().requires_resource()); | 802 DCHECK(tile->draw_info().requires_resource()); |
800 DCHECK(!tile->draw_info().resource_); | 803 DCHECK(!tile->draw_info().resource_); |
801 | 804 |
802 if (!tile->raster_task_) | 805 if (!tile->raster_task_) |
803 tile->raster_task_ = CreateRasterTask(prioritized_tile); | 806 tile->raster_task_ = CreateRasterTask(prioritized_tile); |
804 | 807 |
805 TileTask* task = tile->raster_task_.get(); | 808 TileTask* task = tile->raster_task_.get(); |
806 | 809 |
807 // The canceled state implies that task is completed as canceled. The task | 810 DCHECK(!task->HasCompleted()); |
808 // is modified to canceled state in TaskGraphWorkQueue::ScheduleTasks() with | |
809 // lock acquired. Canceled task gets collected before next scheduling, | |
810 // TileManager::ScheduleTasks(), happens. So if tile which had task canceled | |
811 // would get new raster task. As worker and origin threads run parallely, | |
812 // the tasks may be finished during schedule. Avoid sheduling raster tasks | |
813 // which have finished and those tasks should have all their dependencies | |
814 // finished. If task gets finished after it is checked, then it gets skipped | |
815 // in TaskGraphWorkQueue::ScheduleTasks(). | |
816 DCHECK(!task->state().IsCanceled()); | |
817 if (task->state().IsFinished()) { | |
818 #if DCHECK_IS_ON() | |
819 // Check if there is any dependency which is not finished. | |
820 for (auto& decode_task : task->dependencies()) | |
821 DCHECK(decode_task->state().IsFinished()); | |
822 #endif | |
823 continue; | |
824 } | |
825 | 811 |
826 if (tile->required_for_activation()) { | 812 if (tile->required_for_activation()) { |
827 required_for_activate_count++; | 813 required_for_activate_count++; |
828 graph_.edges.push_back( | 814 graph_.edges.push_back( |
829 TaskGraph::Edge(task, required_for_activation_done_task.get())); | 815 TaskGraph::Edge(task, required_for_activation_done_task.get())); |
830 } | 816 } |
831 if (tile->required_for_draw()) { | 817 if (tile->required_for_draw()) { |
832 required_for_draw_count++; | 818 required_for_draw_count++; |
833 graph_.edges.push_back( | 819 graph_.edges.push_back( |
834 TaskGraph::Edge(task, required_for_draw_done_task.get())); | 820 TaskGraph::Edge(task, required_for_draw_done_task.get())); |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 void TileManager::Signals::reset() { | 1268 void TileManager::Signals::reset() { |
1283 ready_to_activate = false; | 1269 ready_to_activate = false; |
1284 did_notify_ready_to_activate = false; | 1270 did_notify_ready_to_activate = false; |
1285 ready_to_draw = false; | 1271 ready_to_draw = false; |
1286 did_notify_ready_to_draw = false; | 1272 did_notify_ready_to_draw = false; |
1287 all_tile_tasks_completed = false; | 1273 all_tile_tasks_completed = false; |
1288 did_notify_all_tile_tasks_completed = false; | 1274 did_notify_all_tile_tasks_completed = false; |
1289 } | 1275 } |
1290 | 1276 |
1291 } // namespace cc | 1277 } // namespace cc |
OLD | NEW |