OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "cc/resources/image_raster_worker_pool.h" |
| 6 |
| 7 #include "base/debug/trace_event.h" |
| 8 #include "cc/resources/resource.h" |
| 9 #include "third_party/skia/include/core/SkDevice.h" |
| 10 |
| 11 namespace cc { |
| 12 |
| 13 namespace { |
| 14 |
| 15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 16 public: |
| 17 typedef base::Callback<void(bool was_canceled)> Reply; |
| 18 |
| 19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, |
| 20 TaskVector* dependencies, |
| 21 uint8_t* buffer, |
| 22 int stride, |
| 23 const Reply& reply) |
| 24 : internal::WorkerPoolTask(dependencies), |
| 25 task_(task), |
| 26 buffer_(buffer), |
| 27 stride_(stride), |
| 28 reply_(reply) { |
| 29 } |
| 30 |
| 31 // Overridden from internal::WorkerPoolTask: |
| 32 virtual void RunOnThread(unsigned thread_index) OVERRIDE { |
| 33 DCHECK(buffer_); |
| 34 SkBitmap bitmap; |
| 35 bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
| 36 task_->resource()->size().width(), |
| 37 task_->resource()->size().height(), |
| 38 stride_); |
| 39 bitmap.setPixels(buffer_); |
| 40 SkDevice device(bitmap); |
| 41 task_->RunOnThread(&device, thread_index); |
| 42 } |
| 43 virtual void DispatchCompletionCallback() OVERRIDE { |
| 44 reply_.Run(!HasFinishedRunning()); |
| 45 } |
| 46 |
| 47 private: |
| 48 virtual ~ImageWorkerPoolTaskImpl() {} |
| 49 |
| 50 scoped_refptr<internal::RasterWorkerPoolTask> task_; |
| 51 uint8_t* buffer_; |
| 52 int stride_; |
| 53 const Reply reply_; |
| 54 |
| 55 DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl); |
| 56 }; |
| 57 |
| 58 } // namespace |
| 59 |
| 60 ImageRasterWorkerPool::ImageRasterWorkerPool( |
| 61 ResourceProvider* resource_provider, size_t num_threads) |
| 62 : RasterWorkerPool(resource_provider, num_threads) { |
| 63 // TODO(reveman): Remove WorkerPool client interface. |
| 64 WorkerPool::SetClient(this); |
| 65 } |
| 66 |
| 67 ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
| 68 DCHECK_EQ(0u, image_tasks_.size()); |
| 69 } |
| 70 |
| 71 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| 72 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); |
| 73 |
| 74 internal::WorkerPoolTask::TaskVector raster_tasks; |
| 75 |
| 76 RasterWorkerPool::SetRasterTasks(queue); |
| 77 |
| 78 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin(); |
| 79 it != raster_tasks_.end(); ++it) { |
| 80 internal::RasterWorkerPoolTask* task = *it; |
| 81 |
| 82 TaskMap::iterator image_it = image_tasks_.find(task); |
| 83 if (image_it != image_tasks_.end()) { |
| 84 internal::WorkerPoolTask* image_task = image_it->second; |
| 85 raster_tasks.push_back(image_task); |
| 86 continue; |
| 87 } |
| 88 |
| 89 // Acquire image for resource. |
| 90 resource_provider_->AcquireImage(task->resource()->id()); |
| 91 |
| 92 // Map image for raster. |
| 93 uint8* buffer = resource_provider_->MapImage(task->resource()->id()); |
| 94 int stride = resource_provider_->GetImageStride(task->resource()->id()); |
| 95 |
| 96 // TODO(reveman): Avoid having to make a copy of dependencies. |
| 97 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); |
| 98 scoped_refptr<internal::WorkerPoolTask> image_task( |
| 99 new ImageWorkerPoolTaskImpl( |
| 100 task, |
| 101 &dependencies, |
| 102 buffer, |
| 103 stride, |
| 104 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, |
| 105 base::Unretained(this), |
| 106 make_scoped_refptr(task)))); |
| 107 |
| 108 image_tasks_[task] = image_task; |
| 109 raster_tasks.push_back(image_task); |
| 110 } |
| 111 |
| 112 ScheduleRasterTasks(&raster_tasks); |
| 113 } |
| 114 |
| 115 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
| 116 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 117 bool was_canceled) { |
| 118 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", |
| 119 "was_canceled", was_canceled); |
| 120 |
| 121 DCHECK(image_tasks_.find(task) != image_tasks_.end()); |
| 122 |
| 123 // Balanced with MapImage() call in ScheduleTasks(). |
| 124 resource_provider_->UnmapImage(task->resource()->id()); |
| 125 |
| 126 // Bind image to resource. |
| 127 resource_provider_->BindImage(task->resource()->id()); |
| 128 |
| 129 if (!was_canceled) |
| 130 task->DidRun(); |
| 131 |
| 132 DidFinishRasterTask(task); |
| 133 image_tasks_.erase(task); |
| 134 } |
| 135 |
| 136 void ImageRasterWorkerPool::DidFinishRasterTask( |
| 137 internal::RasterWorkerPoolTask* task) { |
| 138 task->DidComplete(); |
| 139 task->DispatchCompletionCallback(); |
| 140 } |
| 141 |
| 142 } // namespace cc |
OLD | NEW |