Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(347)

Side by Side Diff: cc/tiles/tile_manager_unittest.cc

Issue 2668873002: cc: Add checker-imaging support to TileManager. (Closed)
Patch Set: all tests Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/run_loop.h" 11 #include "base/run_loop.h"
12 #include "base/test/test_simple_task_runner.h"
12 #include "base/threading/thread_task_runner_handle.h" 13 #include "base/threading/thread_task_runner_handle.h"
13 #include "cc/playback/raster_source.h" 14 #include "cc/playback/raster_source.h"
14 #include "cc/playback/recording_source.h" 15 #include "cc/playback/recording_source.h"
15 #include "cc/raster/raster_buffer.h" 16 #include "cc/raster/raster_buffer.h"
16 #include "cc/raster/synchronous_task_graph_runner.h" 17 #include "cc/raster/synchronous_task_graph_runner.h"
17 #include "cc/resources/resource_pool.h" 18 #include "cc/resources/resource_pool.h"
18 #include "cc/test/begin_frame_args_test.h" 19 #include "cc/test/begin_frame_args_test.h"
19 #include "cc/test/fake_compositor_frame_sink.h" 20 #include "cc/test/fake_compositor_frame_sink.h"
20 #include "cc/test/fake_compositor_frame_sink_client.h" 21 #include "cc/test/fake_compositor_frame_sink_client.h"
21 #include "cc/test/fake_impl_task_runner_provider.h" 22 #include "cc/test/fake_impl_task_runner_provider.h"
22 #include "cc/test/fake_layer_tree_host_impl.h" 23 #include "cc/test/fake_layer_tree_host_impl.h"
23 #include "cc/test/fake_picture_layer_impl.h" 24 #include "cc/test/fake_picture_layer_impl.h"
24 #include "cc/test/fake_picture_layer_tiling_client.h" 25 #include "cc/test/fake_picture_layer_tiling_client.h"
25 #include "cc/test/fake_raster_source.h" 26 #include "cc/test/fake_raster_source.h"
26 #include "cc/test/fake_recording_source.h" 27 #include "cc/test/fake_recording_source.h"
27 #include "cc/test/fake_tile_manager.h" 28 #include "cc/test/fake_tile_manager.h"
28 #include "cc/test/fake_tile_task_manager.h" 29 #include "cc/test/fake_tile_task_manager.h"
29 #include "cc/test/layer_tree_settings_for_testing.h" 30 #include "cc/test/layer_tree_settings_for_testing.h"
30 #include "cc/test/test_layer_tree_host_base.h" 31 #include "cc/test/test_layer_tree_host_base.h"
31 #include "cc/test/test_task_graph_runner.h" 32 #include "cc/test/test_task_graph_runner.h"
32 #include "cc/test/test_tile_priorities.h" 33 #include "cc/test/test_tile_priorities.h"
33 #include "cc/tiles/eviction_tile_priority_queue.h" 34 #include "cc/tiles/eviction_tile_priority_queue.h"
34 #include "cc/tiles/raster_tile_priority_queue.h" 35 #include "cc/tiles/raster_tile_priority_queue.h"
35 #include "cc/tiles/tile.h" 36 #include "cc/tiles/tile.h"
36 #include "cc/tiles/tile_priority.h" 37 #include "cc/tiles/tile_priority.h"
37 #include "cc/tiles/tiling_set_raster_queue_all.h" 38 #include "cc/tiles/tiling_set_raster_queue_all.h"
38 #include "cc/trees/layer_tree_impl.h" 39 #include "cc/trees/layer_tree_impl.h"
39 #include "testing/gmock/include/gmock/gmock.h" 40 #include "testing/gmock/include/gmock/gmock.h"
40 #include "testing/gtest/include/gtest/gtest.h" 41 #include "testing/gtest/include/gtest/gtest.h"
42 #include "third_party/skia/include/core/SkImageGenerator.h"
41 #include "third_party/skia/include/core/SkRefCnt.h" 43 #include "third_party/skia/include/core/SkRefCnt.h"
42 #include "third_party/skia/include/core/SkSurface.h" 44 #include "third_party/skia/include/core/SkSurface.h"
43 45
44 using testing::_; 46 using testing::_;
45 using testing::Invoke; 47 using testing::Invoke;
46 using testing::Return; 48 using testing::Return;
47 using testing::StrictMock; 49 using testing::StrictMock;
48 50
49 namespace cc { 51 namespace cc {
50 namespace { 52 namespace {
51 53
54 // A version of simple task runner that lets the user control if all tasks
55 // posted should run synchronously.
56 class SynchronousSimpleTaskRunner : public base::TestSimpleTaskRunner {
57 public:
58 bool PostDelayedTask(const tracked_objects::Location& from_here,
59 const base::Closure& task,
60 base::TimeDelta delay) override {
61 TestSimpleTaskRunner::PostDelayedTask(from_here, task, delay);
62 if (run_tasks_synchronously_)
63 RunUntilIdle();
64 return true;
65 }
66
67 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
68 const base::Closure& task,
69 base::TimeDelta delay) override {
70 TestSimpleTaskRunner::PostDelayedTask(from_here, task, delay);
vmpstr 2017/02/13 22:49:31 return PostDelayedTask(from_here, task, delay);
Khushal 2017/02/14 05:10:23 Done.
71 if (run_tasks_synchronously_)
72 RunUntilIdle();
73 return true;
74 }
75
76 void set_run_tasks_synchronously(bool run_tasks_synchronously) {
77 run_tasks_synchronously_ = run_tasks_synchronously;
78 }
79
80 protected:
81 ~SynchronousSimpleTaskRunner() override = default;
82
83 bool run_tasks_synchronously_ = false;
84 };
85
52 class TileManagerTilePriorityQueueTest : public TestLayerTreeHostBase { 86 class TileManagerTilePriorityQueueTest : public TestLayerTreeHostBase {
53 public: 87 public:
54 LayerTreeSettings CreateSettings() override { 88 LayerTreeSettings CreateSettings() override {
55 LayerTreeSettingsForTesting settings; 89 LayerTreeSettingsForTesting settings;
56 settings.create_low_res_tiling = true; 90 settings.create_low_res_tiling = true;
57 settings.renderer_settings.buffer_to_texture_target_map = 91 settings.renderer_settings.buffer_to_texture_target_map =
58 DefaultBufferToTextureTargetMapForTesting(); 92 DefaultBufferToTextureTargetMapForTesting();
59 return settings; 93 return settings;
60 } 94 }
61 95
(...skipping 2194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2256 host_impl()->tile_manager()->PrepareTiles(host_impl()->global_tile_state()); 2290 host_impl()->tile_manager()->PrepareTiles(host_impl()->global_tile_state());
2257 EXPECT_CALL(MockHostImpl(), NotifyReadyToActivate()) 2291 EXPECT_CALL(MockHostImpl(), NotifyReadyToActivate())
2258 .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); })); 2292 .WillOnce(Invoke([&run_loop]() { run_loop.Quit(); }));
2259 run_loop.Run(); 2293 run_loop.Run();
2260 } 2294 }
2261 2295
2262 EXPECT_TRUE(host_impl()->tile_manager()->IsReadyToDraw()); 2296 EXPECT_TRUE(host_impl()->tile_manager()->IsReadyToDraw());
2263 EXPECT_TRUE(host_impl()->tile_manager()->IsReadyToActivate()); 2297 EXPECT_TRUE(host_impl()->tile_manager()->IsReadyToActivate());
2264 } 2298 }
2265 2299
2300 class CheckerImagingTileManagerTest : public TestLayerTreeHostBase {
vmpstr 2017/02/13 22:49:31 I feel like tile manager unittest is getting a bit
Khushal 2017/02/14 05:10:23 I can move it to a different file in this patch it
2301 public:
2302 class MockImageGenerator : public SkImageGenerator {
2303 public:
2304 explicit MockImageGenerator(const gfx::Size& size)
2305 : SkImageGenerator(
2306 SkImageInfo::MakeN32Premul(size.width(), size.height())) {}
2307
2308 protected:
2309 MOCK_METHOD5(onGetPixels,
2310 bool(const SkImageInfo&, void*, size_t, SkPMColor[], int*));
2311 };
2312
2313 void TearDown() override {
2314 // Allow all tasks on the image worker to run now. Any scheduled decodes
2315 // will be aborted.
2316 task_runner()->set_run_tasks_synchronously(true);
2317 }
2318
2319 LayerTreeSettings CreateSettings() override {
2320 LayerTreeSettings settings;
2321 settings.enable_checker_imaging = true;
2322 settings.renderer_settings.buffer_to_texture_target_map =
2323 DefaultBufferToTextureTargetMapForTesting();
2324 return settings;
2325 }
2326
2327 std::unique_ptr<FakeLayerTreeHostImpl> CreateHostImpl(
2328 const LayerTreeSettings& settings,
2329 TaskRunnerProvider* task_runner_provider,
2330 TaskGraphRunner* task_graph_runner) override {
2331 task_runner_ = make_scoped_refptr(new SynchronousSimpleTaskRunner);
2332 return base::MakeUnique<FakeLayerTreeHostImpl>(
2333 settings, task_runner_provider, task_graph_runner, task_runner_);
2334 }
2335
2336 std::unique_ptr<TaskGraphRunner> CreateTaskGraphRunner() override {
2337 return base::MakeUnique<SynchronousTaskGraphRunner>();
2338 }
2339
2340 SynchronousSimpleTaskRunner* task_runner() const {
2341 return task_runner_.get();
2342 }
2343
2344 private:
2345 scoped_refptr<SynchronousSimpleTaskRunner> task_runner_;
2346 };
2347
2348 TEST_F(CheckerImagingTileManagerTest,
2349 NoImageDecodeDependencyForCheckeredTiles) {
vmpstr 2017/02/13 22:49:31 Add a few more tests for things like repeated sche
Khushal 2017/02/14 05:10:23 Could you give an example? I think the only thing
2350 const gfx::Size layer_bounds(512, 512);
2351 SetupDefaultTrees(layer_bounds);
2352
2353 std::unique_ptr<FakeRecordingSource> recording_source =
2354 FakeRecordingSource::CreateFilledRecordingSource(layer_bounds);
2355 recording_source->SetGenerateDiscardableImagesMetadata(true);
2356
2357 sk_sp<SkImage> image = SkImage::MakeFromGenerator(
2358 new testing::StrictMock<MockImageGenerator>(gfx::Size(512, 512)));
2359 recording_source->add_draw_image(image, gfx::Point(0, 0));
2360
2361 recording_source->Rerecord();
2362 scoped_refptr<RasterSource> raster_source =
2363 RasterSource::CreateFromRecordingSource(recording_source.get(), false);
2364
2365 std::unique_ptr<PictureLayerImpl> layer_impl =
2366 PictureLayerImpl::Create(host_impl()->active_tree(), 1, false);
2367 layer_impl->set_is_drawn_render_surface_layer_list_member(true);
2368 PictureLayerTilingSet* tiling_set = layer_impl->picture_layer_tiling_set();
2369
2370 PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, raster_source);
2371 tiling->set_resolution(HIGH_RESOLUTION);
2372 tiling->CreateAllTilesForTesting();
2373 tiling->SetTilePriorityRectsForTesting(
2374 gfx::Rect(layer_bounds), // Visible rect.
2375 gfx::Rect(layer_bounds), // Skewport rect.
2376 gfx::Rect(layer_bounds), // Soon rect.
2377 gfx::Rect(layer_bounds)); // Eventually rect.
2378
2379 // PrepareTiles and synchronously run all tasks added to the TaskGraph. Since
2380 // we are using a strict mock for the SkImageGenerator, if the decode runs as
2381 // a part of raster tasks, the test should fail.
2382 {
2383 host_impl()->tile_manager()->PrepareTiles(host_impl()->global_tile_state());
2384 EXPECT_TRUE(host_impl()->tile_manager()->HasScheduledTileTasksForTesting());
2385 static_cast<SynchronousTaskGraphRunner*>(task_graph_runner())
2386 ->RunUntilIdle();
2387 base::RunLoop().RunUntilIdle();
2388 EXPECT_FALSE(
2389 host_impl()->tile_manager()->HasScheduledTileTasksForTesting());
2390 }
2391 }
2392
2266 } // namespace 2393 } // namespace
2267 } // namespace cc 2394 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698