OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "cc/output/compositor_frame.h" | 5 #include "cc/output/compositor_frame.h" |
6 #include "cc/quads/render_pass.h" | 6 #include "cc/quads/render_pass.h" |
7 #include "cc/quads/solid_color_draw_quad.h" | 7 #include "cc/quads/solid_color_draw_quad.h" |
8 #include "cc/quads/surface_draw_quad.h" | 8 #include "cc/quads/surface_draw_quad.h" |
9 #include "cc/surfaces/surface.h" | 9 #include "cc/surfaces/surface.h" |
10 #include "cc/surfaces/surface_aggregator.h" | 10 #include "cc/surfaces/surface_aggregator.h" |
11 #include "cc/surfaces/surface_factory.h" | 11 #include "cc/surfaces/surface_factory.h" |
12 #include "cc/surfaces/surface_factory_client.h" | 12 #include "cc/surfaces/surface_factory_client.h" |
13 #include "cc/surfaces/surface_id_allocator.h" | 13 #include "cc/surfaces/surface_id_allocator.h" |
14 #include "cc/surfaces/surface_manager.h" | 14 #include "cc/surfaces/surface_manager.h" |
15 #include "cc/test/pixel_comparator.h" | 15 #include "cc/test/pixel_comparator.h" |
16 #include "cc/test/pixel_test.h" | 16 #include "cc/test/pixel_test.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 | 18 |
19 #if !defined(OS_ANDROID) | 19 #if !defined(OS_ANDROID) |
20 | 20 |
21 namespace cc { | 21 namespace cc { |
22 namespace { | 22 namespace { |
23 | 23 |
24 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 24 static constexpr FrameSinkId kArbitraryRootFrameSinkId(1, 1); |
| 25 static constexpr FrameSinkId kArbitraryChildFrameSinkId(2, 2); |
| 26 static constexpr FrameSinkId kArbitraryLeftFrameSinkId(3, 3); |
| 27 static constexpr FrameSinkId kArbitraryRightFrameSinkId(4, 4); |
25 | 28 |
26 class EmptySurfaceFactoryClient : public SurfaceFactoryClient { | 29 class EmptySurfaceFactoryClient : public SurfaceFactoryClient { |
27 public: | 30 public: |
28 void ReturnResources(const ReturnedResourceArray& resources) override {} | 31 void ReturnResources(const ReturnedResourceArray& resources) override {} |
29 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} | 32 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} |
30 }; | 33 }; |
31 | 34 |
32 class SurfacesPixelTest : public RendererPixelTest<GLRenderer> { | 35 class SurfacesPixelTest : public RendererPixelTest<GLRenderer> { |
33 public: | 36 public: |
34 SurfacesPixelTest() : factory_(kArbitraryFrameSinkId, &manager_, &client_) {} | 37 SurfacesPixelTest() |
| 38 : factory_(kArbitraryRootFrameSinkId, &manager_, &client_) {} |
| 39 ~SurfacesPixelTest() override { factory_.EvictSurface(); } |
35 | 40 |
36 protected: | 41 protected: |
37 SurfaceManager manager_; | 42 SurfaceManager manager_; |
38 SurfaceIdAllocator allocator_; | 43 SurfaceIdAllocator allocator_; |
39 EmptySurfaceFactoryClient client_; | 44 EmptySurfaceFactoryClient client_; |
40 SurfaceFactory factory_; | 45 SurfaceFactory factory_; |
41 }; | 46 }; |
42 | 47 |
43 SharedQuadState* CreateAndAppendTestSharedQuadState( | 48 SharedQuadState* CreateAndAppendTestSharedQuadState( |
44 RenderPass* render_pass, | 49 RenderPass* render_pass, |
(...skipping 29 matching lines...) Expand all Loading... |
74 rect, | 79 rect, |
75 SK_ColorGREEN, | 80 SK_ColorGREEN, |
76 force_anti_aliasing_off); | 81 force_anti_aliasing_off); |
77 | 82 |
78 | 83 |
79 CompositorFrame root_frame; | 84 CompositorFrame root_frame; |
80 root_frame.render_pass_list.push_back(std::move(pass)); | 85 root_frame.render_pass_list.push_back(std::move(pass)); |
81 | 86 |
82 LocalFrameId root_local_frame_id = allocator_.GenerateId(); | 87 LocalFrameId root_local_frame_id = allocator_.GenerateId(); |
83 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id); | 88 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id); |
84 factory_.Create(root_local_frame_id); | |
85 factory_.SubmitCompositorFrame(root_local_frame_id, std::move(root_frame), | 89 factory_.SubmitCompositorFrame(root_local_frame_id, std::move(root_frame), |
86 SurfaceFactory::DrawCallback()); | 90 SurfaceFactory::DrawCallback()); |
87 | 91 |
88 SurfaceAggregator aggregator(&manager_, resource_provider_.get(), true); | 92 SurfaceAggregator aggregator(&manager_, resource_provider_.get(), true); |
89 CompositorFrame aggregated_frame = aggregator.Aggregate(root_surface_id); | 93 CompositorFrame aggregated_frame = aggregator.Aggregate(root_surface_id); |
90 factory_.Destroy(root_local_frame_id); | |
91 | 94 |
92 bool discard_alpha = false; | 95 bool discard_alpha = false; |
93 ExactPixelComparator pixel_comparator(discard_alpha); | 96 ExactPixelComparator pixel_comparator(discard_alpha); |
94 RenderPassList* pass_list = &aggregated_frame.render_pass_list; | 97 RenderPassList* pass_list = &aggregated_frame.render_pass_list; |
95 EXPECT_TRUE(RunPixelTest(pass_list, | 98 EXPECT_TRUE(RunPixelTest(pass_list, |
96 base::FilePath(FILE_PATH_LITERAL("green.png")), | 99 base::FilePath(FILE_PATH_LITERAL("green.png")), |
97 pixel_comparator)); | 100 pixel_comparator)); |
98 } | 101 } |
99 | 102 |
100 // Draws a frame with simple surface embedding. | 103 // Draws a frame with simple surface embedding. |
101 TEST_F(SurfacesPixelTest, DrawSimpleAggregatedFrame) { | 104 TEST_F(SurfacesPixelTest, DrawSimpleAggregatedFrame) { |
102 gfx::Size child_size(200, 100); | 105 gfx::Size child_size(200, 100); |
| 106 SurfaceFactory child_factory(kArbitraryChildFrameSinkId, &manager_, &client_); |
103 LocalFrameId child_local_frame_id = allocator_.GenerateId(); | 107 LocalFrameId child_local_frame_id = allocator_.GenerateId(); |
104 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); | 108 SurfaceId child_surface_id(child_factory.frame_sink_id(), |
| 109 child_local_frame_id); |
105 LocalFrameId root_local_frame_id = allocator_.GenerateId(); | 110 LocalFrameId root_local_frame_id = allocator_.GenerateId(); |
106 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id); | 111 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id); |
107 | 112 |
108 factory_.Create(child_local_frame_id); | |
109 factory_.Create(root_local_frame_id); | |
110 { | 113 { |
111 gfx::Rect rect(device_viewport_size_); | 114 gfx::Rect rect(device_viewport_size_); |
112 RenderPassId id(1, 1); | 115 RenderPassId id(1, 1); |
113 std::unique_ptr<RenderPass> pass = RenderPass::Create(); | 116 std::unique_ptr<RenderPass> pass = RenderPass::Create(); |
114 pass->SetNew(id, rect, rect, gfx::Transform()); | 117 pass->SetNew(id, rect, rect, gfx::Transform()); |
115 | 118 |
116 CreateAndAppendTestSharedQuadState( | 119 CreateAndAppendTestSharedQuadState( |
117 pass.get(), gfx::Transform(), device_viewport_size_); | 120 pass.get(), gfx::Transform(), device_viewport_size_); |
118 | 121 |
119 SurfaceDrawQuad* surface_quad = | 122 SurfaceDrawQuad* surface_quad = |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 bool force_anti_aliasing_off = false; | 156 bool force_anti_aliasing_off = false; |
154 color_quad->SetNew(pass->shared_quad_state_list.back(), | 157 color_quad->SetNew(pass->shared_quad_state_list.back(), |
155 rect, | 158 rect, |
156 rect, | 159 rect, |
157 SK_ColorBLUE, | 160 SK_ColorBLUE, |
158 force_anti_aliasing_off); | 161 force_anti_aliasing_off); |
159 | 162 |
160 CompositorFrame child_frame; | 163 CompositorFrame child_frame; |
161 child_frame.render_pass_list.push_back(std::move(pass)); | 164 child_frame.render_pass_list.push_back(std::move(pass)); |
162 | 165 |
163 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), | 166 child_factory.SubmitCompositorFrame(child_local_frame_id, |
164 SurfaceFactory::DrawCallback()); | 167 std::move(child_frame), |
| 168 SurfaceFactory::DrawCallback()); |
165 } | 169 } |
166 | 170 |
167 SurfaceAggregator aggregator(&manager_, resource_provider_.get(), true); | 171 SurfaceAggregator aggregator(&manager_, resource_provider_.get(), true); |
168 CompositorFrame aggregated_frame = aggregator.Aggregate(root_surface_id); | 172 CompositorFrame aggregated_frame = aggregator.Aggregate(root_surface_id); |
169 | 173 |
170 bool discard_alpha = false; | 174 bool discard_alpha = false; |
171 ExactPixelComparator pixel_comparator(discard_alpha); | 175 ExactPixelComparator pixel_comparator(discard_alpha); |
172 RenderPassList* pass_list = &aggregated_frame.render_pass_list; | 176 RenderPassList* pass_list = &aggregated_frame.render_pass_list; |
173 EXPECT_TRUE(RunPixelTest(pass_list, | 177 EXPECT_TRUE(RunPixelTest(pass_list, |
174 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")), | 178 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")), |
175 pixel_comparator)); | 179 pixel_comparator)); |
176 factory_.Destroy(root_local_frame_id); | 180 |
177 factory_.Destroy(child_local_frame_id); | 181 child_factory.EvictSurface(); |
178 } | 182 } |
179 | 183 |
180 // Tests a surface quad that has a non-identity transform into its pass. | 184 // Tests a surface quad that has a non-identity transform into its pass. |
181 TEST_F(SurfacesPixelTest, DrawAggregatedFrameWithSurfaceTransforms) { | 185 TEST_F(SurfacesPixelTest, DrawAggregatedFrameWithSurfaceTransforms) { |
182 gfx::Size child_size(100, 200); | 186 gfx::Size child_size(100, 200); |
183 gfx::Size quad_size(100, 100); | 187 gfx::Size quad_size(100, 100); |
184 // Structure: | 188 // Structure: |
185 // root (200x200) -> left_child (100x200 @ 0x0, | 189 // root (200x200) -> left_child (100x200 @ 0x0, |
186 // right_child (100x200 @ 0x100) | 190 // right_child (100x200 @ 0x100) |
187 // left_child -> top_green_quad (100x100 @ 0x0), | 191 // left_child -> top_green_quad (100x100 @ 0x0), |
188 // bottom_blue_quad (100x100 @ 0x100) | 192 // bottom_blue_quad (100x100 @ 0x100) |
189 // right_child -> top_blue_quad (100x100 @ 0x0), | 193 // right_child -> top_blue_quad (100x100 @ 0x0), |
190 // bottom_green_quad (100x100 @ 0x100) | 194 // bottom_green_quad (100x100 @ 0x100) |
| 195 SurfaceFactory left_factory(kArbitraryLeftFrameSinkId, &manager_, &client_); |
| 196 SurfaceFactory right_factory(kArbitraryRightFrameSinkId, &manager_, &client_); |
191 LocalFrameId left_child_local_id = allocator_.GenerateId(); | 197 LocalFrameId left_child_local_id = allocator_.GenerateId(); |
192 SurfaceId left_child_id(factory_.frame_sink_id(), left_child_local_id); | 198 SurfaceId left_child_id(left_factory.frame_sink_id(), left_child_local_id); |
193 LocalFrameId right_child_local_id = allocator_.GenerateId(); | 199 LocalFrameId right_child_local_id = allocator_.GenerateId(); |
194 SurfaceId right_child_id(factory_.frame_sink_id(), right_child_local_id); | 200 SurfaceId right_child_id(right_factory.frame_sink_id(), right_child_local_id); |
195 LocalFrameId root_local_frame_id = allocator_.GenerateId(); | 201 LocalFrameId root_local_frame_id = allocator_.GenerateId(); |
196 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id); | 202 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id); |
197 factory_.Create(left_child_local_id); | |
198 factory_.Create(right_child_local_id); | |
199 factory_.Create(root_local_frame_id); | |
200 | 203 |
201 { | 204 { |
202 gfx::Rect rect(device_viewport_size_); | 205 gfx::Rect rect(device_viewport_size_); |
203 RenderPassId id(1, 1); | 206 RenderPassId id(1, 1); |
204 std::unique_ptr<RenderPass> pass = RenderPass::Create(); | 207 std::unique_ptr<RenderPass> pass = RenderPass::Create(); |
205 pass->SetNew(id, rect, rect, gfx::Transform()); | 208 pass->SetNew(id, rect, rect, gfx::Transform()); |
206 | 209 |
207 gfx::Transform surface_transform; | 210 gfx::Transform surface_transform; |
208 CreateAndAppendTestSharedQuadState( | 211 CreateAndAppendTestSharedQuadState( |
209 pass.get(), surface_transform, device_viewport_size_); | 212 pass.get(), surface_transform, device_viewport_size_); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 258 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
256 bottom_color_quad->SetNew(pass->shared_quad_state_list.back(), | 259 bottom_color_quad->SetNew(pass->shared_quad_state_list.back(), |
257 gfx::Rect(0, 100, 100, 100), | 260 gfx::Rect(0, 100, 100, 100), |
258 gfx::Rect(0, 100, 100, 100), | 261 gfx::Rect(0, 100, 100, 100), |
259 SK_ColorBLUE, | 262 SK_ColorBLUE, |
260 force_anti_aliasing_off); | 263 force_anti_aliasing_off); |
261 | 264 |
262 CompositorFrame child_frame; | 265 CompositorFrame child_frame; |
263 child_frame.render_pass_list.push_back(std::move(pass)); | 266 child_frame.render_pass_list.push_back(std::move(pass)); |
264 | 267 |
265 factory_.SubmitCompositorFrame(left_child_local_id, std::move(child_frame), | 268 left_factory.SubmitCompositorFrame(left_child_local_id, |
266 SurfaceFactory::DrawCallback()); | 269 std::move(child_frame), |
| 270 SurfaceFactory::DrawCallback()); |
267 } | 271 } |
268 | 272 |
269 { | 273 { |
270 gfx::Rect rect(child_size); | 274 gfx::Rect rect(child_size); |
271 RenderPassId id(1, 1); | 275 RenderPassId id(1, 1); |
272 std::unique_ptr<RenderPass> pass = RenderPass::Create(); | 276 std::unique_ptr<RenderPass> pass = RenderPass::Create(); |
273 pass->SetNew(id, rect, rect, gfx::Transform()); | 277 pass->SetNew(id, rect, rect, gfx::Transform()); |
274 | 278 |
275 CreateAndAppendTestSharedQuadState( | 279 CreateAndAppendTestSharedQuadState( |
276 pass.get(), gfx::Transform(), child_size); | 280 pass.get(), gfx::Transform(), child_size); |
(...skipping 11 matching lines...) Expand all Loading... |
288 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 292 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
289 bottom_color_quad->SetNew(pass->shared_quad_state_list.back(), | 293 bottom_color_quad->SetNew(pass->shared_quad_state_list.back(), |
290 gfx::Rect(0, 100, 100, 100), | 294 gfx::Rect(0, 100, 100, 100), |
291 gfx::Rect(0, 100, 100, 100), | 295 gfx::Rect(0, 100, 100, 100), |
292 SK_ColorGREEN, | 296 SK_ColorGREEN, |
293 force_anti_aliasing_off); | 297 force_anti_aliasing_off); |
294 | 298 |
295 CompositorFrame child_frame; | 299 CompositorFrame child_frame; |
296 child_frame.render_pass_list.push_back(std::move(pass)); | 300 child_frame.render_pass_list.push_back(std::move(pass)); |
297 | 301 |
298 factory_.SubmitCompositorFrame(right_child_local_id, std::move(child_frame), | 302 right_factory.SubmitCompositorFrame(right_child_local_id, |
299 SurfaceFactory::DrawCallback()); | 303 std::move(child_frame), |
| 304 SurfaceFactory::DrawCallback()); |
300 } | 305 } |
301 | 306 |
302 SurfaceAggregator aggregator(&manager_, resource_provider_.get(), true); | 307 SurfaceAggregator aggregator(&manager_, resource_provider_.get(), true); |
303 CompositorFrame aggregated_frame = aggregator.Aggregate(root_surface_id); | 308 CompositorFrame aggregated_frame = aggregator.Aggregate(root_surface_id); |
304 | 309 |
305 bool discard_alpha = false; | 310 bool discard_alpha = false; |
306 ExactPixelComparator pixel_comparator(discard_alpha); | 311 ExactPixelComparator pixel_comparator(discard_alpha); |
307 RenderPassList* pass_list = &aggregated_frame.render_pass_list; | 312 RenderPassList* pass_list = &aggregated_frame.render_pass_list; |
308 EXPECT_TRUE(RunPixelTest( | 313 EXPECT_TRUE(RunPixelTest( |
309 pass_list, | 314 pass_list, |
310 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")), | 315 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")), |
311 pixel_comparator)); | 316 pixel_comparator)); |
312 | 317 |
313 factory_.Destroy(root_local_frame_id); | 318 left_factory.EvictSurface(); |
314 factory_.Destroy(left_child_local_id); | 319 right_factory.EvictSurface(); |
315 factory_.Destroy(right_child_local_id); | |
316 } | 320 } |
317 | 321 |
318 } // namespace | 322 } // namespace |
319 } // namespace cc | 323 } // namespace cc |
320 | 324 |
321 #endif // !defined(OS_ANDROID) | 325 #endif // !defined(OS_ANDROID) |
OLD | NEW |