#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)));
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() {
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