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