Chromium Code Reviews| 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 "cc/resources/resource.h" | |
| 8 #include "third_party/skia/include/core/SkDevice.h" | |
| 9 | |
| 10 namespace cc { | |
| 11 | |
| 12 namespace { | |
| 13 | |
| 14 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { | |
| 15 public: | |
| 16 // First callback parameter is true when task was canceled. | |
| 17 typedef base::Callback<void(bool)> 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 | |
| 56 } // namespace | |
| 57 | |
| 58 ImageRasterWorkerPool::ImageRasterWorkerPool( | |
| 59 ResourceProvider* resource_provider, size_t num_threads) | |
| 60 : RasterWorkerPool(resource_provider, num_threads) { | |
| 61 // TODO(reveman): Remove WorkerPool client interface. | |
| 62 WorkerPool::SetClient(this); | |
| 63 } | |
| 64 | |
| 65 ImageRasterWorkerPool::~ImageRasterWorkerPool() { | |
| 66 DCHECK_EQ(0u, image_tasks_.size()); | |
| 67 } | |
| 68 | |
| 69 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | |
| 70 internal::WorkerPoolTask::TaskVector raster_tasks; | |
| 71 | |
| 72 RasterWorkerPool::SetRasterTasks(queue); | |
| 73 | |
| 74 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin(); | |
| 75 it != raster_tasks_.end(); ++it) { | |
| 76 internal::RasterWorkerPoolTask* task = *it; | |
| 77 | |
| 78 TaskMap::iterator image_it = image_tasks_.find(task); | |
| 79 if (image_it != image_tasks_.end()) { | |
| 80 internal::WorkerPoolTask* image_task = image_it->second; | |
| 81 raster_tasks.push_back(image_task); | |
| 82 continue; | |
| 83 } | |
| 84 | |
| 85 // Acquire image for resource. | |
| 86 resource_provider_->AcquireImage(task->resource()->id()); | |
| 87 | |
| 88 // Map image for raster. | |
| 89 uint8* buffer = resource_provider_->MapImage(task->resource()->id()); | |
| 90 int stride = resource_provider_->GetImageStride(task->resource()->id()); | |
| 91 | |
| 92 // TODO(reveman): Avoid having to make a copy of dependencies. | |
| 93 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); | |
| 94 scoped_refptr<internal::WorkerPoolTask> image_task( | |
| 95 new ImageWorkerPoolTaskImpl( | |
| 96 task, | |
| 97 &dependencies, | |
| 98 buffer, | |
| 99 stride, | |
| 100 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, | |
| 101 base::Unretained(this), | |
| 102 make_scoped_refptr(task)))); | |
| 103 | |
| 104 image_tasks_[task] = image_task; | |
| 105 raster_tasks.push_back(image_task); | |
| 106 } | |
| 107 | |
| 108 ScheduleRasterTasks(&raster_tasks); | |
| 109 } | |
| 110 | |
| 111 void ImageRasterWorkerPool::OnRasterTaskCompleted( | |
| 112 scoped_refptr<internal::RasterWorkerPoolTask> task, | |
| 113 bool was_canceled) { | |
| 114 DCHECK(image_tasks_.find(task) != image_tasks_.end()); | |
| 115 | |
| 116 // Balanced with MapImage() call in ScheduleTasks(). | |
| 117 resource_provider_->UnmapImage(task->resource()->id()); | |
| 118 | |
| 119 // Bind image to resource. | |
| 120 resource_provider_->BindImage(task->resource()->id()); | |
|
kaanb
2013/05/30 18:48:36
Should we still bind if the task was canceled?
reveman
2013/05/30 23:25:18
this is essentially the same as the needs_bind con
| |
| 121 | |
| 122 if (!was_canceled) | |
| 123 task->DidRun(); | |
| 124 | |
| 125 DidFinishRasterTask(task); | |
| 126 image_tasks_.erase(task); | |
| 127 } | |
| 128 | |
| 129 void ImageRasterWorkerPool::DidFinishRasterTask( | |
| 130 internal::RasterWorkerPoolTask* task) { | |
| 131 task->DidComplete(); | |
| 132 task->DispatchCompletionCallback(); | |
| 133 } | |
| 134 | |
| 135 } // namespace cc | |
| OLD | NEW |