Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(410)

Side by Side Diff: cc/resources/image_raster_worker_pool.cc

Issue 16190002: cc: Add new RasterWorkerPool interface. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Remove RasterWorkerPoolClient interface Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
9 namespace cc {
10
11 namespace {
12
13 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
14 public:
15 // First callback parameter is true when task was canceled.
16 typedef base::Callback<void(bool)> Reply;
17
18 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
19 TaskVector* dependencies,
20 uint8_t* buffer,
21 const Reply& reply)
22 : internal::WorkerPoolTask(dependencies),
23 task_(task),
24 buffer_(buffer),
25 reply_(reply) {
26 }
27
28 // Overridden from internal::WorkerPoolTask:
29 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
30 task_->RunOnThread(buffer_, thread_index);
31 }
32 virtual void DispatchCompletionCallback() OVERRIDE {
33 reply_.Run(!HasFinishedRunning());
34 }
35
36 private:
37 virtual ~ImageWorkerPoolTaskImpl() {}
38
39 scoped_refptr<internal::RasterWorkerPoolTask> task_;
40 uint8_t* buffer_;
41 const Reply reply_;
42 };
43
44 } // namespace
45
46 ImageRasterWorkerPool::ImageRasterWorkerPool(
47 ResourceProvider* resource_provider, size_t num_threads)
48 : RasterWorkerPool(resource_provider, num_threads) {
49 // TODO(reveman): Remove WorkerPool client interface.
50 WorkerPool::SetClient(this);
51 }
52
53 ImageRasterWorkerPool::~ImageRasterWorkerPool() {
54 DCHECK_EQ(0u, image_tasks_.size());
55 }
56
57 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
58 internal::WorkerPoolTask::TaskVector raster_tasks;
59
60 RasterWorkerPool::SetRasterTasks(queue);
61
62 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin();
63 it != raster_tasks_.end(); ++it) {
64 internal::RasterWorkerPoolTask* task = *it;
65
66 TaskMap::iterator image_it = image_tasks_.find(task);
67 if (image_it != image_tasks_.end()) {
68 internal::WorkerPoolTask* image_task = image_it->second;
69 raster_tasks.push_back(image_task);
70 continue;
71 }
72
73 // Acquire image for resource.
74 resource_provider_->AcquireImage(task->resource()->id());
75
76 // Map image for raster.
77 uint8* buffer = resource_provider_->MapImage(task->resource()->id());
78
79 // TODO(reveman): Avoid having to make a copy of dependencies.
80 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies();
81 scoped_refptr<internal::WorkerPoolTask> image_task(
82 new ImageWorkerPoolTaskImpl(
83 task,
84 &dependencies,
85 buffer,
86 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted,
87 base::Unretained(this),
88 make_scoped_refptr(task))));
89
90 raster_tasks.push_back(image_task);
91 }
92
93 ScheduleRasterTasks(&raster_tasks);
94 }
95
96 void ImageRasterWorkerPool::OnRasterTaskCompleted(
97 scoped_refptr<internal::RasterWorkerPoolTask> task,
98 bool was_canceled) {
99 DCHECK(image_tasks_.find(task) != image_tasks_.end());
100
101 // Balanced with MapImage() call in ScheduleTasks().
102 resource_provider_->UnmapImage(task->resource()->id());
103
104 // Bind image to resource.
105 resource_provider_->BindImage(task->resource()->id());
106
107 if (!was_canceled)
108 task->DidRun();
109
110 DidFinishRasterTask(task);
111 image_tasks_.erase(task);
112 }
113
114 void ImageRasterWorkerPool::DidFinishRasterTask(
115 internal::RasterWorkerPoolTask* task) {
116 task->DidComplete();
117 task->DispatchCompletionCallback();
118 }
119
120 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698