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

Side by Side Diff: cc/blimp/compositor_state_deserializer_unittest.cc

Issue 2494623002: cc: Remove client/engine LayerTreeHostInProcess. (Closed)
Patch Set: .. Created 4 years, 1 month 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
« no previous file with comments | « cc/BUILD.gn ('k') | cc/blimp/layer_tree_host_unittest_serialization.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "compositor_state_deserializer.h" 5 #include "compositor_state_deserializer.h"
6 6
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "cc/animation/animation_host.h" 8 #include "cc/animation/animation_host.h"
9 #include "cc/blimp/client_picture_cache.h" 9 #include "cc/blimp/client_picture_cache.h"
10 #include "cc/blimp/compositor_proto_state.h" 10 #include "cc/blimp/compositor_proto_state.h"
11 #include "cc/blimp/layer_tree_host_remote.h" 11 #include "cc/blimp/layer_tree_host_remote.h"
12 #include "cc/layers/content_layer_client.h" 12 #include "cc/layers/content_layer_client.h"
13 #include "cc/layers/picture_layer.h" 13 #include "cc/layers/picture_layer.h"
14 #include "cc/layers/solid_color_scrollbar_layer.h" 14 #include "cc/layers/solid_color_scrollbar_layer.h"
15 #include "cc/playback/display_item_list.h" 15 #include "cc/playback/display_item_list.h"
16 #include "cc/playback/drawing_display_item.h" 16 #include "cc/playback/drawing_display_item.h"
17 #include "cc/proto/compositor_message.pb.h" 17 #include "cc/proto/compositor_message.pb.h"
18 #include "cc/test/fake_image_serialization_processor.h" 18 #include "cc/test/fake_image_serialization_processor.h"
19 #include "cc/test/fake_layer_tree_host.h" 19 #include "cc/test/fake_layer_tree_host.h"
20 #include "cc/test/fake_layer_tree_host_client.h" 20 #include "cc/test/fake_layer_tree_host_client.h"
21 #include "cc/test/fake_proxy.h" 21 #include "cc/test/fake_proxy.h"
22 #include "cc/test/fake_remote_compositor_bridge.h" 22 #include "cc/test/fake_remote_compositor_bridge.h"
23 #include "cc/test/remote_client_layer_factory.h" 23 #include "cc/test/remote_client_layer_factory.h"
24 #include "cc/test/remote_compositor_test.h"
25 #include "cc/test/serialization_test_utils.h"
24 #include "cc/test/skia_common.h" 26 #include "cc/test/skia_common.h"
25 #include "cc/test/stub_layer_tree_host_client.h" 27 #include "cc/test/stub_layer_tree_host_client.h"
26 #include "cc/test/test_task_graph_runner.h" 28 #include "cc/test/test_task_graph_runner.h"
27 #include "cc/trees/layer_tree_host_common.h" 29 #include "cc/trees/layer_tree_host_common.h"
28 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
29 #include "third_party/skia/include/core/SkPictureRecorder.h" 31 #include "third_party/skia/include/core/SkPictureRecorder.h"
30 32
31 namespace cc { 33 namespace cc {
32 namespace { 34 namespace {
33 35
34 #define EXPECT_LAYERS_EQ(engine_layer_id, client_layer) \
35 EXPECT_EQ( \
36 compositor_state_deserializer_->GetLayerForEngineId(engine_layer_id), \
37 client_layer);
38
39 class ProxyForCommitRequest : public FakeProxy {
40 public:
41 bool CommitRequested() const override { return true; }
42 };
43
44 class FakeContentLayerClient : public ContentLayerClient { 36 class FakeContentLayerClient : public ContentLayerClient {
45 public: 37 public:
46 FakeContentLayerClient(scoped_refptr<DisplayItemList> display_list, 38 FakeContentLayerClient(scoped_refptr<DisplayItemList> display_list,
47 gfx::Rect recorded_viewport) 39 gfx::Rect recorded_viewport)
48 : display_list_(std::move(display_list)), 40 : display_list_(std::move(display_list)),
49 recorded_viewport_(recorded_viewport) {} 41 recorded_viewport_(recorded_viewport) {}
50 ~FakeContentLayerClient() override {} 42 ~FakeContentLayerClient() override {}
51 43
52 // ContentLayerClient implementation. 44 // ContentLayerClient implementation.
53 gfx::Rect PaintableRegion() override { return recorded_viewport_; } 45 gfx::Rect PaintableRegion() override { return recorded_viewport_; }
54 scoped_refptr<DisplayItemList> PaintContentsToDisplayList( 46 scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
55 PaintingControlSetting painting_status) override { 47 PaintingControlSetting painting_status) override {
56 return display_list_; 48 return display_list_;
57 } 49 }
58 bool FillsBoundsCompletely() const override { return false; } 50 bool FillsBoundsCompletely() const override { return false; }
59 size_t GetApproximateUnsharedMemoryUsage() const override { return 0; } 51 size_t GetApproximateUnsharedMemoryUsage() const override { return 0; }
60 52
61 private: 53 private:
62 scoped_refptr<DisplayItemList> display_list_; 54 scoped_refptr<DisplayItemList> display_list_;
63 gfx::Rect recorded_viewport_; 55 gfx::Rect recorded_viewport_;
64 }; 56 };
65 57
66 class RemoteCompositorBridgeForTest : public FakeRemoteCompositorBridge { 58 class CompositorStateDeserializerTest : public RemoteCompositorTest {
67 public: 59 public:
68 using ProtoFrameCallback = base::Callback<void( 60 void VerifyTreesAreIdentical() {
69 std::unique_ptr<CompositorProtoState> compositor_proto_state)>; 61 VerifySerializedTreesAreIdentical(
70 62 layer_tree_host_remote_->GetLayerTree(),
71 RemoteCompositorBridgeForTest( 63 layer_tree_host_in_process_->GetLayerTree(),
72 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 64 compositor_state_deserializer_.get());
73 ProtoFrameCallback proto_frame_callback)
74 : FakeRemoteCompositorBridge(main_task_runner),
75 proto_frame_callback_(proto_frame_callback) {}
76
77 ~RemoteCompositorBridgeForTest() override = default;
78
79 void ProcessCompositorStateUpdate(
80 std::unique_ptr<CompositorProtoState> compositor_proto_state) override {
81 proto_frame_callback_.Run(std::move(compositor_proto_state));
82 } 65 }
83
84 private:
85 ProtoFrameCallback proto_frame_callback_;
86 };
87
88 class CompositorStateDeserializerTest
89 : public testing::Test,
90 public CompositorStateDeserializerClient,
91 public FakeLayerTreeHostClient {
92 public:
93 void SetUp() override {
94 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner =
95 base::ThreadTaskRunnerHandle::Get();
96
97 animation_host_ = AnimationHost::CreateForTesting(ThreadInstance::MAIN);
98
99 // Engine side setup.
100 LayerTreeHostRemote::InitParams params;
101 params.client = &layer_tree_host_client_remote_;
102 params.main_task_runner = main_task_runner;
103 params.mutator_host = animation_host_.get();
104 params.remote_compositor_bridge =
105 base::MakeUnique<RemoteCompositorBridgeForTest>(
106 main_task_runner,
107 base::Bind(
108 &CompositorStateDeserializerTest::ProcessCompositorStateUpdate,
109 base::Unretained(this)));
110 params.engine_picture_cache =
111 image_serialization_processor_.CreateEnginePictureCache();
112 LayerTreeSettings settings;
113 params.settings = &settings;
114
115 layer_tree_host_remote_ = base::MakeUnique<LayerTreeHostRemote>(&params);
116
117 // Client side setup.
118 layer_tree_host_in_process_ = FakeLayerTreeHost::Create(
119 this, &task_graph_runner_, animation_host_.get(), settings,
120 CompositorMode::THREADED);
121 layer_tree_host_in_process_->InitializeForTesting(
122 TaskRunnerProvider::Create(base::ThreadTaskRunnerHandle::Get(),
123 base::ThreadTaskRunnerHandle::Get()),
124 base::MakeUnique<ProxyForCommitRequest>());
125 std::unique_ptr<ClientPictureCache> client_picture_cache =
126 image_serialization_processor_.CreateClientPictureCache();
127 compositor_state_deserializer_ =
128 base::MakeUnique<CompositorStateDeserializer>(
129 layer_tree_host_in_process_.get(), std::move(client_picture_cache),
130 this);
131 }
132
133 void TearDown() override {
134 layer_tree_host_remote_ = nullptr;
135 compositor_state_deserializer_ = nullptr;
136 layer_tree_host_in_process_ = nullptr;
137 animation_host_ = nullptr;
138 }
139
140 void ProcessCompositorStateUpdate(
141 std::unique_ptr<CompositorProtoState> compositor_proto_state) {
142 // Immediately deserialize the state update.
143 compositor_state_deserializer_->DeserializeCompositorUpdate(
144 compositor_proto_state->compositor_message->layer_tree_host());
145 }
146
147 // CompositorStateDeserializer implementation.
148 void DidUpdateLocalState() override { client_state_dirty_ = true; }
149
150 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
151 const gfx::Vector2dF& outer_delta,
152 const gfx::Vector2dF& elastic_overscroll_delta,
153 float page_scale,
154 float top_controls_delta) override {
155 compositor_state_deserializer_->ApplyViewportDeltas(
156 inner_delta, outer_delta, elastic_overscroll_delta, page_scale,
157 top_controls_delta);
158 }
159
160 void VerifyTreesAreIdentical() {
161 LayerTree* engine_layer_tree = layer_tree_host_remote_->GetLayerTree();
162 LayerTree* client_layer_tree = layer_tree_host_in_process_->GetLayerTree();
163
164 if (engine_layer_tree->root_layer()) {
165 LayerTreeHostCommon::CallFunctionForEveryLayer(
166 engine_layer_tree, [this](Layer* engine_layer) {
167 VerifyLayersAreIdentical(
168 engine_layer,
169 compositor_state_deserializer_->GetLayerForEngineId(
170 engine_layer->id()));
171 });
172 } else {
173 EXPECT_EQ(layer_tree_host_in_process_->GetLayerTree()->root_layer(),
174 nullptr);
175 }
176
177 // Viewport layers.
178 // Overscroll Elasticty Layer.
179 Layer* client_overscroll_elasticity_layer =
180 client_layer_tree->overscroll_elasticity_layer();
181 if (engine_layer_tree->overscroll_elasticity_layer()) {
182 int engine_overscroll_elasticity_layer_id =
183 engine_layer_tree->overscroll_elasticity_layer()->id();
184
185 EXPECT_LAYERS_EQ(engine_overscroll_elasticity_layer_id,
186 client_overscroll_elasticity_layer);
187 } else {
188 EXPECT_EQ(client_overscroll_elasticity_layer, nullptr);
189 }
190
191 // PageScale Layer.
192 Layer* client_page_scale_layer = client_layer_tree->page_scale_layer();
193 if (engine_layer_tree->page_scale_layer()) {
194 int engine_page_scale_layer_id =
195 engine_layer_tree->page_scale_layer()->id();
196
197 EXPECT_LAYERS_EQ(engine_page_scale_layer_id, client_page_scale_layer);
198 } else {
199 EXPECT_EQ(client_page_scale_layer, nullptr);
200 }
201
202 // InnerViewportScroll Layer.
203 Layer* client_inner_viewport_layer =
204 client_layer_tree->inner_viewport_scroll_layer();
205 if (engine_layer_tree->inner_viewport_scroll_layer()) {
206 int engine_inner_viewport_layer_id =
207 engine_layer_tree->inner_viewport_scroll_layer()->id();
208
209 EXPECT_LAYERS_EQ(engine_inner_viewport_layer_id,
210 client_inner_viewport_layer);
211 } else {
212 EXPECT_EQ(client_inner_viewport_layer, nullptr);
213 }
214
215 // OuterViewportScroll Layer.
216 Layer* client_outer_viewport_layer =
217 client_layer_tree->outer_viewport_scroll_layer();
218 if (engine_layer_tree->outer_viewport_scroll_layer()) {
219 int engine_outer_viewport_layer_id =
220 engine_layer_tree->outer_viewport_scroll_layer()->id();
221
222 EXPECT_LAYERS_EQ(engine_outer_viewport_layer_id,
223 client_outer_viewport_layer);
224 } else {
225 EXPECT_EQ(client_outer_viewport_layer, nullptr);
226 }
227 }
228
229 void VerifyLayersAreIdentical(Layer* engine_layer, Layer* client_layer) {
230 ASSERT_NE(client_layer, nullptr);
231
232 LayerTree* client_layer_tree = layer_tree_host_in_process_->GetLayerTree();
233 EXPECT_EQ(client_layer_tree, client_layer->GetLayerTree());
234
235 // Parent.
236 if (engine_layer->parent()) {
237 int engine_parent_id = engine_layer->parent()->id();
238 EXPECT_LAYERS_EQ(engine_parent_id, client_layer->parent());
239 } else {
240 EXPECT_EQ(client_layer->parent(), nullptr);
241 }
242
243 // Mask Layers.
244 if (engine_layer->mask_layer()) {
245 int engine_mask_layer_id = engine_layer->mask_layer()->id();
246 EXPECT_LAYERS_EQ(engine_mask_layer_id, client_layer->mask_layer());
247 } else {
248 EXPECT_EQ(client_layer->mask_layer(), nullptr);
249 }
250
251 // Scroll parent.
252 if (engine_layer->scroll_parent()) {
253 int engine_scroll_parent_id = engine_layer->scroll_parent()->id();
254 EXPECT_LAYERS_EQ(engine_scroll_parent_id, client_layer->scroll_parent());
255 } else {
256 EXPECT_EQ(client_layer->scroll_parent(), nullptr);
257 }
258
259 // Clip parent.
260 if (engine_layer->clip_parent()) {
261 int engine_clip_parent_id = engine_layer->clip_parent()->id();
262 EXPECT_LAYERS_EQ(engine_clip_parent_id, client_layer->clip_parent());
263 } else {
264 EXPECT_EQ(client_layer->clip_parent(), nullptr);
265 }
266
267 // Scroll-clip layer.
268 if (engine_layer->scroll_clip_layer()) {
269 int scroll_clip_id = engine_layer->scroll_clip_layer()->id();
270 EXPECT_LAYERS_EQ(scroll_clip_id, client_layer->scroll_clip_layer());
271 } else {
272 EXPECT_EQ(client_layer->scroll_clip_layer(), nullptr);
273 }
274 }
275
276 // Engine setup.
277 std::unique_ptr<LayerTreeHostRemote> layer_tree_host_remote_;
278 StubLayerTreeHostClient layer_tree_host_client_remote_;
279
280 // Client setup.
281 std::unique_ptr<AnimationHost> animation_host_;
282 std::unique_ptr<FakeLayerTreeHost> layer_tree_host_in_process_;
283 std::unique_ptr<CompositorStateDeserializer> compositor_state_deserializer_;
284 TestTaskGraphRunner task_graph_runner_;
285
286 FakeImageSerializationProcessor image_serialization_processor_;
287
288 bool client_state_dirty_ = false;
289 }; 66 };
290 67
291 TEST_F(CompositorStateDeserializerTest, BasicSync) { 68 TEST_F(CompositorStateDeserializerTest, BasicSync) {
292 // Set up a tree with a single node. 69 // Set up a tree with a single node.
293 scoped_refptr<Layer> root_layer = Layer::Create(); 70 scoped_refptr<Layer> root_layer = Layer::Create();
294 layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); 71 layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer);
295 72
296 // Synchronize State and verify. 73 // Synchronize State and verify.
297 base::RunLoop().RunUntilIdle(); 74 base::RunLoop().RunUntilIdle();
298 VerifyTreesAreIdentical(); 75 VerifyTreesAreIdentical();
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 picture_layer2->id())); 394 picture_layer2->id()));
618 scoped_refptr<DisplayItemList> client_display_list2 = 395 scoped_refptr<DisplayItemList> client_display_list2 =
619 client_picture_layer2->client()->PaintContentsToDisplayList( 396 client_picture_layer2->client()->PaintContentsToDisplayList(
620 ContentLayerClient::PaintingControlSetting::PAINTING_BEHAVIOR_NORMAL); 397 ContentLayerClient::PaintingControlSetting::PAINTING_BEHAVIOR_NORMAL);
621 EXPECT_TRUE(AreDisplayListDrawingResultsSame( 398 EXPECT_TRUE(AreDisplayListDrawingResultsSame(
622 gfx::Rect(layer_size), display_list.get(), client_display_list2.get())); 399 gfx::Rect(layer_size), display_list.get(), client_display_list2.get()));
623 } 400 }
624 401
625 } // namespace 402 } // namespace
626 } // namespace cc 403 } // namespace cc
OLDNEW
« no previous file with comments | « cc/BUILD.gn ('k') | cc/blimp/layer_tree_host_unittest_serialization.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698