Chromium Code Reviews| 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..532d5ae8463c97542f7c7829f4358459e19ef087 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,7 +1697,144 @@ 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_; |
| +}; |
| + |
| +// Ensures that the tile manager does not attempt to reuse tiles when partial |
| +// raster is disabled. |
|
danakj
2015/10/16 18:13:08
copypasta alert: comment does not match test
ericrk
2015/10/16 20:27:13
Done.
|
| +TEST_F(PartialRasterTileManagerTest, PartialRasterSuccessfullyEnabled) { |
| + // Pick arbitrary IDs - they don't really matter as long as they're constant. |
| + const int kLayerId = 7; |
|
danakj
2015/10/16 18:13:08
It would be nice to share code. It looks like you
ericrk
2015/10/16 20:27:13
yup, done - had to transfer ownership of host_impl
|
| + const uint64_t kInvalidatedId = 43; |
| + const gfx::Size kTileSize(128, 128); |
| + |
| + // Create a VerifyResourceContentIdTileTaskRunner to ensure that the raster |
| + // task we see is created with |kInvalidatedId|. |
| + VerifyResourceContentIdTileTaskRunner verifying_runner(kInvalidatedId); |
| + 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 does not attempt to reuse tiles when partial |
| +// raster is disabled. |
| +TEST_F(TileManagerTest, PartialRasterSuccessfullyDisabled) { |
| + // Pick arbitrary IDs - they don't really matter as long as they're constant. |
| + const int kLayerId = 7; |
| + const uint64_t kInvalidatedId = 43; |
| + const gfx::Size kTileSize(128, 128); |
| + |
| + // Create a VerifyResourceContentIdTileTaskRunner to ensure that the raster |
| + // task we see is 0, not our |kInvalidatedId|. |
| + VerifyResourceContentIdTileTaskRunner verifying_runner(0u); |
| + 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. |