Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / cc / resources / raster_worker_pool_unittest.cc
index 1f5d95c..9aee8e7 100644 (file)
 #include <limits>
 #include <vector>
 
-#include "cc/resources/image_raster_worker_pool.h"
+#include "base/cancelable_callback.h"
+#include "cc/resources/bitmap_raster_worker_pool.h"
+#include "cc/resources/gpu_raster_worker_pool.h"
+#include "cc/resources/one_copy_raster_worker_pool.h"
 #include "cc/resources/picture_pile.h"
 #include "cc/resources/picture_pile_impl.h"
 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
+#include "cc/resources/raster_buffer.h"
+#include "cc/resources/rasterizer.h"
+#include "cc/resources/resource_pool.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/scoped_resource.h"
+#include "cc/resources/zero_copy_raster_worker_pool.h"
 #include "cc/test/fake_output_surface.h"
 #include "cc/test/fake_output_surface_client.h"
+#include "cc/test/fake_picture_pile_impl.h"
+#include "cc/test/test_gpu_memory_buffer_manager.h"
+#include "cc/test/test_shared_bitmap_manager.h"
 #include "cc/test/test_web_graphics_context_3d.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cc {
+namespace {
+
+const size_t kMaxTransferBufferUsageBytes = 10000U;
+// A resource of this dimension^2 * 4 must be greater than the above transfer
+// buffer constant.
+const size_t kLargeResourceDimension = 1000U;
+
+enum RasterWorkerPoolType {
+  RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
+  RASTER_WORKER_POOL_TYPE_ZERO_COPY,
+  RASTER_WORKER_POOL_TYPE_ONE_COPY,
+  RASTER_WORKER_POOL_TYPE_GPU,
+  RASTER_WORKER_POOL_TYPE_BITMAP
+};
 
-class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
+class TestRasterTaskImpl : public RasterTask {
  public:
-  enum RasterThread {
-    RASTER_THREAD_NONE,
-    RASTER_THREAD_ORIGIN,
-    RASTER_THREAD_WORKER
-  };
-  typedef base::Callback<void(const PicturePileImpl::Analysis& analysis,
-                              bool was_canceled,
-                              RasterThread raster_thread)> Reply;
-
-  TestRasterWorkerPoolTaskImpl(const Resource* resource,
-                               const Reply& reply,
-                               internal::Task::Vector* dependencies,
-                               bool use_gpu_rasterization)
-      : internal::RasterWorkerPoolTask(resource,
-                                       dependencies,
-                                       use_gpu_rasterization),
+  typedef base::Callback<void(const RasterSource::SolidColorAnalysis& analysis,
+                              bool was_canceled)> Reply;
+
+  TestRasterTaskImpl(const Resource* resource,
+                     const Reply& reply,
+                     ImageDecodeTask::Vector* dependencies)
+      : RasterTask(resource, dependencies),
         reply_(reply),
-        raster_thread_(RASTER_THREAD_NONE) {}
-
-  // Overridden from internal::RasterWorkerPoolTask:
-  virtual bool RunOnWorkerThread(unsigned thread_index,
-                                 void* buffer,
-                                 gfx::Size size,
-                                 int stride) OVERRIDE {
-    raster_thread_ = RASTER_THREAD_WORKER;
-    return true;
+        picture_pile_(FakePicturePileImpl::CreateEmptyPile(gfx::Size(1, 1),
+                                                           gfx::Size(1, 1))) {}
+
+  // Overridden from Task:
+  void RunOnWorkerThread() override {
+    raster_buffer_->Playback(picture_pile_.get(), gfx::Rect(0, 0, 1, 1), 1.0);
   }
-  virtual void RunOnOriginThread(ResourceProvider* resource_provider,
-                                 ContextProvider* context_provider) OVERRIDE {
-    raster_thread_ = RASTER_THREAD_ORIGIN;
+
+  // Overridden from RasterizerTask:
+  void ScheduleOnOriginThread(RasterizerTaskClient* client) override {
+    raster_buffer_ = client->AcquireBufferForRaster(resource());
+  }
+  void CompleteOnOriginThread(RasterizerTaskClient* client) override {
+    client->ReleaseBufferForRaster(raster_buffer_.Pass());
   }
-  virtual void CompleteOnOriginThread() OVERRIDE {
-    reply_.Run(PicturePileImpl::Analysis(),
-               !HasFinishedRunning() || WasCanceled(),
-               raster_thread_);
+  void RunReplyOnOriginThread() override {
+    reply_.Run(RasterSource::SolidColorAnalysis(), !HasFinishedRunning());
   }
 
  protected:
-  virtual ~TestRasterWorkerPoolTaskImpl() {}
+  ~TestRasterTaskImpl() override {}
 
  private:
   const Reply reply_;
-  RasterThread raster_thread_;
+  scoped_ptr<RasterBuffer> raster_buffer_;
+  scoped_refptr<PicturePileImpl> picture_pile_;
 
-  DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl);
+  DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl);
 };
 
-class BlockingRasterWorkerPoolTaskImpl : public TestRasterWorkerPoolTaskImpl {
+class BlockingTestRasterTaskImpl : public TestRasterTaskImpl {
  public:
-  BlockingRasterWorkerPoolTaskImpl(const Resource* resource,
-                                   const Reply& reply,
-                                   base::Lock* lock,
-                                   internal::Task::Vector* dependencies,
-                                   bool use_gpu_rasterization)
-      : TestRasterWorkerPoolTaskImpl(resource,
-                                     reply,
-                                     dependencies,
-                                     use_gpu_rasterization),
-        lock_(lock) {}
-
-  // Overridden from internal::RasterWorkerPoolTask:
-  virtual bool RunOnWorkerThread(unsigned thread_index,
-                                 void* buffer,
-                                 gfx::Size size,
-                                 int stride) OVERRIDE {
+  BlockingTestRasterTaskImpl(const Resource* resource,
+                             const Reply& reply,
+                             base::Lock* lock,
+                             ImageDecodeTask::Vector* dependencies)
+      : TestRasterTaskImpl(resource, reply, dependencies), lock_(lock) {}
+
+  // Overridden from Task:
+  void RunOnWorkerThread() override {
     base::AutoLock lock(*lock_);
-    return TestRasterWorkerPoolTaskImpl::RunOnWorkerThread(
-        thread_index, buffer, size, stride);
+    TestRasterTaskImpl::RunOnWorkerThread();
   }
-  virtual void CompleteOnOriginThread() OVERRIDE {}
+
+  // Overridden from RasterizerTask:
+  void RunReplyOnOriginThread() override {}
 
  protected:
-  virtual ~BlockingRasterWorkerPoolTaskImpl() {}
+  ~BlockingTestRasterTaskImpl() override {}
 
  private:
   base::Lock* lock_;
 
-  DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl);
+  DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterTaskImpl);
 };
 
-class RasterWorkerPoolTest : public testing::Test,
-                             public RasterWorkerPoolClient {
+class RasterWorkerPoolTest
+    : public testing::TestWithParam<RasterWorkerPoolType>,
+      public RasterizerClient {
  public:
+  struct RasterTaskResult {
+    unsigned id;
+    bool canceled;
+  };
+
+  typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector;
+
+  enum NamedTaskSet { REQUIRED_FOR_ACTIVATION = 0, ALL = 1 };
+
   RasterWorkerPoolTest()
       : context_provider_(TestContextProvider::Create()),
-        check_interval_milliseconds_(1),
         timeout_seconds_(5),
-        timed_out_(false) {
-    output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
-    CHECK(output_surface_->BindToClient(&output_surface_client_));
-
-    resource_provider_ = ResourceProvider::Create(
-                             output_surface_.get(), NULL, 0, false, 1).Pass();
-  }
-  virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); }
+        timed_out_(false) {}
 
   // Overridden from testing::Test:
-  virtual void TearDown() OVERRIDE {
-    if (!raster_worker_pool_)
-      return;
-    raster_worker_pool_->Shutdown();
-    raster_worker_pool_->CheckForCompletedTasks();
-  }
+  virtual void SetUp() override {
+    switch (GetParam()) {
+      case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER:
+        Create3dOutputSurfaceAndResourceProvider();
+        raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
+            base::MessageLoopProxy::current().get(),
+            RasterWorkerPool::GetTaskGraphRunner(),
+            context_provider_.get(),
+            resource_provider_.get(),
+            kMaxTransferBufferUsageBytes);
+        break;
+      case RASTER_WORKER_POOL_TYPE_ZERO_COPY:
+        Create3dOutputSurfaceAndResourceProvider();
+        raster_worker_pool_ = ZeroCopyRasterWorkerPool::Create(
+            base::MessageLoopProxy::current().get(),
+            RasterWorkerPool::GetTaskGraphRunner(),
+            resource_provider_.get());
+        break;
+      case RASTER_WORKER_POOL_TYPE_ONE_COPY:
+        Create3dOutputSurfaceAndResourceProvider();
+        staging_resource_pool_ = ResourcePool::Create(
+            resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
+        raster_worker_pool_ = OneCopyRasterWorkerPool::Create(
+            base::MessageLoopProxy::current().get(),
+            RasterWorkerPool::GetTaskGraphRunner(),
+            context_provider_.get(),
+            resource_provider_.get(),
+            staging_resource_pool_.get());
+        break;
+      case RASTER_WORKER_POOL_TYPE_GPU:
+        Create3dOutputSurfaceAndResourceProvider();
+        raster_worker_pool_ =
+            GpuRasterWorkerPool::Create(base::MessageLoopProxy::current().get(),
+                                        context_provider_.get(),
+                                        resource_provider_.get(),
+                                        false);
+        break;
+      case RASTER_WORKER_POOL_TYPE_BITMAP:
+        CreateSoftwareOutputSurfaceAndResourceProvider();
+        raster_worker_pool_ = BitmapRasterWorkerPool::Create(
+            base::MessageLoopProxy::current().get(),
+            RasterWorkerPool::GetTaskGraphRunner(),
+            resource_provider_.get());
+        break;
+    }
 
-  // Overriden from RasterWorkerPoolClient:
-  virtual bool ShouldForceTasksRequiredForActivationToComplete()
-      const OVERRIDE {
-    return false;
+    DCHECK(raster_worker_pool_);
+    raster_worker_pool_->AsRasterizer()->SetClient(this);
   }
-  virtual void DidFinishRunningTasks() OVERRIDE {}
-  virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
-
-  virtual void BeginTest() = 0;
-  virtual void AfterTest() = 0;
 
-  ResourceProvider* resource_provider() const {
-    return resource_provider_.get();
+  virtual void TearDown() override {
+    raster_worker_pool_->AsRasterizer()->Shutdown();
+    raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
   }
 
-  RasterWorkerPool* worker_pool() { return raster_worker_pool_.get(); }
-
-  void RunTest(bool use_map_image) {
-    if (use_map_image) {
-      raster_worker_pool_ = ImageRasterWorkerPool::Create(
-          resource_provider(), context_provider_.get(), GL_TEXTURE_2D);
-    } else {
-      raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
-          resource_provider(),
-          context_provider_.get(),
-          std::numeric_limits<size_t>::max());
+  // Overriden from RasterWorkerPoolClient:
+  void DidFinishRunningTasks(TaskSet task_set) override {
+    if (task_set == ALL) {
+      raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
+      base::MessageLoop::current()->Quit();
     }
+  }
+  TaskSetCollection TasksThatShouldBeForcedToComplete() const override {
+    return TaskSetCollection();
+  }
 
-    raster_worker_pool_->SetClient(this);
-
-    BeginTest();
-
-    ScheduleCheckForCompletedTasks();
-
+  void RunMessageLoopUntilAllTasksHaveCompleted() {
     if (timeout_seconds_) {
       timeout_.Reset(
           base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this)));
@@ -171,91 +207,102 @@ class RasterWorkerPoolTest : public testing::Test,
 
     base::MessageLoop::current()->Run();
 
-    check_.Cancel();
     timeout_.Cancel();
 
-    if (timed_out_) {
-      FAIL() << "Test timed out";
-      return;
-    }
-    AfterTest();
+    ASSERT_FALSE(timed_out_) << "Test timed out";
   }
 
-  void EndTest() { base::MessageLoop::current()->Quit(); }
-
   void ScheduleTasks() {
-    RasterWorkerPool::RasterTask::Queue tasks;
+    RasterTaskQueue queue;
 
-    for (std::vector<RasterWorkerPool::RasterTask>::iterator it =
-             tasks_.begin();
+    for (RasterTaskVector::const_iterator it = tasks_.begin();
          it != tasks_.end();
-         ++it)
-      tasks.Append(*it, false);
+         ++it) {
+      TaskSetCollection task_sets;
+      task_sets[ALL] = true;
+      queue.items.push_back(RasterTaskQueue::Item(it->get(), task_sets));
+    }
 
-    worker_pool()->ScheduleTasks(&tasks);
+    raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
   }
 
-  void AppendTask(unsigned id, bool use_gpu_rasterization) {
-    const gfx::Size size(1, 1);
-
+  void AppendTask(unsigned id, const gfx::Size& size) {
     scoped_ptr<ScopedResource> resource(
-        ScopedResource::Create(resource_provider()));
-    resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
+        ScopedResource::Create(resource_provider_.get()));
+    resource->Allocate(size, ResourceProvider::TextureHintImmutable, RGBA_8888);
     const Resource* const_resource = resource.get();
 
-    RasterWorkerPool::Task::Set empty;
-    tasks_.push_back(
-        RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl(
-            const_resource,
-            base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
-                       base::Unretained(this),
-                       base::Passed(&resource),
-                       id),
-            &empty.tasks_,
-            use_gpu_rasterization)));
+    ImageDecodeTask::Vector empty;
+    tasks_.push_back(new TestRasterTaskImpl(
+        const_resource,
+        base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
+                   base::Unretained(this),
+                   base::Passed(&resource),
+                   id),
+        &empty));
   }
 
+  void AppendTask(unsigned id) { AppendTask(id, gfx::Size(1, 1)); }
+
   void AppendBlockingTask(unsigned id, base::Lock* lock) {
     const gfx::Size size(1, 1);
 
     scoped_ptr<ScopedResource> resource(
-        ScopedResource::Create(resource_provider()));
-    resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
+        ScopedResource::Create(resource_provider_.get()));
+    resource->Allocate(size, ResourceProvider::TextureHintImmutable, RGBA_8888);
     const Resource* const_resource = resource.get();
 
-    RasterWorkerPool::Task::Set empty;
-    tasks_.push_back(
-        RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl(
-            const_resource,
-            base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
-                       base::Unretained(this),
-                       base::Passed(&resource),
-                       id),
-            lock,
-            &empty.tasks_,
-            false)));
+    ImageDecodeTask::Vector empty;
+    tasks_.push_back(new BlockingTestRasterTaskImpl(
+        const_resource,
+        base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
+                   base::Unretained(this),
+                   base::Passed(&resource),
+                   id),
+        lock,
+        &empty));
   }
 
