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.
5 #include "cc/resources/raster_worker_pool.h"
10 #include "cc/resources/image_raster_worker_pool.h"
11 #include "cc/resources/picture_pile.h"
12 #include "cc/resources/picture_pile_impl.h"
13 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
14 #include "cc/resources/resource_provider.h"
15 #include "cc/resources/scoped_resource.h"
16 #include "cc/test/fake_output_surface.h"
17 #include "cc/test/fake_output_surface_client.h"
18 #include "cc/test/test_web_graphics_context_3d.h"
19 #include "testing/gtest/include/gtest/gtest.h"
23 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
25 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis,
27 bool did_raster)> Reply;
29 TestRasterWorkerPoolTaskImpl(
30 const Resource* resource,
32 TaskVector* dependencies)
33 : internal::RasterWorkerPoolTask(resource, dependencies),
37 // Overridden from internal::WorkerPoolTask:
38 virtual bool RunOnWorkerThread(unsigned thread_index,
41 int stride) OVERRIDE {
45 virtual void CompleteOnOriginThread() OVERRIDE {
46 reply_.Run(PicturePileImpl::Analysis(), !HasFinishedRunning(), did_raster_);
50 virtual ~TestRasterWorkerPoolTaskImpl() {}
56 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl);
59 class RasterWorkerPoolTest : public testing::Test,
60 public RasterWorkerPoolClient {
62 RasterWorkerPoolTest()
63 : context_provider_(TestContextProvider::Create()),
64 check_interval_milliseconds_(1),
67 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
68 CHECK(output_surface_->BindToClient(&output_surface_client_));
70 resource_provider_ = ResourceProvider::Create(
71 output_surface_.get(), NULL, 0, false, 1).Pass();
73 virtual ~RasterWorkerPoolTest() {
74 resource_provider_.reset();
77 // Overridden from testing::Test:
78 virtual void TearDown() OVERRIDE {
79 if (!raster_worker_pool_)
81 raster_worker_pool_->Shutdown();
82 raster_worker_pool_->CheckForCompletedTasks();
85 // Overriden from RasterWorkerPoolClient:
86 virtual bool ShouldForceTasksRequiredForActivationToComplete() const
90 virtual void DidFinishRunningTasks() OVERRIDE {}
91 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
93 virtual void BeginTest() = 0;
94 virtual void AfterTest() = 0;
96 ResourceProvider* resource_provider() const {
97 return resource_provider_.get();
100 RasterWorkerPool* worker_pool() {
101 return raster_worker_pool_.get();
104 void RunTest(bool use_map_image) {
106 raster_worker_pool_ = ImageRasterWorkerPool::Create(
107 resource_provider(), 1);
109 raster_worker_pool_ =
110 PixelBufferRasterWorkerPool::Create(
113 std::numeric_limits<size_t>::max());
116 raster_worker_pool_->SetClient(this);
120 ScheduleCheckForCompletedTasks();
122 if (timeout_seconds_) {
123 timeout_.Reset(base::Bind(&RasterWorkerPoolTest::OnTimeout,
124 base::Unretained(this)));
125 base::MessageLoopProxy::current()->PostDelayedTask(
128 base::TimeDelta::FromSeconds(timeout_seconds_));
131 base::MessageLoop::current()->Run();
137 FAIL() << "Test timed out";
144 base::MessageLoop::current()->Quit();
147 void ScheduleTasks() {
148 RasterWorkerPool::RasterTask::Queue tasks;
150 for (std::vector<RasterWorkerPool::RasterTask>::iterator it =
152 it != tasks_.end(); ++it)
153 tasks.Append(*it, false);
155 worker_pool()->ScheduleTasks(&tasks);
158 void AppendTask(unsigned id) {
159 const gfx::Size size(1, 1);
161 scoped_ptr<ScopedResource> resource(
162 ScopedResource::create(resource_provider()));
163 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
164 const Resource* const_resource = resource.get();
166 RasterWorkerPool::Task::Set empty;
168 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl(
170 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
171 base::Unretained(this),
172 base::Passed(&resource),
177 virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
179 const PicturePileImpl::Analysis& analysis,
184 void ScheduleCheckForCompletedTasks() {
185 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks,
186 base::Unretained(this)));
187 base::MessageLoopProxy::current()->PostDelayedTask(
190 base::TimeDelta::FromMilliseconds(check_interval_milliseconds_));
193 void OnCheckForCompletedTasks() {
194 raster_worker_pool_->CheckForCompletedTasks();
195 ScheduleCheckForCompletedTasks();
200 base::MessageLoop::current()->Quit();
204 scoped_refptr<TestContextProvider> context_provider_;
205 FakeOutputSurfaceClient output_surface_client_;
206 scoped_ptr<FakeOutputSurface> output_surface_;
207 scoped_ptr<ResourceProvider> resource_provider_;
208 scoped_ptr<RasterWorkerPool> raster_worker_pool_;
209 base::CancelableClosure check_;
210 int check_interval_milliseconds_;
211 base::CancelableClosure timeout_;
212 int timeout_seconds_;
214 std::vector<RasterWorkerPool::RasterTask> tasks_;
219 #define PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME) \
220 TEST_F(TEST_FIXTURE_NAME, RunPixelBuffer) { \
224 #define IMAGE_TEST_F(TEST_FIXTURE_NAME) \
225 TEST_F(TEST_FIXTURE_NAME, RunImage) { \
229 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \
230 PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME); \
231 IMAGE_TEST_F(TEST_FIXTURE_NAME)
233 class BasicRasterWorkerPoolTest : public RasterWorkerPoolTest {
235 virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
237 const PicturePileImpl::Analysis& analysis,
239 bool did_raster) OVERRIDE {
240 EXPECT_TRUE(did_raster);
241 on_task_completed_ids_.push_back(id);
242 if (on_task_completed_ids_.size() == 2)
246 // Overridden from RasterWorkerPoolTest:
247 virtual void BeginTest() OVERRIDE {
252 virtual void AfterTest() OVERRIDE {
253 EXPECT_EQ(2u, on_task_completed_ids_.size());
257 std::vector<unsigned> on_task_completed_ids_;
260 PIXEL_BUFFER_AND_IMAGE_TEST_F(BasicRasterWorkerPoolTest);
262 class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest {
264 virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
266 const PicturePileImpl::Analysis& analysis,
268 bool did_raster) OVERRIDE {
269 EXPECT_FALSE(did_raster);
273 // Overridden from RasterWorkerPoolTest:
274 virtual void BeginTest() OVERRIDE {
275 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
276 context3d->set_times_map_image_chromium_succeeds(0);
277 context3d->set_times_map_buffer_chromium_succeeds(0);
282 virtual void AfterTest() OVERRIDE {
283 ASSERT_EQ(1u, tasks_.size());
288 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource);