| Index: cc/trees/layer_tree_host_impl_unittest.cc
|
| diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
|
| index 2b0b9676be86849168b31c3ef7cc88a170d719bf..7e57cf0d8cd58f0f6810d4f7efe71874026ae3c3 100644
|
| --- a/cc/trees/layer_tree_host_impl_unittest.cc
|
| +++ b/cc/trees/layer_tree_host_impl_unittest.cc
|
| @@ -14,6 +14,7 @@
|
| #include "base/command_line.h"
|
| #include "base/location.h"
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/run_loop.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "cc/animation/animation_host.h"
|
| #include "cc/animation/animation_id_provider.h"
|
| @@ -53,10 +54,12 @@
|
| #include "cc/test/fake_output_surface.h"
|
| #include "cc/test/fake_picture_layer_impl.h"
|
| #include "cc/test/fake_raster_source.h"
|
| +#include "cc/test/fake_recording_source.h"
|
| #include "cc/test/fake_video_frame_provider.h"
|
| #include "cc/test/geometry_test_utils.h"
|
| #include "cc/test/layer_test_common.h"
|
| #include "cc/test/layer_tree_test.h"
|
| +#include "cc/test/skia_common.h"
|
| #include "cc/test/test_compositor_frame_sink.h"
|
| #include "cc/test/test_task_graph_runner.h"
|
| #include "cc/test/test_web_graphics_context_3d.h"
|
| @@ -103,7 +106,8 @@ class LayerTreeHostImplTest : public testing::Test,
|
| did_request_next_frame_(false),
|
| did_request_prepare_tiles_(false),
|
| did_complete_page_scale_animation_(false),
|
| - reduce_memory_result_(true) {
|
| + reduce_memory_result_(true),
|
| + did_request_impl_side_invalidation_(false) {
|
| media::InitializeMediaLibrary();
|
| }
|
|
|
| @@ -171,6 +175,9 @@ class LayerTreeHostImplTest : public testing::Test,
|
| host_impl_->DidDrawAllLayers(*frame);
|
| last_on_draw_frame_ = std::move(frame);
|
| }
|
| + void NeedsImplSideInvalidation() override {
|
| + did_request_impl_side_invalidation_ = true;
|
| + }
|
|
|
| void set_reduce_memory_result(bool reduce_memory_result) {
|
| reduce_memory_result_ = reduce_memory_result;
|
| @@ -193,10 +200,13 @@ class LayerTreeHostImplTest : public testing::Test,
|
| TaskRunnerProvider* task_runner_provider) {
|
| if (host_impl_)
|
| host_impl_->ReleaseCompositorFrameSink();
|
| + host_impl_.reset();
|
| + InitializeImageWorker(settings);
|
| host_impl_ = LayerTreeHostImpl::Create(
|
| settings, this, task_runner_provider, &stats_instrumentation_,
|
| &task_graph_runner_,
|
| - AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0, nullptr);
|
| + AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0,
|
| + image_worker_ ? image_worker_->task_runner() : nullptr);
|
| compositor_frame_sink_ = std::move(compositor_frame_sink);
|
| host_impl_->SetVisible(true);
|
| bool init = host_impl_->InitializeRenderer(compositor_frame_sink_.get());
|
| @@ -494,6 +504,15 @@ class LayerTreeHostImplTest : public testing::Test,
|
| host_impl_->DidFinishImplFrame();
|
| }
|
|
|
| + void InitializeImageWorker(const LayerTreeSettings& settings) {
|
| + if (settings.enable_checker_imaging) {
|
| + image_worker_ = base::MakeUnique<base::Thread>("ImageWorker");
|
| + ASSERT_TRUE(image_worker_->Start());
|
| + } else {
|
| + image_worker_.reset();
|
| + }
|
| + }
|
| +
|
| FakeImplTaskRunnerProvider task_runner_provider_;
|
| DebugScopedSetMainThreadBlocked always_main_thread_blocked_;
|
|
|
| @@ -509,11 +528,13 @@ class LayerTreeHostImplTest : public testing::Test,
|
| bool did_request_prepare_tiles_;
|
| bool did_complete_page_scale_animation_;
|
| bool reduce_memory_result_;
|
| + bool did_request_impl_side_invalidation_;
|
| base::Closure animation_task_;
|
| base::TimeDelta requested_animation_delay_;
|
| std::unique_ptr<LayerTreeHostImpl::FrameData> last_on_draw_frame_;
|
| RenderPassList last_on_draw_render_passes_;
|
| scoped_refptr<AnimationTimeline> timeline_;
|
| + std::unique_ptr<base::Thread> image_worker_;
|
| };
|
|
|
| // A test fixture for new animation timelines tests.
|
| @@ -11739,5 +11760,81 @@ TEST_F(LayerTreeHostImplTest,
|
| SetupMouseMoveAtTestScrollbarStates(false);
|
| }
|
|
|
| +TEST_F(LayerTreeHostImplTest, CheckerImagingTileInvalidation) {
|
| + LayerTreeSettings settings = DefaultSettings();
|
| + settings.enable_checker_imaging = true;
|
| + settings.default_tile_size = gfx::Size(256, 256);
|
| + settings.max_untiled_layer_size = gfx::Size(256, 256);
|
| + CreateHostImpl(settings, CreateCompositorFrameSink());
|
| + gfx::Size layer_size = gfx::Size(750, 750);
|
| +
|
| + std::unique_ptr<FakeRecordingSource> recording_source =
|
| + FakeRecordingSource::CreateFilledRecordingSource(layer_size);
|
| + recording_source->SetGenerateDiscardableImagesMetadata(true);
|
| + sk_sp<SkImage> checkerable_image =
|
| + CreateDiscardableImage(gfx::Size(500, 500));
|
| + recording_source->add_draw_image(checkerable_image, gfx::Point(0, 0));
|
| +
|
| + SkColor non_solid_color = SkColorSetARGB(128, 45, 56, 67);
|
| + PaintFlags non_solid_flags;
|
| + non_solid_flags.setColor(non_solid_color);
|
| + recording_source->add_draw_rect_with_flags(gfx::Rect(510, 0, 200, 600),
|
| + non_solid_flags);
|
| + recording_source->add_draw_rect_with_flags(gfx::Rect(0, 510, 200, 400),
|
| + non_solid_flags);
|
| + recording_source->Rerecord();
|
| + scoped_refptr<FakeRasterSource> raster_source =
|
| + FakeRasterSource::CreateFromRecordingSource(recording_source.get(),
|
| + false);
|
| +
|
| + // Create the pending tree.
|
| + host_impl_->BeginCommit();
|
| + LayerTreeImpl* pending_tree = host_impl_->pending_tree();
|
| + host_impl_->SetViewportSize(layer_size);
|
| + pending_tree->SetRootLayerForTesting(
|
| + FakePictureLayerImpl::CreateWithRasterSource(pending_tree, 1,
|
| + raster_source));
|
| + FakePictureLayerImpl* root =
|
| + static_cast<FakePictureLayerImpl*>(*pending_tree->begin());
|
| + root->SetBounds(layer_size);
|
| + root->SetDrawsContent(true);
|
| + pending_tree->BuildPropertyTreesForTesting();
|
| +
|
| + // CompleteCommit which should perform a PrepareTiles, adding tilings for the
|
| + // root layer, each one having a raster task.
|
| + host_impl_->CommitComplete();
|
| + EXPECT_EQ(root->num_tilings(), 1U);
|
| + const PictureLayerTiling* tiling = root->tilings()->tiling_at(0);
|
| + EXPECT_EQ(tiling->AllTilesForTesting().size(), 9U);
|
| + for (auto* tile : tiling->AllTilesForTesting())
|
| + EXPECT_TRUE(tile->HasRasterTask());
|
| +
|
| + // Activate the pending tree and ensure that all tiles are rasterized.
|
| + while (!did_notify_ready_to_activate_)
|
| + base::RunLoop().RunUntilIdle();
|
| + for (auto* tile : tiling->AllTilesForTesting())
|
| + EXPECT_FALSE(tile->HasRasterTask());
|
| +
|
| + // PrepareTiles should have scheduled a decode with the ImageDecodeService,
|
| + // ensure that it requests an impl-side invalidation.
|
| + while (!did_request_impl_side_invalidation_)
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Invalidate content on impl-side and ensure that the correct tiles are
|
| + // invalidated on the pending tree.
|
| + host_impl_->InvalidateContentOnImplSide();
|
| + pending_tree = host_impl_->pending_tree();
|
| + root = static_cast<FakePictureLayerImpl*>(*pending_tree->begin());
|
| + for (auto* tile : root->tilings()->tiling_at(0)->AllTilesForTesting()) {
|
| + if (tile->tiling_i_index() < 2 && tile->tiling_j_index() < 2)
|
| + EXPECT_TRUE(tile->HasRasterTask());
|
| + else
|
| + EXPECT_FALSE(tile->HasRasterTask());
|
| + }
|
| + Region expected_invalidation(
|
| + raster_source->GetRectForImage(checkerable_image->uniqueID()));
|
| + EXPECT_EQ(expected_invalidation, *(root->GetPendingInvalidation()));
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|