-  virtual void OnTaskCompleted(
-      scoped_ptr<ScopedResource> resource,
-      unsigned id,
-      const PicturePileImpl::Analysis& analysis,
-      bool was_canceled,
-      TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) {}
+  const std::vector<RasterTaskResult>& completed_tasks() const {
+    return completed_tasks_;
+  }
 
  private:
-  void ScheduleCheckForCompletedTasks() {
-    check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks,
-                            base::Unretained(this)));
-    base::MessageLoopProxy::current()->PostDelayedTask(
-        FROM_HERE,
-        check_.callback(),
-        base::TimeDelta::FromMilliseconds(check_interval_milliseconds_));
+  void Create3dOutputSurfaceAndResourceProvider() {
+    output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
+    CHECK(output_surface_->BindToClient(&output_surface_client_));
+    TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
+    context3d->set_support_sync_query(true);
+    resource_provider_ = ResourceProvider::Create(output_surface_.get(),
+                                                  NULL,
+                                                  &gpu_memory_buffer_manager_,
+                                                  NULL,
+                                                  0,
+                                                  false,
+                                                  1).Pass();
   }
 
-  void OnCheckForCompletedTasks() {
-    raster_worker_pool_->CheckForCompletedTasks();
-    ScheduleCheckForCompletedTasks();
+  void CreateSoftwareOutputSurfaceAndResourceProvider() {
+    output_surface_ = FakeOutputSurface::CreateSoftware(
+        make_scoped_ptr(new SoftwareOutputDevice));
+    CHECK(output_surface_->BindToClient(&output_surface_client_));
+    resource_provider_ = ResourceProvider::Create(output_surface_.get(),
+                                                  &shared_bitmap_manager_,
+                                                  NULL,
+                                                  NULL,
+                                                  0,
+                                                  false,
+                                                  1).Pass();
+  }
+
+  void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
+                       unsigned id,
+                       const RasterSource::SolidColorAnalysis& analysis,
+                       bool was_canceled) {
+    RasterTaskResult result;
+    result.id = id;
+    result.canceled = was_canceled;
+    completed_tasks_.push_back(result);
   }
 
   void OnTimeout() {
@@ -268,187 +315,96 @@ class RasterWorkerPoolTest : public testing::Test,
   FakeOutputSurfaceClient output_surface_client_;
   scoped_ptr<FakeOutputSurface> output_surface_;
   scoped_ptr<ResourceProvider> resource_provider_;
+  scoped_ptr<ResourcePool> staging_resource_pool_;
   scoped_ptr<RasterWorkerPool> raster_worker_pool_;
-  base::CancelableClosure check_;
-  int check_interval_milliseconds_;
+  TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
+  TestSharedBitmapManager shared_bitmap_manager_;
   base::CancelableClosure timeout_;
   int timeout_seconds_;
   bool timed_out_;
-  std::vector<RasterWorkerPool::RasterTask> tasks_;
+  RasterTaskVector tasks_;
+  std::vector<RasterTaskResult> completed_tasks_;
 };
 
