| 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 |