| 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 "base/values.h" |
| 9 #include "cc/debug/traced_value.h" |
| 8 #include "cc/resources/resource.h" | 10 #include "cc/resources/resource.h" |
| 9 #include "third_party/skia/include/core/SkDevice.h" | 11 #include "third_party/skia/include/core/SkDevice.h" |
| 10 | 12 |
| 11 namespace cc { | 13 namespace cc { |
| 12 | 14 |
| 13 namespace { | 15 namespace { |
| 14 | 16 |
| 15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 17 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 16 public: | 18 public: |
| 17 typedef base::Callback<void(bool was_canceled)> Reply; | 19 typedef base::Callback<void(bool was_canceled)> Reply; |
| 18 | 20 |
| 19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, | 21 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, |
| 20 uint8_t* buffer, | 22 uint8_t* buffer, |
| 21 int stride, | 23 int stride, |
| 22 const Reply& reply) | 24 const Reply& reply) |
| 23 : task_(task), | 25 : task_(task), |
| 24 buffer_(buffer), | 26 buffer_(buffer), |
| 25 stride_(stride), | 27 stride_(stride), |
| 26 reply_(reply) { | 28 reply_(reply) { |
| 27 } | 29 } |
| 28 | 30 |
| 29 // Overridden from internal::WorkerPoolTask: | 31 // Overridden from internal::WorkerPoolTask: |
| 30 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { | 32 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
| 33 TRACE_EVENT0("cc", "ImageWorkerPoolTaskImpl::RunOnWorkerThread"); |
| 31 if (!buffer_) | 34 if (!buffer_) |
| 32 return; | 35 return; |
| 33 | 36 |
| 34 SkBitmap bitmap; | 37 SkBitmap bitmap; |
| 35 bitmap.setConfig(SkBitmap::kARGB_8888_Config, | 38 bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
| 36 task_->resource()->size().width(), | 39 task_->resource()->size().width(), |
| 37 task_->resource()->size().height(), | 40 task_->resource()->size().height(), |
| 38 stride_); | 41 stride_); |
| 39 bitmap.setPixels(buffer_); | 42 bitmap.setPixels(buffer_); |
| 40 SkDevice device(bitmap); | 43 SkDevice device(bitmap); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 52 int stride_; | 55 int stride_; |
| 53 const Reply reply_; | 56 const Reply reply_; |
| 54 | 57 |
| 55 DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl); | 58 DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl); |
| 56 }; | 59 }; |
| 57 | 60 |
| 58 } // namespace | 61 } // namespace |
| 59 | 62 |
| 60 ImageRasterWorkerPool::ImageRasterWorkerPool( | 63 ImageRasterWorkerPool::ImageRasterWorkerPool( |
| 61 ResourceProvider* resource_provider, size_t num_threads) | 64 ResourceProvider* resource_provider, size_t num_threads) |
| 62 : RasterWorkerPool(resource_provider, num_threads) { | 65 : RasterWorkerPool(resource_provider, num_threads), |
| 66 raster_tasks_pending_(false), |
| 67 raster_tasks_required_for_activation_pending_(false) { |
| 63 } | 68 } |
| 64 | 69 |
| 65 ImageRasterWorkerPool::~ImageRasterWorkerPool() { | 70 ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
| 66 DCHECK_EQ(0u, image_tasks_.size()); | 71 DCHECK_EQ(0u, image_tasks_.size()); |
| 67 } | 72 } |
| 68 | 73 |
| 69 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 74 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| 70 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); | 75 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); |
| 71 | 76 |
| 72 RasterWorkerPool::SetRasterTasks(queue); | 77 RasterWorkerPool::SetRasterTasks(queue); |
| 73 | 78 |
| 74 RasterTaskGraph graph; | 79 if (!raster_tasks_pending_) |
| 80 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
| 81 |
| 82 raster_tasks_pending_ = true; |
| 83 raster_tasks_required_for_activation_pending_ = true; |
| 84 |
| 85 unsigned priority = 0u; |
| 86 TaskGraph graph; |
| 87 |
| 88 scoped_refptr<internal::WorkerPoolTask> |
| 89 new_raster_required_for_activation_finished_task( |
| 90 CreateRasterRequiredForActivationFinishedTask()); |
| 91 internal::GraphNode* raster_required_for_activation_finished_node = |
| 92 CreateGraphNodeForTask( |
| 93 new_raster_required_for_activation_finished_task.get(), |
| 94 priority++, |
| 95 &graph); |
| 96 |
| 97 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( |
| 98 CreateRasterFinishedTask()); |
| 99 internal::GraphNode* raster_finished_node = |
| 100 CreateGraphNodeForTask(new_raster_finished_task.get(), |
| 101 priority++, |
| 102 &graph); |
| 103 |
| 75 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 104 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| 76 it != raster_tasks().end(); ++it) { | 105 it != raster_tasks().end(); ++it) { |
| 77 internal::RasterWorkerPoolTask* task = it->get(); | 106 internal::RasterWorkerPoolTask* task = it->get(); |
| 78 | 107 |
| 79 TaskMap::iterator image_it = image_tasks_.find(task); | 108 TaskMap::iterator image_it = image_tasks_.find(task); |
| 80 if (image_it != image_tasks_.end()) { | 109 if (image_it != image_tasks_.end()) { |
| 81 internal::WorkerPoolTask* image_task = image_it->second.get(); | 110 internal::WorkerPoolTask* image_task = image_it->second.get(); |
| 82 graph.InsertRasterTask(image_task, task->dependencies()); | 111 CreateGraphNodeForImageTask( |
| 112 image_task, |
| 113 task->dependencies(), |
| 114 priority++, |
| 115 IsRasterTaskRequiredForActivation(task), |
| 116 raster_required_for_activation_finished_node, |
| 117 raster_finished_node, |
| 118 &graph); |
| 83 continue; | 119 continue; |
| 84 } | 120 } |
| 85 | 121 |
| 86 // Acquire image for resource. | 122 // Acquire image for resource. |
| 87 resource_provider()->AcquireImage(task->resource()->id()); | 123 resource_provider()->AcquireImage(task->resource()->id()); |
| 88 | 124 |
| 89 // Map image for raster. | 125 // Map image for raster. |
| 90 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); | 126 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); |
| 91 int stride = resource_provider()->GetImageStride(task->resource()->id()); | 127 int stride = resource_provider()->GetImageStride(task->resource()->id()); |
| 92 | 128 |
| 93 scoped_refptr<internal::WorkerPoolTask> new_image_task( | 129 scoped_refptr<internal::WorkerPoolTask> new_image_task( |
| 94 new ImageWorkerPoolTaskImpl( | 130 new ImageWorkerPoolTaskImpl( |
| 95 task, | 131 task, |
| 96 buffer, | 132 buffer, |
| 97 stride, | 133 stride, |
| 98 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, | 134 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, |
| 99 base::Unretained(this), | 135 base::Unretained(this), |
| 100 make_scoped_refptr(task)))); | 136 make_scoped_refptr(task)))); |
| 101 image_tasks_[task] = new_image_task; | 137 image_tasks_[task] = new_image_task; |
| 102 graph.InsertRasterTask(new_image_task.get(), task->dependencies()); | 138 CreateGraphNodeForImageTask( |
| 139 new_image_task.get(), |
| 140 task->dependencies(), |
| 141 priority++, |
| 142 IsRasterTaskRequiredForActivation(task), |
| 143 raster_required_for_activation_finished_node, |
| 144 raster_finished_node, |
| 145 &graph); |
| 103 } | 146 } |
| 104 | 147 |
| 105 SetRasterTaskGraph(&graph); | 148 SetTaskGraph(&graph); |
| 149 |
| 150 set_raster_finished_task(new_raster_finished_task); |
| 151 set_raster_required_for_activation_finished_task( |
| 152 new_raster_required_for_activation_finished_task); |
| 153 |
| 154 TRACE_EVENT_ASYNC_STEP1( |
| 155 "cc", "ScheduledTasks", this, "rasterizing", |
| 156 "state", TracedValue::FromValue(StateAsValue().release())); |
| 157 } |
| 158 |
| 159 void ImageRasterWorkerPool::OnRasterTasksFinished() { |
| 160 DCHECK(raster_tasks_pending_); |
| 161 raster_tasks_pending_ = false; |
| 162 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
| 163 client()->DidFinishedRunningTasks(); |
| 164 } |
| 165 |
| 166 void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { |
| 167 DCHECK(raster_tasks_required_for_activation_pending_); |
| 168 raster_tasks_required_for_activation_pending_ = false; |
| 169 TRACE_EVENT_ASYNC_STEP1( |
| 170 "cc", "ScheduledTasks", this, "rasterizing", |
| 171 "state", TracedValue::FromValue(StateAsValue().release())); |
| 172 client()->DidFinishedRunningTasksRequiredForActivation(); |
| 106 } | 173 } |
| 107 | 174 |
| 108 void ImageRasterWorkerPool::OnRasterTaskCompleted( | 175 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
| 109 scoped_refptr<internal::RasterWorkerPoolTask> task, | 176 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 110 bool was_canceled) { | 177 bool was_canceled) { |
| 111 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", | 178 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", |
| 112 "was_canceled", was_canceled); | 179 "was_canceled", was_canceled); |
| 113 | 180 |
| 114 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); | 181 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); |
| 115 | 182 |
| 116 // Balanced with MapImage() call in ScheduleTasks(). | 183 // Balanced with MapImage() call in ScheduleTasks(). |
| 117 resource_provider()->UnmapImage(task->resource()->id()); | 184 resource_provider()->UnmapImage(task->resource()->id()); |
| 118 | 185 |
| 119 // Bind image to resource. | 186 // Bind image to resource. |
| 120 resource_provider()->BindImage(task->resource()->id()); | 187 resource_provider()->BindImage(task->resource()->id()); |
| 121 | 188 |
| 122 task->DidRun(was_canceled); | 189 task->DidRun(was_canceled); |
| 123 task->WillComplete(); | 190 task->WillComplete(); |
| 124 task->CompleteOnOriginThread(); | 191 task->CompleteOnOriginThread(); |
| 125 task->DidComplete(); | 192 task->DidComplete(); |
| 126 | 193 |
| 127 image_tasks_.erase(task.get()); | 194 image_tasks_.erase(task.get()); |
| 128 } | 195 } |
| 129 | 196 |
| 197 scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const { |
| 198 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); |
| 199 |
| 200 state->SetBoolean("tasks_required_for_activation_pending", |
| 201 raster_tasks_required_for_activation_pending_); |
| 202 state->Set("scheduled_state", ScheduledStateAsValue().release()); |
| 203 return state.PassAs<base::Value>(); |
| 204 } |
| 205 |
| 206 // static |
| 207 void ImageRasterWorkerPool::CreateGraphNodeForImageTask( |
| 208 internal::WorkerPoolTask* image_task, |
| 209 const TaskVector& decode_tasks, |
| 210 unsigned priority, |
| 211 bool is_required_for_activation, |
| 212 internal::GraphNode* raster_required_for_activation_finished_node, |
| 213 internal::GraphNode* raster_finished_node, |
| 214 TaskGraph* graph) { |
| 215 internal::GraphNode* image_node = CreateGraphNodeForRasterTask(image_task, |
| 216 decode_tasks, |
| 217 priority, |
| 218 graph); |
| 219 |
| 220 if (is_required_for_activation) { |
| 221 raster_required_for_activation_finished_node->add_dependency(); |
| 222 image_node->add_dependent(raster_required_for_activation_finished_node); |
| 223 } |
| 224 |
| 225 raster_finished_node->add_dependency(); |
| 226 image_node->add_dependent(raster_finished_node); |
| 227 } |
| 228 |
| 130 } // namespace cc | 229 } // namespace cc |
| OLD | NEW |