-namespace {
-
-#define PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME) \
-  TEST_F(TEST_FIXTURE_NAME, RunPixelBuffer) { RunTest(false); }
-
-#define IMAGE_TEST_F(TEST_FIXTURE_NAME) \
-  TEST_F(TEST_FIXTURE_NAME, RunImage) { RunTest(true); }
-
-#define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \
-  PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME);                \
-  IMAGE_TEST_F(TEST_FIXTURE_NAME)
-
-class RasterWorkerPoolTestSofwareRaster : public RasterWorkerPoolTest {
- public:
-  virtual void OnTaskCompleted(
-      scoped_ptr<ScopedResource> resource,
-      unsigned id,
-      const PicturePileImpl::Analysis& analysis,
-      bool was_canceled,
-      TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
-    EXPECT_FALSE(was_canceled);
-    EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER,
-              raster_thread);
-    on_task_completed_ids_.push_back(id);
-    if (on_task_completed_ids_.size() == 2)
-      EndTest();
-  }
-
-  // Overridden from RasterWorkerPoolTest:
-  virtual void BeginTest() OVERRIDE {
-    AppendTask(0u, false);
-    AppendTask(1u, false);
-    ScheduleTasks();
-  }
-  virtual void AfterTest() OVERRIDE {
-    EXPECT_EQ(2u, on_task_completed_ids_.size());
-    tasks_.clear();
-  }
-
-  std::vector<unsigned> on_task_completed_ids_;
-};
+TEST_P(RasterWorkerPoolTest, Basic) {
+  AppendTask(0u);
+  AppendTask(1u);
+  ScheduleTasks();
 
-PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestSofwareRaster);
+  RunMessageLoopUntilAllTasksHaveCompleted();
 
