OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 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/raster_worker_pool.h" |
| 6 |
| 7 #include <vector> |
| 8 |
| 9 #include "cc/resources/image_raster_worker_pool.h" |
| 10 #include "cc/resources/picture_pile.h" |
| 11 #include "cc/resources/picture_pile_impl.h" |
| 12 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 13 #include "cc/resources/resource_provider.h" |
| 14 #include "cc/resources/scoped_resource.h" |
| 15 #include "cc/test/fake_output_surface.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 |
| 18 namespace cc { |
| 19 |
| 20 namespace { |
| 21 |
| 22 class RasterWorkerPoolTest : public testing::Test { |
| 23 public: |
| 24 RasterWorkerPoolTest() |
| 25 : output_surface_(FakeOutputSurface::Create3d()), |
| 26 resource_provider_( |
| 27 ResourceProvider::Create(output_surface_.get(), 0)), |
| 28 check_interval_milliseconds_(1), |
| 29 timeout_seconds_(5), |
| 30 timed_out_(false) { |
| 31 } |
| 32 virtual ~RasterWorkerPoolTest() { |
| 33 resource_provider_.reset(); |
| 34 } |
| 35 |
| 36 // Overridden from testing::Test: |
| 37 virtual void TearDown() OVERRIDE { |
| 38 if (!raster_worker_pool_) |
| 39 return; |
| 40 raster_worker_pool_->Shutdown(); |
| 41 raster_worker_pool_->CheckForCompletedTasks(); |
| 42 } |
| 43 |
| 44 virtual void BeginTest() = 0; |
| 45 virtual void AfterTest() = 0; |
| 46 |
| 47 ResourceProvider* resource_provider() const { |
| 48 return resource_provider_.get(); |
| 49 } |
| 50 |
| 51 RasterWorkerPool* worker_pool() { |
| 52 return raster_worker_pool_.get(); |
| 53 } |
| 54 |
| 55 void RunTest(bool use_map_image) { |
| 56 if (use_map_image) { |
| 57 raster_worker_pool_ = ImageRasterWorkerPool::Create( |
| 58 resource_provider(), 1); |
| 59 } else { |
| 60 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( |
| 61 resource_provider(), 1); |
| 62 } |
| 63 |
| 64 BeginTest(); |
| 65 |
| 66 ScheduleCheckForCompletedTasks(); |
| 67 |
| 68 if (timeout_seconds_) { |
| 69 timeout_.Reset(base::Bind(&RasterWorkerPoolTest::OnTimeout, |
| 70 base::Unretained(this))); |
| 71 base::MessageLoopProxy::current()->PostDelayedTask( |
| 72 FROM_HERE, |
| 73 timeout_.callback(), |
| 74 base::TimeDelta::FromSeconds(timeout_seconds_)); |
| 75 } |
| 76 |
| 77 base::MessageLoop::current()->Run(); |
| 78 |
| 79 check_.Cancel(); |
| 80 timeout_.Cancel(); |
| 81 |
| 82 if (timed_out_) { |
| 83 FAIL() << "Test timed out"; |
| 84 return; |
| 85 } |
| 86 AfterTest(); |
| 87 } |
| 88 |
| 89 void EndTest() { |
| 90 base::MessageLoop::current()->Quit(); |
| 91 } |
| 92 |
| 93 private: |
| 94 void ScheduleCheckForCompletedTasks() { |
| 95 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, |
| 96 base::Unretained(this))); |
| 97 base::MessageLoopProxy::current()->PostDelayedTask( |
| 98 FROM_HERE, |
| 99 check_.callback(), |
| 100 base::TimeDelta::FromMilliseconds(check_interval_milliseconds_)); |
| 101 } |
| 102 |
| 103 void OnCheckForCompletedTasks() { |
| 104 raster_worker_pool_->CheckForCompletedTasks(); |
| 105 ScheduleCheckForCompletedTasks(); |
| 106 } |
| 107 |
| 108 void OnTimeout() { |
| 109 timed_out_ = true; |
| 110 base::MessageLoop::current()->Quit(); |
| 111 } |
| 112 |
| 113 scoped_ptr<FakeOutputSurface> output_surface_; |
| 114 scoped_ptr<ResourceProvider> resource_provider_; |
| 115 scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
| 116 base::CancelableClosure check_; |
| 117 int check_interval_milliseconds_; |
| 118 base::CancelableClosure timeout_; |
| 119 int timeout_seconds_; |
| 120 bool timed_out_; |
| 121 }; |
| 122 |
| 123 #define PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME) \ |
| 124 TEST_F(TEST_FIXTURE_NAME, RunPixelBuffer) { \ |
| 125 RunTest(false); \ |
| 126 } |
| 127 |
| 128 #define IMAGE_TEST_F(TEST_FIXTURE_NAME) \ |
| 129 TEST_F(TEST_FIXTURE_NAME, RunImage) { \ |
| 130 RunTest(true); \ |
| 131 } |
| 132 |
| 133 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \ |
| 134 PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME); \ |
| 135 IMAGE_TEST_F(TEST_FIXTURE_NAME) |
| 136 |
| 137 class BasicRasterWorkerPoolTest : public RasterWorkerPoolTest { |
| 138 public: |
| 139 bool RunRasterTask(SkDevice* device, PicturePileImpl* picture_pile) { |
| 140 return true; |
| 141 } |
| 142 |
| 143 void OnTaskCompleted(scoped_ptr<ScopedResource> resource, |
| 144 unsigned id, |
| 145 bool was_canceled) { |
| 146 on_task_completed_ids_.push_back(id); |
| 147 if (on_task_completed_ids_.size() == 2) |
| 148 EndTest(); |
| 149 } |
| 150 |
| 151 void AppendTask(unsigned id) { |
| 152 const gfx::Size size(1, 1); |
| 153 |
| 154 scoped_refptr<PicturePile> picture_pile(new PicturePile); |
| 155 picture_pile->set_num_raster_threads(1); |
| 156 scoped_refptr<PicturePileImpl> picture_pile_impl( |
| 157 PicturePileImpl::CreateFromOther(picture_pile.get(), false)); |
| 158 |
| 159 scoped_ptr<ScopedResource> resource( |
| 160 ScopedResource::create(resource_provider())); |
| 161 resource->Allocate(size, GL_RGBA, ResourceProvider::TextureUsageAny); |
| 162 const Resource* const_resource = resource.get(); |
| 163 |
| 164 RasterWorkerPool::Task::Set empty; |
| 165 tasks_.push_back( |
| 166 RasterWorkerPool::RasterTask( |
| 167 picture_pile_impl, |
| 168 const_resource, |
| 169 base::Bind(&BasicRasterWorkerPoolTest::RunRasterTask, |
| 170 base::Unretained(this)), |
| 171 base::Bind(&BasicRasterWorkerPoolTest::OnTaskCompleted, |
| 172 base::Unretained(this), |
| 173 base::Passed(&resource), |
| 174 id), |
| 175 &empty)); |
| 176 } |
| 177 |
| 178 void ScheduleTasks() { |
| 179 RasterWorkerPool::RasterTask::Queue tasks; |
| 180 |
| 181 for (std::vector<RasterWorkerPool::RasterTask>::iterator it = |
| 182 tasks_.begin(); |
| 183 it != tasks_.end(); ++it) |
| 184 tasks.Append(*it); |
| 185 |
| 186 worker_pool()->ScheduleTasks(&tasks); |
| 187 } |
| 188 |
| 189 // Overridden from RasterWorkerPoolTest: |
| 190 virtual void BeginTest() OVERRIDE { |
| 191 AppendTask(0u); |
| 192 AppendTask(1u); |
| 193 ScheduleTasks(); |
| 194 } |
| 195 virtual void AfterTest() OVERRIDE { |
| 196 EXPECT_EQ(2u, on_task_completed_ids_.size()); |
| 197 tasks_.clear(); |
| 198 } |
| 199 |
| 200 std::vector<RasterWorkerPool::RasterTask> tasks_; |
| 201 std::vector<unsigned> on_task_completed_ids_; |
| 202 }; |
| 203 |
| 204 PIXEL_BUFFER_AND_IMAGE_TEST_F(BasicRasterWorkerPoolTest); |
| 205 |
| 206 } // namespace |
| 207 |
| 208 } // namespace cc |
OLD | NEW |