| 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, bool map_image_successful)> |
| 18 Reply; |
| 18 | 19 |
| 19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, | 20 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, |
| 20 TaskVector* dependencies, | 21 TaskVector* dependencies, |
| 21 uint8_t* buffer, | 22 uint8_t* buffer, |
| 22 int stride, | 23 int stride, |
| 23 const Reply& reply) | 24 const Reply& reply) |
| 24 : internal::WorkerPoolTask(dependencies), | 25 : internal::WorkerPoolTask(dependencies), |
| 25 task_(task), | 26 task_(task), |
| 26 buffer_(buffer), | 27 buffer_(buffer), |
| 27 stride_(stride), | 28 stride_(stride), |
| 28 reply_(reply) { | 29 reply_(reply) { |
| 29 } | 30 } |
| 30 | 31 |
| 31 // Overridden from internal::WorkerPoolTask: | 32 // Overridden from internal::WorkerPoolTask: |
| 32 virtual void RunOnThread(unsigned thread_index) OVERRIDE { | 33 virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
| 33 DCHECK(buffer_); | 34 if (!buffer_) |
| 35 return; |
| 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); |
| 41 task_->RunOnThread(&device, thread_index); | 44 task_->RunOnThread(&device, thread_index); |
| 42 } | 45 } |
| 43 virtual void DispatchCompletionCallback() OVERRIDE { | 46 virtual void DispatchCompletionCallback() OVERRIDE { |
| 44 reply_.Run(!HasFinishedRunning()); | 47 reply_.Run(!HasFinishedRunning(), !!buffer_); |
| 45 } | 48 } |
| 46 | 49 |
| 47 private: | 50 private: |
| 48 virtual ~ImageWorkerPoolTaskImpl() {} | 51 virtual ~ImageWorkerPoolTaskImpl() {} |
| 49 | 52 |
| 50 scoped_refptr<internal::RasterWorkerPoolTask> task_; | 53 scoped_refptr<internal::RasterWorkerPoolTask> task_; |
| 51 uint8_t* buffer_; | 54 uint8_t* buffer_; |
| 52 int stride_; | 55 int stride_; |
| 53 const Reply reply_; | 56 const Reply reply_; |
| 54 | 57 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 internal::WorkerPoolTask* image_task = image_it->second; | 91 internal::WorkerPoolTask* image_task = image_it->second; |
| 89 tasks.push_back(image_task); | 92 tasks.push_back(image_task); |
| 90 continue; | 93 continue; |
| 91 } | 94 } |
| 92 | 95 |
| 93 // Acquire image for resource. | 96 // Acquire image for resource. |
| 94 resource_provider()->AcquireImage(task->resource()->id()); | 97 resource_provider()->AcquireImage(task->resource()->id()); |
| 95 | 98 |
| 96 // Map image for raster. | 99 // Map image for raster. |
| 97 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); | 100 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); |
| 98 int stride = resource_provider()->GetImageStride(task->resource()->id()); | 101 int stride = 0; |
| 102 if (buffer) |
| 103 stride = resource_provider()->GetImageStride(task->resource()->id()); |
| 99 | 104 |
| 100 // TODO(reveman): Avoid having to make a copy of dependencies. | 105 // TODO(reveman): Avoid having to make a copy of dependencies. |
| 101 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); | 106 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); |
| 102 scoped_refptr<internal::WorkerPoolTask> image_task( | 107 scoped_refptr<internal::WorkerPoolTask> image_task( |
| 103 new ImageWorkerPoolTaskImpl( | 108 new ImageWorkerPoolTaskImpl( |
| 104 task, | 109 task, |
| 105 &dependencies, | 110 &dependencies, |
| 106 buffer, | 111 buffer, |
| 107 stride, | 112 stride, |
| 108 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, | 113 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, |
| 109 base::Unretained(this), | 114 base::Unretained(this), |
| 110 make_scoped_refptr(task)))); | 115 make_scoped_refptr(task)))); |
| 111 | 116 |
| 112 image_tasks_[task] = image_task; | 117 image_tasks_[task] = image_task; |
| 113 tasks.push_back(image_task); | 118 tasks.push_back(image_task); |
| 114 } | 119 } |
| 115 | 120 |
| 116 if (tasks.empty()) { | 121 if (tasks.empty()) { |
| 117 ScheduleRasterTasks(RootTask()); | 122 ScheduleRasterTasks(RootTask()); |
| 118 return; | 123 return; |
| 119 } | 124 } |
| 120 | 125 |
| 121 RootTask root(&tasks); | 126 RootTask root(&tasks); |
| 122 ScheduleRasterTasks(root); | 127 ScheduleRasterTasks(root); |
| 123 } | 128 } |
| 124 | 129 |
| 125 void ImageRasterWorkerPool::OnRasterTaskCompleted( | 130 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
| 126 scoped_refptr<internal::RasterWorkerPoolTask> task, | 131 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 127 bool was_canceled) { | 132 bool was_canceled, |
| 133 bool map_image_successful) { |
| 128 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", | 134 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", |
| 129 "was_canceled", was_canceled); | 135 "was_canceled", was_canceled); |
| 130 | 136 |
| 131 DCHECK(image_tasks_.find(task) != image_tasks_.end()); | 137 DCHECK(image_tasks_.find(task) != image_tasks_.end()); |
| 132 | 138 |
| 133 // Balanced with MapImage() call in ScheduleTasks(). | 139 if (map_image_successful) { |
| 134 resource_provider()->UnmapImage(task->resource()->id()); | 140 // Balanced with MapImage() call in ScheduleTasks(). |
| 141 resource_provider()->UnmapImage(task->resource()->id()); |
| 135 | 142 |
| 136 // Bind image to resource. | 143 // Bind image to resource. |
| 137 resource_provider()->BindImage(task->resource()->id()); | 144 resource_provider()->BindImage(task->resource()->id()); |
| 145 } |
| 138 | 146 |
| 139 if (!was_canceled) | 147 if (!was_canceled) |
| 140 task->DidRun(); | 148 task->DidRun(); |
| 141 | 149 |
| 142 task->DidComplete(); | 150 task->DidComplete(); |
| 143 task->DispatchCompletionCallback(); | 151 task->DispatchCompletionCallback(); |
| 144 | 152 |
| 145 image_tasks_.erase(task); | 153 image_tasks_.erase(task); |
| 146 } | 154 } |
| 147 | 155 |
| 148 } // namespace cc | 156 } // namespace cc |
| OLD | NEW |