-class RasterWorkerPoolTestGpuRaster : public RasterWorkerPoolTest {
- public:
-  virtual void OnTaskCompleted(
-      scoped_ptr<ScopedResource> resource,
-      unsigned id,
-      const PicturePileImpl::Analysis& analysis,
-      bool was_canceled,
-      TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
-    EXPECT_EQ(0u, id);
-    EXPECT_FALSE(was_canceled);
-    EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN,
-              raster_thread);
-    EndTest();
-  }
+  ASSERT_EQ(2u, completed_tasks().size());
+  EXPECT_FALSE(completed_tasks()[0].canceled);
+  EXPECT_FALSE(completed_tasks()[1].canceled);
+}
 
-  // Overridden from RasterWorkerPoolTest:
-  virtual void BeginTest() OVERRIDE {
-    AppendTask(0u, true);  // GPU raster.
-    ScheduleTasks();
-  }
+TEST_P(RasterWorkerPoolTest, FailedMapResource) {
+  if (GetParam() == RASTER_WORKER_POOL_TYPE_BITMAP)
+    return;
 
-  virtual void AfterTest() OVERRIDE { EXPECT_EQ(1u, tasks_.size()); }
-};
-PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestGpuRaster);
+  TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
+  context3d->set_times_map_buffer_chromium_succeeds(0);
+  AppendTask(0u);
+  ScheduleTasks();
 
