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

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: pass unit tests 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 RootWorkerPoolTaskImpl : public internal::WorkerPoolTask {
vmpstr 2013/05/29 16:55:03 EmptyWorkerPoolTaskImpl? Also it might be worth ma
reveman 2013/05/29 19:39:12 Maybe we just make internal::WorkerPoolTask a full
vmpstr 2013/05/29 20:45:06 That works. I would suspect that any other uses of
reveman 2013/05/30 01:46:10 I ended up doing something a bit different in the
14 public:
15 explicit RootWorkerPoolTaskImpl(
16 internal::WorkerPoolTask::TaskVector* dependencies)
17 : internal::WorkerPoolTask(dependencies) {
18 }
19
20 // Overridden from internal::WorkerPoolTask:
21 virtual void RunOnThread(unsigned thread_index) OVERRIDE {}
22 virtual void DispatchCompletionCallback() OVERRIDE {}
23
24 private:
25 virtual ~RootWorkerPoolTaskImpl() {}
26 };
27
28 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
29 public:
30 // First callback parameter is true when task was canceled. Second is
31 // true when bind is needed.
32 typedef base::Callback<void(bool, bool)> Reply;
33
34 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
35 TaskVector* dependencies,
36 uint8_t* buffer,
37 const Reply& reply)
38 : internal::WorkerPoolTask(dependencies),
39 task_(task),
40 buffer_(buffer),
41 reply_(reply),
42 need_bind_(false) {
43 }
44
45 // Overridden from internal::WorkerPoolTask:
46 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
47 need_bind_ = task_->RunOnThread(buffer_, thread_index);
48 }
49 virtual void DispatchCompletionCallback() OVERRIDE {
kaanb 2013/05/29 21:04:15 nit: space between methods
reveman 2013/05/30 01:46:10 Using no space here to make it clear they are both
50 DCHECK(need_bind_ || !HasFinishedRunning());
51 reply_.Run(!HasFinishedRunning(), need_bind_);
52 }
53
54 private:
55 virtual ~ImageWorkerPoolTaskImpl() {}
56
57 scoped_refptr<internal::RasterWorkerPoolTask> task_;
58 uint8_t* buffer_;
59 const Reply reply_;
60 bool need_bind_;
61 };
62
63 } // namespace
64
65 ImageRasterWorkerPool::ImageRasterWorkerPool(
66 ResourceProvider* resource_provider, size_t num_threads)
67 : RasterWorkerPool(resource_provider, num_threads) {
68 // TODO(reveman): Remove WorkerPool client interface.
69 WorkerPool::SetClient(this);
70 }
71
72 ImageRasterWorkerPool::~ImageRasterWorkerPool() {
73 }
74
75 void ImageRasterWorkerPool::Shutdown() {
76 RasterWorkerPool::Shutdown();
77 }
78
79 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
80 internal::WorkerPoolTask::TaskVector tasks;
81
82 RasterWorkerPool::SetRasterTasks(queue);
83
84 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin();
kaanb 2013/05/29 21:04:15 do we support for-each syntax for Chromium?, i.e.
reveman 2013/05/30 01:46:10 c++0x syntax not allowed afaik.
85 it != raster_tasks_.end(); ++it) {
86 internal::RasterWorkerPoolTask* task = *it;
87
88 // Acquire image for resource.
89 resource_provider_->AcquireImage(task->resource()->id());
90
91 // Map image for raster.
92 uint8* buffer = resource_provider_->MapImage(task->resource()->id());
93
94 // TODO(reveman): Avoid having to make a copy of dependencies.
95 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies();
96 scoped_refptr<internal::WorkerPoolTask> image_task(
97 new ImageWorkerPoolTaskImpl(
98 task,
99 &dependencies,
100 buffer,
101 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted,
102 base::Unretained(this),
103 make_scoped_refptr(task))));
104
105 tasks.push_back(image_task);
106 }
107
108 if (tasks.empty()) {
109 WorkerPool::ScheduleTasks(NULL);
110 return;
111 }
112
113 scoped_refptr<RootWorkerPoolTaskImpl> root(
114 new RootWorkerPoolTaskImpl(&tasks));
115 WorkerPool::ScheduleTasks(root);
116 }
117
118 void ImageRasterWorkerPool::
119 DidFinishDispatchingWorkerPoolCompletionCallbacks() {
120 client_->DidFinishDispatchingRasterWorkerPoolCompletionCallbacks();
121 }
122
123 void ImageRasterWorkerPool::OnRasterTaskCompleted(
124 scoped_refptr<internal::RasterWorkerPoolTask> task,
125 bool was_canceled,
126 bool need_bind) {
127 // Balanced with MapImage() call in ScheduleTasks().
128 resource_provider_->UnmapImage(task->resource()->id());
129
130 if (need_bind)
kaanb 2013/05/29 21:04:15 Should we just unconditionally bind when we acquir
reveman 2013/05/30 01:46:10 Good point. I removed it from the latest patch.
131 resource_provider_->BindImage(task->resource()->id());
132
133 if (!was_canceled)
134 task->DidRun();
135
136 DidFinishRasterTask(task);
137 }
138
139 void ImageRasterWorkerPool::DidFinishRasterTask(
140 internal::RasterWorkerPoolTask* task) {
141 task->DidComplete();
142 task->DispatchCompletionCallback();
143 }
144
145 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698