| Index: cc/tiles/tile_manager_unittest.cc
|
| diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
|
| index 73a3cec228e9817802a3d4f2f7686b09001cd32e..8e559095348e4c4321aff2d762be67e18515ef8c 100644
|
| --- a/cc/tiles/tile_manager_unittest.cc
|
| +++ b/cc/tiles/tile_manager_unittest.cc
|
| @@ -1452,10 +1452,13 @@ class TileManagerTest : public testing::Test {
|
| public:
|
| TileManagerTest()
|
| : output_surface_(FakeOutputSurface::CreateSoftware(
|
| - make_scoped_ptr(new SoftwareOutputDevice))),
|
| - host_impl_(new MockLayerTreeHostImpl(&proxy_,
|
| - &shared_bitmap_manager_,
|
| - &task_graph_runner_)) {
|
| + make_scoped_ptr(new SoftwareOutputDevice))) {}
|
| +
|
| + void SetUp() override {
|
| + LayerTreeSettings settings;
|
| + CustomizeSettings(&settings);
|
| + host_impl_.reset(new MockLayerTreeHostImpl(
|
| + settings, &proxy_, &shared_bitmap_manager_, &task_graph_runner_));
|
| host_impl_->SetVisible(true);
|
| host_impl_->InitializeRenderer(output_surface_.get());
|
| }
|
| @@ -1464,14 +1467,18 @@ class TileManagerTest : public testing::Test {
|
| // MockLayerTreeHostImpl allows us to intercept tile manager callbacks.
|
| class MockLayerTreeHostImpl : public FakeLayerTreeHostImpl {
|
| public:
|
| - MockLayerTreeHostImpl(Proxy* proxy,
|
| + MockLayerTreeHostImpl(const LayerTreeSettings& settings,
|
| + Proxy* proxy,
|
| SharedBitmapManager* manager,
|
| TaskGraphRunner* task_graph_runner)
|
| - : FakeLayerTreeHostImpl(proxy, manager, task_graph_runner) {}
|
| + : FakeLayerTreeHostImpl(settings, proxy, manager, task_graph_runner) {}
|
|
|
| MOCK_METHOD0(NotifyAllTileTasksCompleted, void());
|
| };
|
|
|
| + // By default do no customization.
|
| + virtual void CustomizeSettings(LayerTreeSettings* settings) {}
|
| +
|
| TestSharedBitmapManager shared_bitmap_manager_;
|
| TestTaskGraphRunner task_graph_runner_;
|
| FakeImplProxy proxy_;
|
| @@ -1592,10 +1599,11 @@ TEST_F(TileManagerTest, LowResHasNoImage) {
|
| }
|
| }
|
|
|
| -// Fake TileTaskRunner that just cancels all scheduled tasks immediately.
|
| -class CancellingTileTaskRunner : public TileTaskRunner, public TileTaskClient {
|
| +// Fake TileTaskRunner that just no-ops all calls.
|
| +class FakeTileTaskRunner : public TileTaskRunner, public TileTaskClient {
|
| public:
|
| - CancellingTileTaskRunner() {}
|
| + FakeTileTaskRunner() {}
|
| + ~FakeTileTaskRunner() override {}
|
|
|
| // TileTaskRunner methods.
|
| void SetClient(TileTaskRunnerClient* client) override {}
|
| @@ -1608,13 +1616,7 @@ class CancellingTileTaskRunner : public TileTaskRunner, public TileTaskClient {
|
| return false;
|
| }
|
|
|
| - void ScheduleTasks(TileTaskQueue* queue) override {
|
| - // Just call CompleteOnOriginThread on each item in the queue. As none of
|
| - // these items have run yet, they will be treated as cancelled tasks.
|
| - for (const auto& task : queue->items) {
|
| - task.task->CompleteOnOriginThread(this);
|
| - }
|
| - }
|
| + void ScheduleTasks(TileTaskQueue* queue) override {}
|
|
|
| // TileTaskClient methods.
|
| scoped_ptr<RasterBuffer> AcquireBufferForRaster(
|
| @@ -1625,30 +1627,51 @@ class CancellingTileTaskRunner : public TileTaskRunner, public TileTaskClient {
|
| return nullptr;
|
| }
|
| void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override {}
|
| +};
|
|
|
| +// Fake TileTaskRunner that just cancels all scheduled tasks immediately.
|
| +class CancellingTileTaskRunner : public FakeTileTaskRunner {
|
| + public:
|
| + CancellingTileTaskRunner() {}
|
| ~CancellingTileTaskRunner() override {}
|
| +
|
| + void ScheduleTasks(TileTaskQueue* queue) override {
|
| + // Just call CompleteOnOriginThread on each item in the queue. As none of
|
| + // these items have run yet, they will be treated as cancelled tasks.
|
| + for (const auto& task : queue->items) {
|
| + task.task->CompleteOnOriginThread(this);
|
| + }
|
| + }
|
| +};
|
| +
|
| +class PartialRasterTileManagerTest : public TileManagerTest {
|
| + public:
|
| + void CustomizeSettings(LayerTreeSettings* settings) override {
|
| + settings->use_partial_raster = true;
|
| + }
|
| };
|
|
|
| // Ensures that if a raster task is cancelled, it gets returned to the resource
|
| // pool with an invalid content ID, not with its invalidated content ID.
|
| -TEST_F(TileManagerTest, CancelledTasksHaveNoContentId) {
|
| +TEST_F(PartialRasterTileManagerTest, CancelledTasksHaveNoContentId) {
|
| // Create a CancellingTaskRunner and set it on the tile manager so that all
|
| // scheduled work is immediately cancelled.
|
| CancellingTileTaskRunner cancelling_runner;
|
| host_impl_->tile_manager()->SetTileTaskRunnerForTesting(&cancelling_runner);
|
|
|
| // Pick arbitrary IDs - they don't really matter as long as they're constant.
|
| - int layer_id = 7;
|
| - int invalidated_id = 43;
|
| + const int kLayerId = 7;
|
| + const uint64_t kInvalidatedId = 43;
|
| + const gfx::Size kTileSize(128, 128);
|
|
|
| scoped_refptr<FakeDisplayListRasterSource> pending_raster_source =
|
| - FakeDisplayListRasterSource::CreateFilled(gfx::Size(128, 128));
|
| + FakeDisplayListRasterSource::CreateFilled(kTileSize);
|
| host_impl_->CreatePendingTree();
|
| LayerTreeImpl* pending_tree = host_impl_->pending_tree();
|
|
|
| // Steal from the recycled tree.
|
| scoped_ptr<FakePictureLayerImpl> pending_layer =
|
| - FakePictureLayerImpl::CreateWithRasterSource(pending_tree, layer_id,
|
| + FakePictureLayerImpl::CreateWithRasterSource(pending_tree, kLayerId,
|
| pending_raster_source);
|
| pending_layer->SetDrawsContent(true);
|
| pending_layer->SetHasRenderSurface(true);
|
| @@ -1664,7 +1687,7 @@ TEST_F(TileManagerTest, CancelledTasksHaveNoContentId) {
|
| scoped_ptr<RasterTilePriorityQueue> queue(host_impl_->BuildRasterQueue(
|
| SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL));
|
| EXPECT_FALSE(queue->IsEmpty());
|
| - queue->Top().tile()->SetInvalidated(gfx::Rect(), invalidated_id);
|
| + queue->Top().tile()->SetInvalidated(gfx::Rect(), kInvalidatedId);
|
|
|
| // PrepareTiles to schedule tasks. Due to the CancellingTileTaskRunner, these
|
| // tasks will immediately be canceled.
|
| @@ -1674,12 +1697,110 @@ TEST_F(TileManagerTest, CancelledTasksHaveNoContentId) {
|
| // with its invalidated resource ID.
|
| host_impl_->resource_pool()->CheckBusyResources();
|
| EXPECT_FALSE(host_impl_->resource_pool()->TryAcquireResourceWithContentId(
|
| - invalidated_id));
|
| + kInvalidatedId));
|
|
|
| // Free our host_impl_ before the cancelling_runner we passed it, as it will
|
| // use that class in clean up.
|
| host_impl_ = nullptr;
|
| }
|
|
|
| +// Fake TileTaskRunner that verifies the resource content ID of raster tasks.
|
| +class VerifyResourceContentIdTileTaskRunner : public FakeTileTaskRunner {
|
| + public:
|
| + explicit VerifyResourceContentIdTileTaskRunner(uint64_t expected_resource_id)
|
| + : expected_resource_id_(expected_resource_id) {}
|
| + ~VerifyResourceContentIdTileTaskRunner() override {}
|
| +
|
| + void ScheduleTasks(TileTaskQueue* queue) override {
|
| + for (const auto& task : queue->items) {
|
| + // Triggers a call to AcquireBufferForRaster.
|
| + task.task->ScheduleOnOriginThread(this);
|
| + // Calls TileManager as though task was cancelled.
|
| + task.task->CompleteOnOriginThread(this);
|
| + }
|
| + }
|
| +
|
| + // TileTaskClient methods.
|
| + scoped_ptr<RasterBuffer> AcquireBufferForRaster(
|
| + const Resource* resource,
|
| + uint64_t resource_content_id,
|
| + uint64_t previous_content_id) override {
|
| + EXPECT_EQ(expected_resource_id_, resource_content_id);
|
| + return nullptr;
|
| + }
|
| +
|
| + private:
|
| + uint64_t expected_resource_id_;
|
| +};
|
| +
|
| +// Runs a test to ensure that partial raster is either enabled or disabled,
|
| +// depending on |partial_raster_enabled|'s value. Takes ownership of host_impl
|
| +// so that cleanup order can be controlled.
|
| +void RunPartialRasterCheck(scoped_ptr<LayerTreeHostImpl> host_impl,
|
| + bool partial_raster_enabled) {
|
| + // Pick arbitrary IDs - they don't really matter as long as they're constant.
|
| + const int kLayerId = 7;
|
| + const uint64_t kInvalidatedId = 43;
|
| + const uint64_t kExpectedId = partial_raster_enabled ? kInvalidatedId : 0u;
|
| + const gfx::Size kTileSize(128, 128);
|
| +
|
| + // Create a VerifyResourceContentIdTileTaskRunner to ensure that the raster
|
| + // task we see is created with |kExpectedId|.
|
| + VerifyResourceContentIdTileTaskRunner verifying_runner(kExpectedId);
|
| + host_impl->tile_manager()->SetTileTaskRunnerForTesting(&verifying_runner);
|
| +
|
| + // Ensure there's a resource with our |kInvalidatedId| in the resource pool.
|
| + host_impl->resource_pool()->ReleaseResource(
|
| + host_impl->resource_pool()->AcquireResource(kTileSize, RGBA_8888),
|
| + kInvalidatedId);
|
| + host_impl->resource_pool()->CheckBusyResources();
|
| +
|
| + scoped_refptr<FakeDisplayListRasterSource> pending_raster_source =
|
| + FakeDisplayListRasterSource::CreateFilled(kTileSize);
|
| + host_impl->CreatePendingTree();
|
| + LayerTreeImpl* pending_tree = host_impl->pending_tree();
|
| +
|
| + // Steal from the recycled tree.
|
| + scoped_ptr<FakePictureLayerImpl> pending_layer =
|
| + FakePictureLayerImpl::CreateWithRasterSource(pending_tree, kLayerId,
|
| + pending_raster_source);
|
| + pending_layer->SetDrawsContent(true);
|
| + pending_layer->SetHasRenderSurface(true);
|
| +
|
| + // The bounds() just mirror the raster source size.
|
| + pending_layer->SetBounds(pending_layer->raster_source()->GetSize());
|
| + pending_tree->SetRootLayer(pending_layer.Pass());
|
| +
|
| + // Add tilings/tiles for the layer.
|
| + host_impl->pending_tree()->UpdateDrawProperties(false /* update_lcd_text */);
|
| +
|
| + // Build the raster queue and invalidate the top tile.
|
| + scoped_ptr<RasterTilePriorityQueue> queue(host_impl->BuildRasterQueue(
|
| + SAME_PRIORITY_FOR_BOTH_TREES, RasterTilePriorityQueue::Type::ALL));
|
| + EXPECT_FALSE(queue->IsEmpty());
|
| + queue->Top().tile()->SetInvalidated(gfx::Rect(), kInvalidatedId);
|
| +
|
| + // PrepareTiles to schedule tasks. Due to the
|
| + // VerifyPreviousContentTileTaskRunner, these tasks will verified and
|
| + // cancelled.
|
| + host_impl->tile_manager()->PrepareTiles(host_impl->global_tile_state());
|
| +
|
| + // Free our host_impl before the cancelling_runner we passed it, as it will
|
| + // use that class in clean up.
|
| + host_impl = nullptr;
|
| +}
|
| +
|
| +// Ensures that the tile manager successfully reuses tiles when partial
|
| +// raster is enabled.
|
| +TEST_F(PartialRasterTileManagerTest, PartialRasterSuccessfullyEnabled) {
|
| + RunPartialRasterCheck(host_impl_.Pass(), true /* partial_raster_enabled */);
|
| +}
|
| +
|
| +// Ensures that the tile manager does not attempt to reuse tiles when partial
|
| +// raster is disabled.
|
| +TEST_F(TileManagerTest, PartialRasterSuccessfullyDisabled) {
|
| + RunPartialRasterCheck(host_impl_.Pass(), false /* partial_raster_enabled */);
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|