-class RasterWorkerPoolTestHybridRaster : public RasterWorkerPoolTest {
- public:
-  virtual void OnTaskCompleted(
-      scoped_ptr<ScopedResource> resource,
-      unsigned id,
-      const PicturePileImpl::Analysis& analysis,
-      bool was_canceled,
-      TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
-    EXPECT_FALSE(was_canceled);
-    switch (id) {
-      case 0u:
-        EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER,
-                  raster_thread);
-        break;
-      case 1u:
-        EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN,
-                  raster_thread);
-        break;
-      default:
-        NOTREACHED();
-    }
-    completed_task_ids_.push_back(id);
-    if (completed_task_ids_.size() == 2)
-      EndTest();
-  }
+  RunMessageLoopUntilAllTasksHaveCompleted();
 
-  // Overridden from RasterWorkerPoolTest:
-  virtual void BeginTest() OVERRIDE {
-    AppendTask(0u, false);  // Software raster.
-    AppendTask(1u, true);   // GPU raster.
-    ScheduleTasks();
-  }
+  ASSERT_EQ(1u, completed_tasks().size());
+  EXPECT_FALSE(completed_tasks()[0].canceled);
+}
 
-  virtual void AfterTest() OVERRIDE {
-    EXPECT_EQ(2u, tasks_.size());
-    EXPECT_EQ(2u, completed_task_ids_.size());
-  }
+// This test checks that replacing a pending raster task with another does
+// not prevent the DidFinishRunningTasks notification from being sent.
+TEST_P(RasterWorkerPoolTest, FalseThrottling) {
+  base::Lock lock;
 
-  std::vector<unsigned> completed_task_ids_;
-};
-PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestHybridRaster);
+  // Schedule a task that is prevented from completing with a lock.
+  lock.Acquire();
+  AppendBlockingTask(0u, &lock);
+  ScheduleTasks();
 
