#include <vector>
#include "base/cancelable_callback.h"
+#include "cc/resources/bitmap_raster_worker_pool.h"
#include "cc/resources/gpu_raster_worker_pool.h"
-#include "cc/resources/image_copy_raster_worker_pool.h"
-#include "cc/resources/image_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/test_shared_bitmap_manager.h"
enum RasterWorkerPoolType {
RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
- RASTER_WORKER_POOL_TYPE_IMAGE,
- RASTER_WORKER_POOL_TYPE_IMAGE_COPY,
- RASTER_WORKER_POOL_TYPE_GPU
+ RASTER_WORKER_POOL_TYPE_ZERO_COPY,
+ RASTER_WORKER_POOL_TYPE_ONE_COPY,
+ RASTER_WORKER_POOL_TYPE_GPU,
+ RASTER_WORKER_POOL_TYPE_BITMAP
};
class TestRasterTaskImpl : public RasterTask {
: RasterTask(resource, dependencies), reply_(reply) {}
// Overridden from Task:
- virtual void RunOnWorkerThread() OVERRIDE {}
+ virtual void RunOnWorkerThread() OVERRIDE {
+ skia::RefPtr<SkCanvas> canvas = raster_buffer_->AcquireSkCanvas();
+ DCHECK(canvas);
+ canvas->drawColor(SK_ColorWHITE);
+ raster_buffer_->ReleaseSkCanvas(canvas);
+ }
// Overridden from RasterizerTask:
virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) OVERRIDE {
- client->AcquireCanvasForRaster(this);
+ raster_buffer_ = client->AcquireBufferForRaster(resource());
}
virtual void CompleteOnOriginThread(RasterizerTaskClient* client) OVERRIDE {
- client->ReleaseCanvasForRaster(this);
+ client->ReleaseBufferForRaster(raster_buffer_.Pass());
}
virtual void RunReplyOnOriginThread() OVERRIDE {
reply_.Run(PicturePileImpl::Analysis(), !HasFinishedRunning());
private:
const Reply reply_;
+ scoped_ptr<RasterBuffer> raster_buffer_;
DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl);
};
typedef std::vector<scoped_refptr<RasterTask> > RasterTaskVector;
+ enum NamedTaskSet { REQUIRED_FOR_ACTIVATION = 0, ALL = 1 };
+
RasterWorkerPoolTest()
: context_provider_(TestContextProvider::Create()),
timeout_seconds_(5),
- timed_out_(false) {
- output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
- CHECK(output_surface_->BindToClient(&output_surface_client_));
-
- shared_bitmap_manager_.reset(new TestSharedBitmapManager());
- resource_provider_ =
- ResourceProvider::Create(
- output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1,
- false).Pass();
- staging_resource_pool_ = ResourcePool::Create(
- resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
+ timed_out_(false) {}
+ // Overridden from testing::Test:
+ 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(),
resource_provider_.get(),
kMaxTransferBufferUsageBytes);
break;
- case RASTER_WORKER_POOL_TYPE_IMAGE:
- raster_worker_pool_ = ImageRasterWorkerPool::Create(
+ 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_IMAGE_COPY:
- raster_worker_pool_ = ImageCopyRasterWorkerPool::Create(
+ 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(),
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());
break;
+ case RASTER_WORKER_POOL_TYPE_BITMAP:
+ CreateSoftwareOutputSurfaceAndResourceProvider();
+ raster_worker_pool_ = BitmapRasterWorkerPool::Create(
+ base::MessageLoopProxy::current().get(),
+ RasterWorkerPool::GetTaskGraphRunner(),
+ resource_provider_.get());
+ break;
}
DCHECK(raster_worker_pool_);
raster_worker_pool_->AsRasterizer()->SetClient(this);
}
- virtual ~RasterWorkerPoolTest() {
- staging_resource_pool_.reset();
- resource_provider_.reset();
- }
-
- // Overridden from testing::Test:
virtual void TearDown() OVERRIDE {
raster_worker_pool_->AsRasterizer()->Shutdown();
raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
}
// Overriden from RasterWorkerPoolClient:
- virtual bool ShouldForceTasksRequiredForActivationToComplete() const
- OVERRIDE {
- return false;
+ virtual void DidFinishRunningTasks(TaskSet task_set) OVERRIDE {
+ if (task_set == ALL) {
+ raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
+ base::MessageLoop::current()->Quit();
+ }
}
- virtual void DidFinishRunningTasks() OVERRIDE {
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
- base::MessageLoop::current()->Quit();
+ virtual TaskSetCollection TasksThatShouldBeForcedToComplete() const OVERRIDE {
+ return TaskSetCollection();
}
- virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
void RunMessageLoopUntilAllTasksHaveCompleted() {
if (timeout_seconds_) {
for (RasterTaskVector::const_iterator it = tasks_.begin();
it != tasks_.end();
- ++it)
- queue.items.push_back(RasterTaskQueue::Item(*it, false));
+ ++it) {
+ TaskSetCollection task_sets;
+ task_sets[ALL] = true;
+ queue.items.push_back(RasterTaskQueue::Item(it->get(), task_sets));
+ }
raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
}
void AppendTask(unsigned id, const gfx::Size& size) {
scoped_ptr<ScopedResource> resource(
ScopedResource::Create(resource_provider_.get()));
- resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
+ resource->Allocate(size, ResourceProvider::TextureHintImmutable, RGBA_8888);
const Resource* const_resource = resource.get();
ImageDecodeTask::Vector empty;
scoped_ptr<ScopedResource> resource(
ScopedResource::Create(resource_provider_.get()));
- resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
+ resource->Allocate(size, ResourceProvider::TextureHintImmutable, RGBA_8888);
const Resource* const_resource = resource.get();
ImageDecodeTask::Vector empty;
}
private:
+ 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, NULL, 0, false, 1, false).Pass();
+ }
+
+ 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,
+ 0,
+ false,
+ 1,
+ false).Pass();
+ }
+
void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
unsigned id,
const PicturePileImpl::Analysis& analysis,
scoped_refptr<TestContextProvider> context_provider_;
FakeOutputSurfaceClient output_surface_client_;
scoped_ptr<FakeOutputSurface> output_surface_;
- scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
scoped_ptr<ResourceProvider> resource_provider_;
scoped_ptr<ResourcePool> staging_resource_pool_;
scoped_ptr<RasterWorkerPool> raster_worker_pool_;
+ TestSharedBitmapManager shared_bitmap_manager_;
base::CancelableClosure timeout_;
int timeout_seconds_;
bool timed_out_;
}
TEST_P(RasterWorkerPoolTest, FailedMapResource) {
+ if (GetParam() == RASTER_WORKER_POOL_TYPE_BITMAP)
+ return;
+
TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
context3d->set_times_map_image_chromium_succeeds(0);
context3d->set_times_map_buffer_chromium_succeeds(0);
// 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::TextureUsageAny, RGBA_8888);
+ resource->Allocate(size, ResourceProvider::TextureHintImmutable, RGBA_8888);
EXPECT_GE(resource->bytes(), kMaxTransferBufferUsageBytes);
}
INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests,
RasterWorkerPoolTest,
::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
- RASTER_WORKER_POOL_TYPE_IMAGE,
- RASTER_WORKER_POOL_TYPE_IMAGE_COPY,
- RASTER_WORKER_POOL_TYPE_GPU));
+ 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