| 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 |
| 11 namespace cc { | 11 namespace cc { |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 16 public: | 16 public: |
| 17 typedef base::Callback<void(bool was_canceled)> Reply; | 17 typedef base::Callback<void(bool was_canceled)> Reply; |
| 18 | 18 |
| 19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, | 19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, |
| 20 TaskVector* dependencies, | |
| 21 uint8_t* buffer, | 20 uint8_t* buffer, |
| 22 int stride, | 21 int stride, |
| 23 const Reply& reply) | 22 const Reply& reply) |
| 24 : internal::WorkerPoolTask(dependencies), | 23 : task_(task), |
| 25 task_(task), | |
| 26 buffer_(buffer), | 24 buffer_(buffer), |
| 27 stride_(stride), | 25 stride_(stride), |
| 28 reply_(reply) { | 26 reply_(reply) { |
| 29 } | 27 } |
| 30 | 28 |
| 31 // Overridden from internal::WorkerPoolTask: | 29 // Overridden from internal::WorkerPoolTask: |
| 32 virtual void RunOnThread(unsigned thread_index) OVERRIDE { | 30 virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
| 33 if (!buffer_) | 31 if (!buffer_) |
| 34 return; | 32 return; |
| 35 | 33 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 61 | 59 |
| 62 ImageRasterWorkerPool::ImageRasterWorkerPool( | 60 ImageRasterWorkerPool::ImageRasterWorkerPool( |
| 63 ResourceProvider* resource_provider, size_t num_threads) | 61 ResourceProvider* resource_provider, size_t num_threads) |
| 64 : RasterWorkerPool(resource_provider, num_threads) { | 62 : RasterWorkerPool(resource_provider, num_threads) { |
| 65 } | 63 } |
| 66 | 64 |
| 67 ImageRasterWorkerPool::~ImageRasterWorkerPool() { | 65 ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
| 68 DCHECK_EQ(0u, image_tasks_.size()); | 66 DCHECK_EQ(0u, image_tasks_.size()); |
| 69 } | 67 } |
| 70 | 68 |
| 71 void ImageRasterWorkerPool::Shutdown() { | |
| 72 RasterWorkerPool::Shutdown(); | |
| 73 ScheduleRasterTasks(RootTask()); | |
| 74 } | |
| 75 | |
| 76 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 69 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| 77 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); | 70 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); |
| 78 | 71 |
| 79 internal::WorkerPoolTask::TaskVector tasks; | |
| 80 | |
| 81 RasterWorkerPool::SetRasterTasks(queue); | 72 RasterWorkerPool::SetRasterTasks(queue); |
| 82 | 73 |
| 83 for (RasterTask::Queue::TaskVector::const_iterator it = | 74 RasterTaskGraph graph; |
| 84 raster_tasks().begin(); | 75 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| 85 it != raster_tasks().end(); ++it) { | 76 it != raster_tasks().end(); ++it) { |
| 86 internal::RasterWorkerPoolTask* task = it->get(); | 77 internal::RasterWorkerPoolTask* task = it->get(); |
| 87 | 78 |
| 88 TaskMap::iterator image_it = image_tasks_.find(task); | 79 TaskMap::iterator image_it = image_tasks_.find(task); |
| 89 if (image_it != image_tasks_.end()) { | 80 if (image_it != image_tasks_.end()) { |
| 90 internal::WorkerPoolTask* image_task = image_it->second.get(); | 81 internal::WorkerPoolTask* image_task = image_it->second.get(); |
| 91 tasks.push_back(image_task); | 82 graph.InsertRasterTask(image_task, task->dependencies()); |
| 92 continue; | 83 continue; |
| 93 } | 84 } |
| 94 | 85 |
| 95 // Acquire image for resource. | 86 // Acquire image for resource. |
| 96 resource_provider()->AcquireImage(task->resource()->id()); | 87 resource_provider()->AcquireImage(task->resource()->id()); |
| 97 | 88 |
| 98 // Map image for raster. | 89 // Map image for raster. |
| 99 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); | 90 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); |
| 100 int stride = resource_provider()->GetImageStride(task->resource()->id()); | 91 int stride = resource_provider()->GetImageStride(task->resource()->id()); |
| 101 | 92 |
| 102 // TODO(reveman): Avoid having to make a copy of dependencies. | |
| 103 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); | |
| 104 scoped_refptr<internal::WorkerPoolTask> new_image_task( | 93 scoped_refptr<internal::WorkerPoolTask> new_image_task( |
| 105 new ImageWorkerPoolTaskImpl( | 94 new ImageWorkerPoolTaskImpl( |
| 106 task, | 95 task, |
| 107 &dependencies, | |
| 108 buffer, | 96 buffer, |
| 109 stride, | 97 stride, |
| 110 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, | 98 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, |
| 111 base::Unretained(this), | 99 base::Unretained(this), |
| 112 make_scoped_refptr(task)))); | 100 make_scoped_refptr(task)))); |
| 113 | |
| 114 image_tasks_[task] = new_image_task; | 101 image_tasks_[task] = new_image_task; |
| 115 tasks.push_back(new_image_task); | 102 graph.InsertRasterTask(new_image_task.get(), task->dependencies()); |
| 116 } | 103 } |
| 117 | 104 |
| 118 if (tasks.empty()) { | 105 SetRasterTaskGraph(&graph); |
| 119 ScheduleRasterTasks(RootTask()); | |
| 120 return; | |
| 121 } | |
| 122 | |
| 123 RootTask root(&tasks); | |
| 124 ScheduleRasterTasks(root); | |
| 125 } | 106 } |
| 126 | 107 |
| 127 void ImageRasterWorkerPool::OnRasterTaskCompleted( | 108 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
| 128 scoped_refptr<internal::RasterWorkerPoolTask> task, | 109 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 129 bool was_canceled) { | 110 bool was_canceled) { |
| 130 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", | 111 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", |
| 131 "was_canceled", was_canceled); | 112 "was_canceled", was_canceled); |
| 132 | 113 |
| 133 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); | 114 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); |
| 134 | 115 |
| 135 // Balanced with MapImage() call in ScheduleTasks(). | 116 // Balanced with MapImage() call in ScheduleTasks(). |
| 136 resource_provider()->UnmapImage(task->resource()->id()); | 117 resource_provider()->UnmapImage(task->resource()->id()); |
| 137 | 118 |
| 138 // Bind image to resource. | 119 // Bind image to resource. |
| 139 resource_provider()->BindImage(task->resource()->id()); | 120 resource_provider()->BindImage(task->resource()->id()); |
| 140 | 121 |
| 141 task->DidRun(was_canceled); | 122 task->DidRun(was_canceled); |
| 142 task->DidComplete(); | 123 task->DidComplete(); |
| 143 task->DispatchCompletionCallback(); | 124 task->DispatchCompletionCallback(); |
| 144 | 125 |
| 145 image_tasks_.erase(task.get()); | 126 image_tasks_.erase(task.get()); |
| 146 } | 127 } |
| 147 | 128 |
| 148 } // namespace cc | 129 } // namespace cc |
| OLD | NEW |