-class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest {
- public:
-  virtual void OnTaskCompleted(
-      scoped_ptr<ScopedResource> resource,
-      unsigned id,
-      const PicturePileImpl::Analysis& analysis,
-      bool was_canceled,
-      TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
-    EXPECT_FALSE(was_canceled);
-    EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_NONE, raster_thread);
-    EndTest();
-  }
+  // Schedule another task to replace the still-pending task. Because the old
+  // task is not a throttled task in the new task set, it should not prevent
+  // DidFinishRunningTasks from getting signaled.
+  RasterTaskVector tasks;
+  tasks.swap(tasks_);
+  AppendTask(1u);
+  ScheduleTasks();
 
-  // Overridden from RasterWorkerPoolTest:
-  virtual void BeginTest() OVERRIDE {
-    TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
-    context3d->set_times_map_image_chromium_succeeds(0);
-    context3d->set_times_map_buffer_chromium_succeeds(0);
-    AppendTask(0u, false);
-    ScheduleTasks();
-  }
+  // Unblock the first task to allow the second task to complete.
+  lock.Release();
 
-  virtual void AfterTest() OVERRIDE {
-    ASSERT_EQ(1u, tasks_.size());
-    tasks_.clear();
-  }
-};
+  RunMessageLoopUntilAllTasksHaveCompleted();
+}
 
-PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource);
+TEST_P(RasterWorkerPoolTest, LargeResources) {
+  gfx::Size size(kLargeResourceDimension, kLargeResourceDimension);
 
-class RasterWorkerPoolTestFalseThrottling : public RasterWorkerPoolTest {
- public:
-  // Overridden from RasterWorkerPoolTest:
-  virtual void BeginTest() OVERRIDE {
-    // This test checks that replacing a pending raster task with another does
-    // not prevent the DidFinishRunningTasks notification from being sent.
-
-    // Schedule a task that is prevented from completing with a lock.
-    lock_.Acquire();
-    AppendBlockingTask(0u, &lock_);
-    ScheduleTasks();
-
-    // Schedule another task to replace the still-pending task. Because the old
-    // task is not a throttled task in the new task set, it should not prevent
-    // DidFinishRunningTasks from getting signaled.
-    tasks_.clear();
-    AppendTask(1u, false);
-    ScheduleTasks();
-
-    // Unblock the first task to allow the second task to complete.
-    lock_.Release();
+  {
+    // Verify a resource of this size is larger than the transfer buffer.
+    scoped_ptr<ScopedResource> resource(
+        ScopedResource::Create(resource_provider_.get()));
+    resource->Allocate(size, ResourceProvider::TextureHintImmutable, RGBA_8888);
+    EXPECT_GE(resource->bytes(), kMaxTransferBufferUsageBytes);
   }
 
-  virtual void AfterTest() OVERRIDE {}
-
-  virtual void DidFinishRunningTasks() OVERRIDE { EndTest(); }
-
-  base::Lock lock_;
-};
-
-PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFalseThrottling);
+  AppendTask(0u, size);
+  AppendTask(1u, size);
+  AppendTask(2u, size);
+  ScheduleTasks();
+
+  // This will time out if a resource that is larger than the throttle limit
+  // never gets scheduled.
+  RunMessageLoopUntilAllTasksHaveCompleted();
+}
+
+INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests,
+                        RasterWorkerPoolTest,
+                        ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
+                                          RASTER_WORKER_POOL_TYPE_ZERO_COPY,
+                                          RASTER_WORKER_POOL_TYPE_ONE_COPY,
+                                          RASTER_WORKER_POOL_TYPE_GPU,
+                                          RASTER_WORKER_POOL_TYPE_BITMAP));
 
 }  // namespace
 }  // namespace cc