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 raster_tasks.push_back(image_task); | |
boliu
2013/05/30 03:30:44
I *think* needs
image_tasks_[task] = image_task;
reveman
2013/05/30 03:55:42
good catch. now fixed.
| |
105 } | |
106 | |
107 ScheduleRasterTasks(&raster_tasks); | |
108 } | |
109 | |
110 void ImageRasterWorkerPool::OnRasterTaskCompleted( | |
111 scoped_refptr<internal::RasterWorkerPoolTask> task, | |
112 bool was_canceled) { | |
113 DCHECK(image_tasks_.find(task) != image_tasks_.end()); | |
114 | |
115 // Balanced with MapImage() call in ScheduleTasks(). | |
116 resource_provider_->UnmapImage(task->resource()->id()); | |
117 | |
118 // Bind image to resource. | |
119 resource_provider_->BindImage(task->resource()->id()); | |
120 | |
121 if (!was_canceled) | |
122 task->DidRun(); | |
123 | |
124 DidFinishRasterTask(task); | |
125 image_tasks_.erase(task); | |
126 } | |
127 | |
128 void ImageRasterWorkerPool::DidFinishRasterTask( | |
129 internal::RasterWorkerPoolTask* task) { | |
130 task->DidComplete(); | |
131 task->DispatchCompletionCallback(); | |
132 } | |
133 | |
134 } // namespace cc | |
OLD | NEW |