OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/image_raster_worker_pool.h" | 5 #include "cc/resources/image_raster_worker_pool.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/resources/resource.h" | 8 #include "cc/resources/resource.h" |
9 #include "third_party/skia/include/core/SkDevice.h" | 9 #include "third_party/skia/include/core/SkDevice.h" |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 int stride, | 21 int stride, |
22 const Reply& reply) | 22 const Reply& reply) |
23 : task_(task), | 23 : task_(task), |
24 buffer_(buffer), | 24 buffer_(buffer), |
25 stride_(stride), | 25 stride_(stride), |
26 reply_(reply) { | 26 reply_(reply) { |
27 } | 27 } |
28 | 28 |
29 // Overridden from internal::WorkerPoolTask: | 29 // Overridden from internal::WorkerPoolTask: |
30 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { | 30 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
| 31 TRACE_EVENT0("cc", "ImageWorkerPoolTaskImpl::RunOnWorkerThread"); |
31 if (!buffer_) | 32 if (!buffer_) |
32 return; | 33 return; |
33 | 34 |
34 SkBitmap bitmap; | 35 SkBitmap bitmap; |
35 bitmap.setConfig(SkBitmap::kARGB_8888_Config, | 36 bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
36 task_->resource()->size().width(), | 37 task_->resource()->size().width(), |
37 task_->resource()->size().height(), | 38 task_->resource()->size().height(), |
38 stride_); | 39 stride_); |
39 bitmap.setPixels(buffer_); | 40 bitmap.setPixels(buffer_); |
40 SkDevice device(bitmap); | 41 SkDevice device(bitmap); |
(...skipping 23 matching lines...) Expand all Loading... |
64 | 65 |
65 ImageRasterWorkerPool::~ImageRasterWorkerPool() { | 66 ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
66 DCHECK_EQ(0u, image_tasks_.size()); | 67 DCHECK_EQ(0u, image_tasks_.size()); |
67 } | 68 } |
68 | 69 |
69 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 70 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
70 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); | 71 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); |
71 | 72 |
72 RasterWorkerPool::SetRasterTasks(queue); | 73 RasterWorkerPool::SetRasterTasks(queue); |
73 | 74 |
74 RasterTaskGraph graph; | 75 unsigned priority = 0u; |
| 76 TaskGraph graph; |
| 77 |
| 78 scoped_refptr<internal::WorkerPoolTask> |
| 79 new_raster_required_for_activation_finished_task( |
| 80 CreateRasterRequiredForActivationFinishedTask()); |
| 81 GraphNode* raster_required_for_activation_finished_node = |
| 82 CreateGraphNodeForTask( |
| 83 new_raster_required_for_activation_finished_task.get(), |
| 84 priority++, |
| 85 &graph); |
| 86 |
| 87 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( |
| 88 CreateRasterFinishedTask()); |
| 89 GraphNode* raster_finished_node = |
| 90 CreateGraphNodeForTask(new_raster_finished_task.get(), |
| 91 priority++, |
| 92 &graph); |
| 93 |
75 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 94 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
76 it != raster_tasks().end(); ++it) { | 95 it != raster_tasks().end(); ++it) { |
77 internal::RasterWorkerPoolTask* task = it->get(); | 96 internal::RasterWorkerPoolTask* task = it->get(); |
78 | 97 |
79 TaskMap::iterator image_it = image_tasks_.find(task); | 98 TaskMap::iterator image_it = image_tasks_.find(task); |
80 if (image_it != image_tasks_.end()) { | 99 if (image_it != image_tasks_.end()) { |
81 internal::WorkerPoolTask* image_task = image_it->second.get(); | 100 internal::WorkerPoolTask* image_task = image_it->second.get(); |
82 graph.InsertRasterTask(image_task, task->dependencies()); | 101 CreateGraphNodeForImageTask( |
| 102 image_task, |
| 103 task->dependencies(), |
| 104 priority++, |
| 105 IsRasterTaskRequiredForActivation(task), |
| 106 raster_required_for_activation_finished_node, |
| 107 raster_finished_node, |
| 108 &graph); |
83 continue; | 109 continue; |
84 } | 110 } |
85 | 111 |
86 // Acquire image for resource. | 112 // Acquire image for resource. |
87 resource_provider()->AcquireImage(task->resource()->id()); | 113 resource_provider()->AcquireImage(task->resource()->id()); |
88 | 114 |
89 // Map image for raster. | 115 // Map image for raster. |
90 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); | 116 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); |
91 int stride = resource_provider()->GetImageStride(task->resource()->id()); | 117 int stride = resource_provider()->GetImageStride(task->resource()->id()); |
92 | 118 |
93 scoped_refptr<internal::WorkerPoolTask> new_image_task( | 119 scoped_refptr<internal::WorkerPoolTask> new_image_task( |
94 new ImageWorkerPoolTaskImpl( | 120 new ImageWorkerPoolTaskImpl( |
95 task, | 121 task, |
96 buffer, | 122 buffer, |
97 stride, | 123 stride, |
98 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, | 124 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, |
99 base::Unretained(this), | 125 base::Unretained(this), |
100 make_scoped_refptr(task)))); | 126 make_scoped_refptr(task)))); |
101 image_tasks_[task] = new_image_task; | 127 image_tasks_[task] = new_image_task; |
102 graph.InsertRasterTask(new_image_task.get(), task->dependencies()); | 128 CreateGraphNodeForImageTask( |
| 129 new_image_task.get(), |
| 130 task->dependencies(), |
| 131 priority++, |
| 132 IsRasterTaskRequiredForActivation(task), |
| 133 raster_required_for_activation_finished_node, |
| 134 raster_finished_node, |
| 135 &graph); |
103 } | 136 } |
104 | 137 |
105 SetRasterTaskGraph(&graph); | 138 SetTaskGraph(&graph); |
| 139 |
| 140 set_raster_finished_task(new_raster_finished_task); |
| 141 set_raster_required_for_activation_finished_task( |
| 142 new_raster_required_for_activation_finished_task); |
| 143 } |
| 144 |
| 145 void ImageRasterWorkerPool::OnRasterTasksFinished() { |
| 146 client()->DidFinishedRunningTasks(); |
| 147 } |
| 148 |
| 149 void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { |
| 150 client()->DidFinishedRunningTasksRequiredForActivation(); |
106 } | 151 } |
107 | 152 |
108 void ImageRasterWorkerPool::OnRasterTaskCompleted( | 153 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
109 scoped_refptr<internal::RasterWorkerPoolTask> task, | 154 scoped_refptr<internal::RasterWorkerPoolTask> task, |
110 bool was_canceled) { | 155 bool was_canceled) { |
111 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", | 156 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", |
112 "was_canceled", was_canceled); | 157 "was_canceled", was_canceled); |
113 | 158 |
114 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); | 159 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); |
115 | 160 |
116 // Balanced with MapImage() call in ScheduleTasks(). | 161 // Balanced with MapImage() call in ScheduleTasks(). |
117 resource_provider()->UnmapImage(task->resource()->id()); | 162 resource_provider()->UnmapImage(task->resource()->id()); |
118 | 163 |
119 // Bind image to resource. | 164 // Bind image to resource. |
120 resource_provider()->BindImage(task->resource()->id()); | 165 resource_provider()->BindImage(task->resource()->id()); |
121 | 166 |
122 task->DidRun(was_canceled); | 167 task->DidRun(was_canceled); |
123 task->WillComplete(); | 168 task->WillComplete(); |
124 task->CompleteOnOriginThread(); | 169 task->CompleteOnOriginThread(); |
125 task->DidComplete(); | 170 task->DidComplete(); |
126 | 171 |
127 image_tasks_.erase(task.get()); | 172 image_tasks_.erase(task.get()); |
128 } | 173 } |
129 | 174 |
| 175 // static |
| 176 void ImageRasterWorkerPool::CreateGraphNodeForImageTask( |
| 177 internal::WorkerPoolTask* image_task, |
| 178 const TaskVector& decode_tasks, |
| 179 unsigned priority, |
| 180 bool is_required_for_activation, |
| 181 GraphNode* raster_required_for_activation_finished_node, |
| 182 GraphNode* raster_finished_node, |
| 183 TaskGraph* graph) { |
| 184 GraphNode* image_node = CreateGraphNodeForRasterTask(image_task, |
| 185 decode_tasks, |
| 186 priority, |
| 187 graph); |
| 188 |
| 189 if (is_required_for_activation) { |
| 190 raster_required_for_activation_finished_node->add_dependency(); |
| 191 image_node->add_dependent(raster_required_for_activation_finished_node); |
| 192 } |
| 193 |
| 194 raster_finished_node->add_dependency(); |
| 195 image_node->add_dependent(raster_finished_node); |
| 196 } |
| 197 |
130 } // namespace cc | 198 } // namespace cc |
OLD | NEW |