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

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

Issue 228173002: cc: Separate RasterWorkerPool interface from implementation details. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/raster_worker_pool_perftest.cc ('k') | cc/resources/rasterizer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/cancelable_callback.h" 10 #include "base/cancelable_callback.h"
11 #include "cc/resources/direct_raster_worker_pool.h" 11 #include "cc/resources/direct_raster_worker_pool.h"
12 #include "cc/resources/image_raster_worker_pool.h" 12 #include "cc/resources/image_raster_worker_pool.h"
13 #include "cc/resources/picture_pile.h" 13 #include "cc/resources/picture_pile.h"
14 #include "cc/resources/picture_pile_impl.h" 14 #include "cc/resources/picture_pile_impl.h"
15 #include "cc/resources/pixel_buffer_raster_worker_pool.h" 15 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
16 #include "cc/resources/rasterizer.h"
16 #include "cc/resources/resource_provider.h" 17 #include "cc/resources/resource_provider.h"
17 #include "cc/resources/scoped_resource.h" 18 #include "cc/resources/scoped_resource.h"
18 #include "cc/test/fake_output_surface.h" 19 #include "cc/test/fake_output_surface.h"
19 #include "cc/test/fake_output_surface_client.h" 20 #include "cc/test/fake_output_surface_client.h"
20 #include "cc/test/test_shared_bitmap_manager.h" 21 #include "cc/test/test_shared_bitmap_manager.h"
21 #include "cc/test/test_web_graphics_context_3d.h" 22 #include "cc/test/test_web_graphics_context_3d.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
23 24
24 namespace cc { 25 namespace cc {
25 namespace { 26 namespace {
26 27
27 enum RasterThread { 28 enum RasterThread {
28 RASTER_THREAD_NONE, 29 RASTER_THREAD_NONE,
29 RASTER_THREAD_ORIGIN, 30 RASTER_THREAD_ORIGIN,
30 RASTER_THREAD_WORKER 31 RASTER_THREAD_WORKER
31 }; 32 };
32 33
33 enum RasterWorkerPoolType { 34 enum RasterWorkerPoolType {
34 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, 35 RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
35 RASTER_WORKER_POOL_TYPE_IMAGE, 36 RASTER_WORKER_POOL_TYPE_IMAGE,
36 RASTER_WORKER_POOL_TYPE_DIRECT 37 RASTER_WORKER_POOL_TYPE_DIRECT
37 }; 38 };
38 39
39 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { 40 class TestRasterTaskImpl : public internal::RasterTask {
40 public: 41 public:
41 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, 42 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis,
42 bool was_canceled, 43 bool was_canceled,
43 RasterThread raster_thread)> Reply; 44 RasterThread raster_thread)> Reply;
44 45
45 TestRasterWorkerPoolTaskImpl(const Resource* resource, 46 TestRasterTaskImpl(const Resource* resource,
46 const Reply& reply, 47 const Reply& reply,
47 internal::WorkerPoolTask::Vector* dependencies) 48 internal::ImageDecodeTask::Vector* dependencies)
48 : internal::RasterWorkerPoolTask(resource, dependencies), 49 : internal::RasterTask(resource, dependencies),
49 reply_(reply), 50 reply_(reply),
50 raster_thread_(RASTER_THREAD_NONE) {} 51 raster_thread_(RASTER_THREAD_NONE) {}
51 52
52 // Overridden from internal::Task: 53 // Overridden from internal::Task:
53 virtual void RunOnWorkerThread() OVERRIDE { 54 virtual void RunOnWorkerThread() OVERRIDE {
54 raster_thread_ = RASTER_THREAD_WORKER; 55 raster_thread_ = RASTER_THREAD_WORKER;
55 } 56 }
56 57
57 // Overridden from internal::WorkerPoolTask: 58 // Overridden from internal::RasterizerTask:
58 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) 59 virtual void ScheduleOnOriginThread(internal::RasterizerTaskClient* client)
59 OVERRIDE { 60 OVERRIDE {
60 client->AcquireCanvasForRaster(this, resource()); 61 client->AcquireCanvasForRaster(this);
61 } 62 }
62 virtual void RunOnOriginThread() OVERRIDE { 63 virtual void RunOnOriginThread() OVERRIDE {
63 raster_thread_ = RASTER_THREAD_ORIGIN; 64 raster_thread_ = RASTER_THREAD_ORIGIN;
64 } 65 }
65 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) 66 virtual void CompleteOnOriginThread(internal::RasterizerTaskClient* client)
66 OVERRIDE { 67 OVERRIDE {
67 client->ReleaseCanvasForRaster(this, resource()); 68 client->ReleaseCanvasForRaster(this);
68 } 69 }
69 virtual void RunReplyOnOriginThread() OVERRIDE { 70 virtual void RunReplyOnOriginThread() OVERRIDE {
70 reply_.Run( 71 reply_.Run(
71 PicturePileImpl::Analysis(), !HasFinishedRunning(), raster_thread_); 72 PicturePileImpl::Analysis(), !HasFinishedRunning(), raster_thread_);
72 } 73 }
73 74
74 protected: 75 protected:
75 virtual ~TestRasterWorkerPoolTaskImpl() {} 76 virtual ~TestRasterTaskImpl() {}
76 77
77 private: 78 private:
78 const Reply reply_; 79 const Reply reply_;
79 RasterThread raster_thread_; 80 RasterThread raster_thread_;
80 81
81 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); 82 DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl);
82 }; 83 };
83 84
84 class BlockingTestRasterWorkerPoolTaskImpl 85 class BlockingTestRasterTaskImpl : public TestRasterTaskImpl {
85 : public TestRasterWorkerPoolTaskImpl {
86 public: 86 public:
87 BlockingTestRasterWorkerPoolTaskImpl( 87 BlockingTestRasterTaskImpl(const Resource* resource,
88 const Resource* resource, 88 const Reply& reply,
89 const Reply& reply, 89 base::Lock* lock,
90 base::Lock* lock, 90 internal::ImageDecodeTask::Vector* dependencies)
91 internal::WorkerPoolTask::Vector* dependencies) 91 : TestRasterTaskImpl(resource, reply, dependencies), lock_(lock) {}
92 : TestRasterWorkerPoolTaskImpl(resource, reply, dependencies),
93 lock_(lock) {}
94 92
95 // Overridden from internal::Task: 93 // Overridden from internal::Task:
96 virtual void RunOnWorkerThread() OVERRIDE { 94 virtual void RunOnWorkerThread() OVERRIDE {
97 base::AutoLock lock(*lock_); 95 base::AutoLock lock(*lock_);
98 TestRasterWorkerPoolTaskImpl::RunOnWorkerThread(); 96 TestRasterTaskImpl::RunOnWorkerThread();
99 } 97 }
100 98
101 // Overridden from internal::WorkerPoolTask: 99 // Overridden from internal::RasterizerTask:
102 virtual void RunReplyOnOriginThread() OVERRIDE {} 100 virtual void RunReplyOnOriginThread() OVERRIDE {}
103 101
104 protected: 102 protected:
105 virtual ~BlockingTestRasterWorkerPoolTaskImpl() {} 103 virtual ~BlockingTestRasterTaskImpl() {}
106 104
107 private: 105 private:
108 base::Lock* lock_; 106 base::Lock* lock_;
109 107
110 DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterWorkerPoolTaskImpl); 108 DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterTaskImpl);
111 }; 109 };
112 110
113 class RasterWorkerPoolTest 111 class RasterWorkerPoolTest
114 : public testing::TestWithParam<RasterWorkerPoolType>, 112 : public testing::TestWithParam<RasterWorkerPoolType>,
115 public RasterWorkerPoolClient { 113 public RasterizerClient {
116 public: 114 public:
117 struct RasterTaskResult { 115 struct RasterTaskResult {
118 unsigned id; 116 unsigned id;
119 bool canceled; 117 bool canceled;
120 RasterThread raster_thread; 118 RasterThread raster_thread;
121 }; 119 };
122 120
123 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > 121 typedef std::vector<scoped_refptr<internal::RasterTask> > RasterTaskVector;
124 RasterTaskVector;
125 122
126 RasterWorkerPoolTest() 123 RasterWorkerPoolTest()
127 : context_provider_(TestContextProvider::Create()), 124 : context_provider_(TestContextProvider::Create()),
128 timeout_seconds_(5), 125 timeout_seconds_(5),
129 timed_out_(false) { 126 timed_out_(false) {
130 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); 127 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
131 CHECK(output_surface_->BindToClient(&output_surface_client_)); 128 CHECK(output_surface_->BindToClient(&output_surface_client_));
132 129
133 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 130 shared_bitmap_manager_.reset(new TestSharedBitmapManager());
134 resource_provider_ = 131 resource_provider_ =
135 ResourceProvider::Create( 132 ResourceProvider::Create(
136 output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1) 133 output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1)
137 .Pass(); 134 .Pass();
138 pixel_buffer_raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
139 base::MessageLoopProxy::current().get(),
140 resource_provider_.get(),
141 std::numeric_limits<size_t>::max());
142 image_raster_worker_pool_ =
143 ImageRasterWorkerPool::Create(base::MessageLoopProxy::current().get(),
144 resource_provider_.get(),
145 GL_TEXTURE_2D);
146 direct_raster_worker_pool_ =
147 DirectRasterWorkerPool::Create(base::MessageLoopProxy::current().get(),
148 resource_provider_.get(),
149 context_provider_.get());
150 135
151 switch (GetParam()) { 136 switch (GetParam()) {
152 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER: 137 case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER:
153 raster_worker_pool_ = pixel_buffer_raster_worker_pool_.get(); 138 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
139 base::MessageLoopProxy::current().get(),
140 RasterWorkerPool::GetTaskGraphRunner(),
141 resource_provider_.get(),
142 std::numeric_limits<size_t>::max());
154 break; 143 break;
155 case RASTER_WORKER_POOL_TYPE_IMAGE: 144 case RASTER_WORKER_POOL_TYPE_IMAGE:
156 raster_worker_pool_ = image_raster_worker_pool_.get(); 145 raster_worker_pool_ = ImageRasterWorkerPool::Create(
146 base::MessageLoopProxy::current().get(),
147 RasterWorkerPool::GetTaskGraphRunner(),
148 resource_provider_.get(),
149 GL_TEXTURE_2D);
157 break; 150 break;
158 case RASTER_WORKER_POOL_TYPE_DIRECT: 151 case RASTER_WORKER_POOL_TYPE_DIRECT:
159 raster_worker_pool_ = direct_raster_worker_pool_.get(); 152 raster_worker_pool_ = DirectRasterWorkerPool::Create(
153 base::MessageLoopProxy::current().get(),
154 resource_provider_.get(),
155 context_provider_.get());
160 break; 156 break;
161 } 157 }
162 158
163 DCHECK(raster_worker_pool_); 159 DCHECK(raster_worker_pool_);
164 raster_worker_pool_->SetClient(this); 160 raster_worker_pool_->AsRasterizer()->SetClient(this);
165 } 161 }
166 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); } 162 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); }
167 163
168 // Overridden from testing::Test: 164 // Overridden from testing::Test:
169 virtual void TearDown() OVERRIDE { 165 virtual void TearDown() OVERRIDE {
170 raster_worker_pool_->Shutdown(); 166 raster_worker_pool_->AsRasterizer()->Shutdown();
171 raster_worker_pool_->CheckForCompletedTasks(); 167 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
172 } 168 }
173 169
174 // Overriden from RasterWorkerPoolClient: 170 // Overriden from RasterWorkerPoolClient:
175 virtual bool ShouldForceTasksRequiredForActivationToComplete() 171 virtual bool ShouldForceTasksRequiredForActivationToComplete() const
176 const OVERRIDE { 172 OVERRIDE {
177 return false; 173 return false;
178 } 174 }
179 virtual void DidFinishRunningTasks() OVERRIDE { 175 virtual void DidFinishRunningTasks() OVERRIDE {
180 raster_worker_pool_->CheckForCompletedTasks(); 176 raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
181 base::MessageLoop::current()->Quit(); 177 base::MessageLoop::current()->Quit();
182 } 178 }
183 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} 179 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
184 180
185 void RunMessageLoopUntilAllTasksHaveCompleted() { 181 void RunMessageLoopUntilAllTasksHaveCompleted() {
186 if (timeout_seconds_) { 182 if (timeout_seconds_) {
187 timeout_.Reset( 183 timeout_.Reset(
188 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this))); 184 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this)));
189 base::MessageLoopProxy::current()->PostDelayedTask( 185 base::MessageLoopProxy::current()->PostDelayedTask(
190 FROM_HERE, 186 FROM_HERE,
191 timeout_.callback(), 187 timeout_.callback(),
192 base::TimeDelta::FromSeconds(timeout_seconds_)); 188 base::TimeDelta::FromSeconds(timeout_seconds_));
193 } 189 }
194 190
195 base::MessageLoop::current()->Run(); 191 base::MessageLoop::current()->Run();
196 192
197 timeout_.Cancel(); 193 timeout_.Cancel();
198 194
199 ASSERT_FALSE(timed_out_) << "Test timed out"; 195 ASSERT_FALSE(timed_out_) << "Test timed out";
200 } 196 }
201 197
202 void ScheduleTasks() { 198 void ScheduleTasks() {
203 RasterTaskQueue queue; 199 RasterTaskQueue queue;
204 200
205 for (RasterTaskVector::const_iterator it = tasks_.begin(); 201 for (RasterTaskVector::const_iterator it = tasks_.begin();
206 it != tasks_.end(); 202 it != tasks_.end();
207 ++it) 203 ++it)
208 queue.items.push_back(RasterTaskQueue::Item(*it, false)); 204 queue.items.push_back(RasterTaskQueue::Item(*it, false));
209 205
210 raster_worker_pool_->ScheduleTasks(&queue); 206 raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
211 } 207 }
212 208
213 void AppendTask(unsigned id) { 209 void AppendTask(unsigned id) {
214 const gfx::Size size(1, 1); 210 const gfx::Size size(1, 1);
215 211
216 scoped_ptr<ScopedResource> resource( 212 scoped_ptr<ScopedResource> resource(
217 ScopedResource::Create(resource_provider_.get())); 213 ScopedResource::Create(resource_provider_.get()));
218 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); 214 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
219 const Resource* const_resource = resource.get(); 215 const Resource* const_resource = resource.get();
220 216
221 internal::WorkerPoolTask::Vector empty; 217 internal::ImageDecodeTask::Vector empty;
222 tasks_.push_back(new TestRasterWorkerPoolTaskImpl( 218 tasks_.push_back(new TestRasterTaskImpl(
223 const_resource, 219 const_resource,
224 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, 220 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
225 base::Unretained(this), 221 base::Unretained(this),
226 base::Passed(&resource), 222 base::Passed(&resource),
227 id), 223 id),
228 &empty)); 224 &empty));
229 } 225 }
230 226
231 void AppendBlockingTask(unsigned id, base::Lock* lock) { 227 void AppendBlockingTask(unsigned id, base::Lock* lock) {
232 const gfx::Size size(1, 1); 228 const gfx::Size size(1, 1);
233 229
234 scoped_ptr<ScopedResource> resource( 230 scoped_ptr<ScopedResource> resource(
235 ScopedResource::Create(resource_provider_.get())); 231 ScopedResource::Create(resource_provider_.get()));
236 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); 232 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
237 const Resource* const_resource = resource.get(); 233 const Resource* const_resource = resource.get();
238 234
239 internal::WorkerPoolTask::Vector empty; 235 internal::ImageDecodeTask::Vector empty;
240 tasks_.push_back(new BlockingTestRasterWorkerPoolTaskImpl( 236 tasks_.push_back(new BlockingTestRasterTaskImpl(
241 const_resource, 237 const_resource,
242 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, 238 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
243 base::Unretained(this), 239 base::Unretained(this),
244 base::Passed(&resource), 240 base::Passed(&resource),
245 id), 241 id),
246 lock, 242 lock,
247 &empty)); 243 &empty));
248 } 244 }
249 245
250 const std::vector<RasterTaskResult>& completed_tasks() const { 246 const std::vector<RasterTaskResult>& completed_tasks() const {
(...skipping 17 matching lines...) Expand all
268 timed_out_ = true; 264 timed_out_ = true;
269 base::MessageLoop::current()->Quit(); 265 base::MessageLoop::current()->Quit();
270 } 266 }
271 267
272 protected: 268 protected:
273 scoped_refptr<TestContextProvider> context_provider_; 269 scoped_refptr<TestContextProvider> context_provider_;
274 FakeOutputSurfaceClient output_surface_client_; 270 FakeOutputSurfaceClient output_surface_client_;
275 scoped_ptr<FakeOutputSurface> output_surface_; 271 scoped_ptr<FakeOutputSurface> output_surface_;
276 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 272 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
277 scoped_ptr<ResourceProvider> resource_provider_; 273 scoped_ptr<ResourceProvider> resource_provider_;
278 scoped_ptr<PixelBufferRasterWorkerPool> pixel_buffer_raster_worker_pool_; 274 scoped_ptr<RasterWorkerPool> raster_worker_pool_;
279 scoped_ptr<ImageRasterWorkerPool> image_raster_worker_pool_;
280 scoped_ptr<DirectRasterWorkerPool> direct_raster_worker_pool_;
281 RasterWorkerPool* raster_worker_pool_;
282 base::CancelableClosure timeout_; 275 base::CancelableClosure timeout_;
283 int timeout_seconds_; 276 int timeout_seconds_;
284 bool timed_out_; 277 bool timed_out_;
285 RasterTaskVector tasks_; 278 RasterTaskVector tasks_;
286 std::vector<RasterTaskResult> completed_tasks_; 279 std::vector<RasterTaskResult> completed_tasks_;
287 }; 280 };
288 281
289 TEST_P(RasterWorkerPoolTest, Basic) { 282 TEST_P(RasterWorkerPoolTest, Basic) {
290 AppendTask(0u); 283 AppendTask(0u);
291 AppendTask(1u); 284 AppendTask(1u);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 } 332 }
340 333
341 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests, 334 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests,
342 RasterWorkerPoolTest, 335 RasterWorkerPoolTest,
343 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER, 336 ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
344 RASTER_WORKER_POOL_TYPE_IMAGE, 337 RASTER_WORKER_POOL_TYPE_IMAGE,
345 RASTER_WORKER_POOL_TYPE_DIRECT)); 338 RASTER_WORKER_POOL_TYPE_DIRECT));
346 339
347 } // namespace 340 } // namespace
348 } // namespace cc 341 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/raster_worker_pool_perftest.cc ('k') | cc/resources/rasterizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698