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/surfaces/surface_aggregator.h" | 5 #include "cc/surfaces/surface_aggregator.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <utility> | 10 #include <utility> |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 protected: | 74 protected: |
75 SurfaceManager manager_; | 75 SurfaceManager manager_; |
76 EmptySurfaceFactoryClient empty_client_; | 76 EmptySurfaceFactoryClient empty_client_; |
77 SurfaceFactory factory_; | 77 SurfaceFactory factory_; |
78 SurfaceAggregator aggregator_; | 78 SurfaceAggregator aggregator_; |
79 }; | 79 }; |
80 | 80 |
81 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) { | 81 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) { |
82 LocalFrameId local_frame_id(7, 0); | 82 LocalFrameId local_frame_id(7, 0); |
83 SurfaceId one_id(kArbitraryFrameSinkId, local_frame_id); | 83 SurfaceId one_id(kArbitraryFrameSinkId, local_frame_id); |
84 factory_.Create(local_frame_id); | 84 factory_.SubmitCompositorFrame(local_frame_id, CompositorFrame(), |
| 85 SurfaceFactory::DrawCallback()); |
85 | 86 |
86 CompositorFrame frame = aggregator_.Aggregate(one_id); | 87 CompositorFrame frame = aggregator_.Aggregate(one_id); |
87 EXPECT_TRUE(frame.render_pass_list.empty()); | 88 EXPECT_TRUE(frame.render_pass_list.empty()); |
88 | |
89 factory_.Destroy(local_frame_id); | |
90 } | 89 } |
91 | 90 |
92 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest { | 91 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest { |
93 public: | 92 public: |
94 explicit SurfaceAggregatorValidSurfaceTest(bool use_damage_rect) | 93 explicit SurfaceAggregatorValidSurfaceTest(bool use_damage_rect) |
95 : SurfaceAggregatorTest(use_damage_rect), | 94 : SurfaceAggregatorTest(use_damage_rect), |
96 child_factory_(kArbitraryChildFrameSinkId, | 95 child_factory_(kArbitraryChildFrameSinkId, |
97 &manager_, | 96 &manager_, |
98 &empty_child_client_) {} | 97 &empty_child_client_) {} |
99 SurfaceAggregatorValidSurfaceTest() | 98 SurfaceAggregatorValidSurfaceTest() |
100 : SurfaceAggregatorValidSurfaceTest(false) {} | 99 : SurfaceAggregatorValidSurfaceTest(false) {} |
101 | 100 |
102 void SetUp() override { | 101 void SetUp() override { |
103 SurfaceAggregatorTest::SetUp(); | 102 SurfaceAggregatorTest::SetUp(); |
104 root_local_frame_id_ = allocator_.GenerateId(); | 103 root_local_frame_id_ = allocator_.GenerateId(); |
105 factory_.Create(root_local_frame_id_); | |
106 root_surface_ = manager_.GetSurfaceForId( | 104 root_surface_ = manager_.GetSurfaceForId( |
107 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_)); | 105 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_)); |
108 } | 106 } |
109 | 107 |
110 void TearDown() override { | 108 void TearDown() override { |
111 factory_.Destroy(root_local_frame_id_); | |
112 SurfaceAggregatorTest::TearDown(); | 109 SurfaceAggregatorTest::TearDown(); |
113 } | 110 } |
114 | 111 |
115 void AggregateAndVerify(test::Pass* expected_passes, | 112 void AggregateAndVerify(test::Pass* expected_passes, |
116 size_t expected_pass_count, | 113 size_t expected_pass_count, |
117 SurfaceId* surface_ids, | 114 SurfaceId* surface_ids, |
118 size_t expected_surface_count) { | 115 size_t expected_surface_count) { |
119 CompositorFrame aggregated_frame = aggregator_.Aggregate( | 116 CompositorFrame aggregated_frame = aggregator_.Aggregate( |
120 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_)); | 117 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_)); |
121 | 118 |
(...skipping 28 matching lines...) Expand all Loading... |
150 void SubmitCompositorFrame(SurfaceFactory* factory, | 147 void SubmitCompositorFrame(SurfaceFactory* factory, |
151 test::Pass* passes, | 148 test::Pass* passes, |
152 size_t pass_count, | 149 size_t pass_count, |
153 const LocalFrameId& local_frame_id) { | 150 const LocalFrameId& local_frame_id) { |
154 RenderPassList pass_list; | 151 RenderPassList pass_list; |
155 AddPasses(&pass_list, gfx::Rect(SurfaceSize()), passes, pass_count); | 152 AddPasses(&pass_list, gfx::Rect(SurfaceSize()), passes, pass_count); |
156 SubmitPassListAsFrame(factory, local_frame_id, &pass_list); | 153 SubmitPassListAsFrame(factory, local_frame_id, &pass_list); |
157 } | 154 } |
158 | 155 |
159 void QueuePassAsFrame(std::unique_ptr<RenderPass> pass, | 156 void QueuePassAsFrame(std::unique_ptr<RenderPass> pass, |
160 const LocalFrameId& local_frame_id) { | 157 const LocalFrameId& local_frame_id, |
| 158 SurfaceFactory& factory) { |
161 CompositorFrame child_frame; | 159 CompositorFrame child_frame; |
162 child_frame.render_pass_list.push_back(std::move(pass)); | 160 child_frame.render_pass_list.push_back(std::move(pass)); |
163 | 161 |
164 factory_.SubmitCompositorFrame(local_frame_id, std::move(child_frame), | 162 factory.SubmitCompositorFrame(local_frame_id, std::move(child_frame), |
165 SurfaceFactory::DrawCallback()); | 163 SurfaceFactory::DrawCallback()); |
166 } | 164 } |
167 | 165 |
168 protected: | 166 protected: |
169 LocalFrameId root_local_frame_id_; | 167 LocalFrameId root_local_frame_id_; |
170 Surface* root_surface_; | 168 Surface* root_surface_; |
171 SurfaceIdAllocator allocator_; | 169 SurfaceIdAllocator allocator_; |
172 EmptySurfaceFactoryClient empty_child_client_; | 170 EmptySurfaceFactoryClient empty_child_client_; |
173 SurfaceFactory child_factory_; | 171 SurfaceFactory child_factory_; |
174 SurfaceIdAllocator child_allocator_; | 172 SurfaceIdAllocator child_allocator_; |
175 }; | 173 }; |
(...skipping 12 matching lines...) Expand all Loading... |
188 SurfaceId ids[] = {root_surface_id}; | 186 SurfaceId ids[] = {root_surface_id}; |
189 | 187 |
190 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); | 188 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); |
191 | 189 |
192 // Check that WillDrawSurface was called. | 190 // Check that WillDrawSurface was called. |
193 EXPECT_EQ(gfx::Rect(SurfaceSize()), empty_client_.last_damage_rect_); | 191 EXPECT_EQ(gfx::Rect(SurfaceSize()), empty_client_.last_damage_rect_); |
194 EXPECT_EQ(root_local_frame_id_, empty_client_.last_local_frame_id_); | 192 EXPECT_EQ(root_local_frame_id_, empty_client_.last_local_frame_id_); |
195 } | 193 } |
196 | 194 |
197 TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) { | 195 TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) { |
| 196 SurfaceFactory embedded_factory(kArbitraryFrameSinkId, &manager_, |
| 197 &empty_client_); |
198 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); | 198 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); |
199 SurfaceId embedded_surface_id(factory_.frame_sink_id(), | 199 SurfaceId embedded_surface_id(factory_.frame_sink_id(), |
200 embedded_local_frame_id); | 200 embedded_local_frame_id); |
201 factory_.Create(embedded_local_frame_id); | |
202 | 201 |
203 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), | 202 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), |
204 test::Quad::SolidColorQuad(SK_ColorBLUE)}; | 203 test::Quad::SolidColorQuad(SK_ColorBLUE)}; |
205 test::Pass embedded_passes[] = { | 204 test::Pass embedded_passes[] = { |
206 test::Pass(embedded_quads, arraysize(embedded_quads))}; | 205 test::Pass(embedded_quads, arraysize(embedded_quads))}; |
207 | 206 |
208 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), | 207 SubmitCompositorFrame(&embedded_factory, embedded_passes, |
209 embedded_local_frame_id); | 208 arraysize(embedded_passes), embedded_local_frame_id); |
210 | 209 |
211 test::Quad quads[] = {test::Quad::SurfaceQuad(embedded_surface_id, .5f)}; | 210 test::Quad quads[] = {test::Quad::SurfaceQuad(embedded_surface_id, .5f)}; |
212 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; | 211 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; |
213 | 212 |
214 SubmitCompositorFrame(&factory_, passes, arraysize(passes), | 213 SubmitCompositorFrame(&factory_, passes, arraysize(passes), |
215 root_local_frame_id_); | 214 root_local_frame_id_); |
216 | 215 |
217 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 216 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
218 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 217 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
219 | 218 |
220 RenderPassList& render_pass_list(aggregated_frame.render_pass_list); | 219 RenderPassList& render_pass_list(aggregated_frame.render_pass_list); |
221 ASSERT_EQ(2u, render_pass_list.size()); | 220 ASSERT_EQ(2u, render_pass_list.size()); |
222 SharedQuadStateList& shared_quad_state_list( | 221 SharedQuadStateList& shared_quad_state_list( |
223 render_pass_list[0]->shared_quad_state_list); | 222 render_pass_list[0]->shared_quad_state_list); |
224 ASSERT_EQ(2u, shared_quad_state_list.size()); | 223 ASSERT_EQ(2u, shared_quad_state_list.size()); |
225 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(0)->opacity); | 224 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(0)->opacity); |
226 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(1)->opacity); | 225 EXPECT_EQ(1.f, shared_quad_state_list.ElementAt(1)->opacity); |
227 | 226 |
228 SharedQuadStateList& shared_quad_state_list2( | 227 SharedQuadStateList& shared_quad_state_list2( |
229 render_pass_list[1]->shared_quad_state_list); | 228 render_pass_list[1]->shared_quad_state_list); |
230 ASSERT_EQ(1u, shared_quad_state_list2.size()); | 229 ASSERT_EQ(1u, shared_quad_state_list2.size()); |
231 EXPECT_EQ(.5f, shared_quad_state_list2.ElementAt(0)->opacity); | 230 EXPECT_EQ(.5f, shared_quad_state_list2.ElementAt(0)->opacity); |
232 | |
233 factory_.Destroy(embedded_local_frame_id); | |
234 } | 231 } |
235 | 232 |
236 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSimpleFrame) { | 233 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSimpleFrame) { |
237 test::Quad quads[][2] = {{test::Quad::SolidColorQuad(SK_ColorWHITE), | 234 test::Quad quads[][2] = {{test::Quad::SolidColorQuad(SK_ColorWHITE), |
238 test::Quad::SolidColorQuad(SK_ColorLTGRAY)}, | 235 test::Quad::SolidColorQuad(SK_ColorLTGRAY)}, |
239 {test::Quad::SolidColorQuad(SK_ColorGRAY), | 236 {test::Quad::SolidColorQuad(SK_ColorGRAY), |
240 test::Quad::SolidColorQuad(SK_ColorDKGRAY)}}; | 237 test::Quad::SolidColorQuad(SK_ColorDKGRAY)}}; |
241 test::Pass passes[] = { | 238 test::Pass passes[] = { |
242 test::Pass(quads[0], arraysize(quads[0]), RenderPassId(1, 1)), | 239 test::Pass(quads[0], arraysize(quads[0]), RenderPassId(1, 1)), |
243 test::Pass(quads[1], arraysize(quads[1]), RenderPassId(1, 2))}; | 240 test::Pass(quads[1], arraysize(quads[1]), RenderPassId(1, 2))}; |
244 | 241 |
245 SubmitCompositorFrame(&factory_, passes, arraysize(passes), | 242 SubmitCompositorFrame(&factory_, passes, arraysize(passes), |
246 root_local_frame_id_); | 243 root_local_frame_id_); |
247 | 244 |
248 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 245 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
249 SurfaceId ids[] = {root_surface_id}; | 246 SurfaceId ids[] = {root_surface_id}; |
250 | 247 |
251 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); | 248 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); |
252 } | 249 } |
253 | 250 |
254 // This tests very simple embedding. root_surface has a frame containing a few | 251 // This tests very simple embedding. root_surface has a frame containing a few |
255 // solid color quads and a surface quad referencing embedded_surface. | 252 // solid color quads and a surface quad referencing embedded_surface. |
256 // embedded_surface has a frame containing only a solid color quad. The solid | 253 // embedded_surface has a frame containing only a solid color quad. The solid |
257 // color quad should be aggregated into the final frame. | 254 // color quad should be aggregated into the final frame. |
258 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) { | 255 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) { |
| 256 SurfaceFactory embedded_factory(kArbitraryFrameSinkId, &manager_, |
| 257 &empty_client_); |
259 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); | 258 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); |
260 SurfaceId embedded_surface_id(factory_.frame_sink_id(), | 259 SurfaceId embedded_surface_id(factory_.frame_sink_id(), |
261 embedded_local_frame_id); | 260 embedded_local_frame_id); |
262 factory_.Create(embedded_local_frame_id); | |
263 | 261 |
264 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; | 262 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; |
265 test::Pass embedded_passes[] = { | 263 test::Pass embedded_passes[] = { |
266 test::Pass(embedded_quads, arraysize(embedded_quads))}; | 264 test::Pass(embedded_quads, arraysize(embedded_quads))}; |
267 | 265 |
268 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), | 266 SubmitCompositorFrame(&embedded_factory, embedded_passes, |
269 embedded_local_frame_id); | 267 arraysize(embedded_passes), embedded_local_frame_id); |
270 | 268 |
271 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), | 269 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), |
272 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), | 270 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), |
273 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | 271 test::Quad::SolidColorQuad(SK_ColorBLACK)}; |
274 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; | 272 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; |
275 | 273 |
276 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes), | 274 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes), |
277 root_local_frame_id_); | 275 root_local_frame_id_); |
278 | 276 |
279 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), | 277 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), |
280 test::Quad::SolidColorQuad(SK_ColorGREEN), | 278 test::Quad::SolidColorQuad(SK_ColorGREEN), |
281 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | 279 test::Quad::SolidColorQuad(SK_ColorBLACK)}; |
282 test::Pass expected_passes[] = { | 280 test::Pass expected_passes[] = { |
283 test::Pass(expected_quads, arraysize(expected_quads))}; | 281 test::Pass(expected_quads, arraysize(expected_quads))}; |
284 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 282 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
285 SurfaceId ids[] = {root_surface_id, embedded_surface_id}; | 283 SurfaceId ids[] = {root_surface_id, embedded_surface_id}; |
286 AggregateAndVerify( | 284 AggregateAndVerify( |
287 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 285 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
288 | |
289 factory_.Destroy(embedded_local_frame_id); | |
290 } | 286 } |
291 | 287 |
292 TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) { | 288 TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) { |
| 289 SurfaceFactory embedded_factory(kArbitraryFrameSinkId, &manager_, |
| 290 &empty_client_); |
293 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); | 291 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); |
294 SurfaceId embedded_surface_id(factory_.frame_sink_id(), | 292 SurfaceId embedded_surface_id(factory_.frame_sink_id(), |
295 embedded_local_frame_id); | 293 embedded_local_frame_id); |
296 factory_.Create(embedded_local_frame_id); | |
297 | 294 |
298 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; | 295 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; |
299 test::Pass embedded_passes[] = { | 296 test::Pass embedded_passes[] = { |
300 test::Pass(embedded_quads, arraysize(embedded_quads))}; | 297 test::Pass(embedded_quads, arraysize(embedded_quads))}; |
301 | 298 |
302 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), | 299 SubmitCompositorFrame(&embedded_factory, embedded_passes, |
303 embedded_local_frame_id); | 300 arraysize(embedded_passes), embedded_local_frame_id); |
304 std::unique_ptr<CopyOutputRequest> copy_request( | 301 std::unique_ptr<CopyOutputRequest> copy_request( |
305 CopyOutputRequest::CreateEmptyRequest()); | 302 CopyOutputRequest::CreateEmptyRequest()); |
306 CopyOutputRequest* copy_request_ptr = copy_request.get(); | 303 CopyOutputRequest* copy_request_ptr = copy_request.get(); |
307 factory_.RequestCopyOfSurface(embedded_local_frame_id, | 304 embedded_factory.RequestCopyOfSurface(embedded_local_frame_id, |
308 std::move(copy_request)); | 305 std::move(copy_request)); |
309 | 306 |
310 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), | 307 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), |
311 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), | 308 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), |
312 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | 309 test::Quad::SolidColorQuad(SK_ColorBLACK)}; |
313 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; | 310 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; |
314 | 311 |
315 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes), | 312 SubmitCompositorFrame(&factory_, root_passes, arraysize(root_passes), |
316 root_local_frame_id_); | 313 root_local_frame_id_); |
317 | 314 |
318 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 315 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
(...skipping 15 matching lines...) Expand all Loading... |
334 | 331 |
335 SurfaceId surface_ids[] = {root_surface_id, embedded_surface_id}; | 332 SurfaceId surface_ids[] = {root_surface_id, embedded_surface_id}; |
336 EXPECT_EQ(arraysize(surface_ids), | 333 EXPECT_EQ(arraysize(surface_ids), |
337 aggregator_.previous_contained_surfaces().size()); | 334 aggregator_.previous_contained_surfaces().size()); |
338 for (size_t i = 0; i < arraysize(surface_ids); i++) { | 335 for (size_t i = 0; i < arraysize(surface_ids); i++) { |
339 EXPECT_TRUE( | 336 EXPECT_TRUE( |
340 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != | 337 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != |
341 aggregator_.previous_contained_surfaces().end()); | 338 aggregator_.previous_contained_surfaces().end()); |
342 } | 339 } |
343 | 340 |
344 factory_.Destroy(embedded_local_frame_id); | |
345 } | 341 } |
346 | 342 |
347 // Root surface may contain copy requests. | 343 // Root surface may contain copy requests. |
348 TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) { | 344 TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) { |
| 345 SurfaceFactory embedded_factory(kArbitraryFrameSinkId, &manager_, |
| 346 &empty_client_); |
349 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); | 347 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); |
350 SurfaceId embedded_surface_id(factory_.frame_sink_id(), | 348 SurfaceId embedded_surface_id(factory_.frame_sink_id(), |
351 embedded_local_frame_id); | 349 embedded_local_frame_id); |
352 factory_.Create(embedded_local_frame_id); | |
353 | 350 |
354 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; | 351 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; |
355 test::Pass embedded_passes[] = { | 352 test::Pass embedded_passes[] = { |
356 test::Pass(embedded_quads, arraysize(embedded_quads))}; | 353 test::Pass(embedded_quads, arraysize(embedded_quads))}; |
357 | 354 |
358 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), | 355 SubmitCompositorFrame(&embedded_factory, embedded_passes, |
359 embedded_local_frame_id); | 356 arraysize(embedded_passes), embedded_local_frame_id); |
360 std::unique_ptr<CopyOutputRequest> copy_request( | 357 std::unique_ptr<CopyOutputRequest> copy_request( |
361 CopyOutputRequest::CreateEmptyRequest()); | 358 CopyOutputRequest::CreateEmptyRequest()); |
362 CopyOutputRequest* copy_request_ptr = copy_request.get(); | 359 CopyOutputRequest* copy_request_ptr = copy_request.get(); |
363 std::unique_ptr<CopyOutputRequest> copy_request2( | 360 std::unique_ptr<CopyOutputRequest> copy_request2( |
364 CopyOutputRequest::CreateEmptyRequest()); | 361 CopyOutputRequest::CreateEmptyRequest()); |
365 CopyOutputRequest* copy_request2_ptr = copy_request2.get(); | 362 CopyOutputRequest* copy_request2_ptr = copy_request2.get(); |
366 | 363 |
367 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), | 364 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), |
368 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), | 365 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), |
369 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | 366 test::Quad::SolidColorQuad(SK_ColorBLACK)}; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 aggregator_.previous_contained_surfaces().end()); | 408 aggregator_.previous_contained_surfaces().end()); |
412 } | 409 } |
413 | 410 |
414 // Ensure copy requests have been removed from root surface. | 411 // Ensure copy requests have been removed from root surface. |
415 const CompositorFrame& original_frame = | 412 const CompositorFrame& original_frame = |
416 manager_.GetSurfaceForId(root_surface_id)->GetEligibleFrame(); | 413 manager_.GetSurfaceForId(root_surface_id)->GetEligibleFrame(); |
417 const RenderPassList& original_pass_list = original_frame.render_pass_list; | 414 const RenderPassList& original_pass_list = original_frame.render_pass_list; |
418 ASSERT_EQ(2u, original_pass_list.size()); | 415 ASSERT_EQ(2u, original_pass_list.size()); |
419 DCHECK(original_pass_list[0]->copy_requests.empty()); | 416 DCHECK(original_pass_list[0]->copy_requests.empty()); |
420 DCHECK(original_pass_list[1]->copy_requests.empty()); | 417 DCHECK(original_pass_list[1]->copy_requests.empty()); |
421 | |
422 factory_.Destroy(embedded_local_frame_id); | |
423 } | 418 } |
424 | 419 |
425 TEST_F(SurfaceAggregatorValidSurfaceTest, UnreferencedSurface) { | 420 TEST_F(SurfaceAggregatorValidSurfaceTest, UnreferencedSurface) { |
| 421 SurfaceFactory embedded_factory(kArbitraryFrameSinkId, &manager_, |
| 422 &empty_client_); |
426 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); | 423 LocalFrameId embedded_local_frame_id = allocator_.GenerateId(); |
427 SurfaceId embedded_surface_id(factory_.frame_sink_id(), | 424 SurfaceId embedded_surface_id(factory_.frame_sink_id(), |
428 embedded_local_frame_id); | 425 embedded_local_frame_id); |
429 SurfaceId nonexistent_surface_id(factory_.frame_sink_id(), | 426 SurfaceId nonexistent_surface_id(factory_.frame_sink_id(), |
430 allocator_.GenerateId()); | 427 allocator_.GenerateId()); |
431 factory_.Create(embedded_local_frame_id); | |
432 | 428 |
433 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; | 429 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; |
434 test::Pass embedded_passes[] = { | 430 test::Pass embedded_passes[] = { |
435 test::Pass(embedded_quads, arraysize(embedded_quads))}; | 431 test::Pass(embedded_quads, arraysize(embedded_quads))}; |
436 | 432 |
437 SubmitCompositorFrame(&factory_, embedded_passes, arraysize(embedded_passes), | 433 SubmitCompositorFrame(&embedded_factory, embedded_passes, |
438 embedded_local_frame_id); | 434 arraysize(embedded_passes), embedded_local_frame_id); |
439 std::unique_ptr<CopyOutputRequest> copy_request( | 435 std::unique_ptr<CopyOutputRequest> copy_request( |
440 CopyOutputRequest::CreateEmptyRequest()); | 436 CopyOutputRequest::CreateEmptyRequest()); |
441 CopyOutputRequest* copy_request_ptr = copy_request.get(); | 437 CopyOutputRequest* copy_request_ptr = copy_request.get(); |
442 factory_.RequestCopyOfSurface(embedded_local_frame_id, | 438 embedded_factory.RequestCopyOfSurface(embedded_local_frame_id, |
443 std::move(copy_request)); | 439 std::move(copy_request)); |
444 | 440 |
445 LocalFrameId parent_local_frame_id = allocator_.GenerateId(); | 441 LocalFrameId parent_local_frame_id = allocator_.GenerateId(); |
| 442 SurfaceFactory parent_factory(kArbitraryFrameSinkId, &manager_, |
| 443 &empty_client_); |
446 SurfaceId parent_surface_id(factory_.frame_sink_id(), parent_local_frame_id); | 444 SurfaceId parent_surface_id(factory_.frame_sink_id(), parent_local_frame_id); |
447 factory_.Create(parent_local_frame_id); | |
448 | 445 |
449 test::Quad parent_quads[] = { | 446 test::Quad parent_quads[] = { |
450 test::Quad::SolidColorQuad(SK_ColorWHITE), | 447 test::Quad::SolidColorQuad(SK_ColorWHITE), |
451 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), | 448 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), |
452 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | 449 test::Quad::SolidColorQuad(SK_ColorBLACK)}; |
453 test::Pass parent_passes[] = { | 450 test::Pass parent_passes[] = { |
454 test::Pass(parent_quads, arraysize(parent_quads))}; | 451 test::Pass(parent_quads, arraysize(parent_quads))}; |
455 | 452 |
456 { | 453 { |
457 CompositorFrame frame; | 454 CompositorFrame frame; |
458 | 455 |
459 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), parent_passes, | 456 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), parent_passes, |
460 arraysize(parent_passes)); | 457 arraysize(parent_passes)); |
461 | 458 |
462 frame.metadata.referenced_surfaces.push_back(embedded_surface_id); | 459 frame.metadata.referenced_surfaces.push_back(embedded_surface_id); |
463 | 460 |
464 factory_.SubmitCompositorFrame(parent_local_frame_id, std::move(frame), | 461 parent_factory.SubmitCompositorFrame(parent_local_frame_id, |
465 SurfaceFactory::DrawCallback()); | 462 std::move(frame), |
| 463 SurfaceFactory::DrawCallback()); |
466 } | 464 } |
467 | 465 |
468 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), | 466 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), |
469 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | 467 test::Quad::SolidColorQuad(SK_ColorBLACK)}; |
470 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; | 468 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; |
471 | 469 |
472 { | 470 { |
473 CompositorFrame frame; | 471 CompositorFrame frame; |
474 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes, | 472 AddPasses(&frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes, |
475 arraysize(root_passes)); | 473 arraysize(root_passes)); |
(...skipping 27 matching lines...) Expand all Loading... |
503 SurfaceId surface_ids[] = { | 501 SurfaceId surface_ids[] = { |
504 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_), | 502 SurfaceId(factory_.frame_sink_id(), root_local_frame_id_), |
505 parent_surface_id, embedded_surface_id, nonexistent_surface_id}; | 503 parent_surface_id, embedded_surface_id, nonexistent_surface_id}; |
506 EXPECT_EQ(arraysize(surface_ids), | 504 EXPECT_EQ(arraysize(surface_ids), |
507 aggregator_.previous_contained_surfaces().size()); | 505 aggregator_.previous_contained_surfaces().size()); |
508 for (size_t i = 0; i < arraysize(surface_ids); i++) { | 506 for (size_t i = 0; i < arraysize(surface_ids); i++) { |
509 EXPECT_TRUE( | 507 EXPECT_TRUE( |
510 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != | 508 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != |
511 aggregator_.previous_contained_surfaces().end()); | 509 aggregator_.previous_contained_surfaces().end()); |
512 } | 510 } |
513 | |
514 factory_.Destroy(parent_local_frame_id); | |
515 factory_.Destroy(embedded_local_frame_id); | |
516 } | 511 } |
517 | 512 |
518 // This tests referencing a surface that has multiple render passes. | 513 // This tests referencing a surface that has multiple render passes. |
519 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { | 514 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { |
520 LocalFrameId embedded_local_frame_id = child_allocator_.GenerateId(); | 515 LocalFrameId embedded_local_frame_id = child_allocator_.GenerateId(); |
521 SurfaceId embedded_surface_id(child_factory_.frame_sink_id(), | 516 SurfaceId embedded_surface_id(child_factory_.frame_sink_id(), |
522 embedded_local_frame_id); | 517 embedded_local_frame_id); |
523 child_factory_.Create(embedded_local_frame_id); | |
524 | 518 |
525 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), | 519 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), |
526 RenderPassId(1, 3)}; | 520 RenderPassId(1, 3)}; |
527 | 521 |
528 test::Quad embedded_quads[][2] = { | 522 test::Quad embedded_quads[][2] = { |
529 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)}, | 523 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)}, |
530 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])}, | 524 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])}, |
531 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}}; | 525 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}}; |
532 test::Pass embedded_passes[] = { | 526 test::Pass embedded_passes[] = { |
533 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]), | 527 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]), |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 // The last quad in the last pass will reference the second pass from the | 638 // The last quad in the last pass will reference the second pass from the |
645 // root surface, which after aggregating is the fourth pass in the overall | 639 // root surface, which after aggregating is the fourth pass in the overall |
646 // list. | 640 // list. |
647 ASSERT_EQ(DrawQuad::RENDER_PASS, | 641 ASSERT_EQ(DrawQuad::RENDER_PASS, |
648 fifth_pass_quad_list.ElementAt(1)->material); | 642 fifth_pass_quad_list.ElementAt(1)->material); |
649 const RenderPassDrawQuad* fifth_pass_render_pass_draw_quad = | 643 const RenderPassDrawQuad* fifth_pass_render_pass_draw_quad = |
650 RenderPassDrawQuad::MaterialCast(fifth_pass_quad_list.ElementAt(1)); | 644 RenderPassDrawQuad::MaterialCast(fifth_pass_quad_list.ElementAt(1)); |
651 EXPECT_EQ(actual_pass_ids[3], | 645 EXPECT_EQ(actual_pass_ids[3], |
652 fifth_pass_render_pass_draw_quad->render_pass_id); | 646 fifth_pass_render_pass_draw_quad->render_pass_id); |
653 } | 647 } |
654 child_factory_.Destroy(embedded_local_frame_id); | |
655 } | 648 } |
656 | 649 |
657 // Tests an invalid surface reference in a frame. The surface quad should just | 650 // Tests an invalid surface reference in a frame. The surface quad should just |
658 // be dropped. | 651 // be dropped. |
659 TEST_F(SurfaceAggregatorValidSurfaceTest, InvalidSurfaceReference) { | 652 TEST_F(SurfaceAggregatorValidSurfaceTest, InvalidSurfaceReference) { |
660 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), | 653 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), |
661 test::Quad::SurfaceQuad(InvalidSurfaceId(), 1.f), | 654 test::Quad::SurfaceQuad(InvalidSurfaceId(), 1.f), |
662 test::Quad::SolidColorQuad(SK_ColorBLUE)}; | 655 test::Quad::SolidColorQuad(SK_ColorBLUE)}; |
663 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; | 656 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; |
664 | 657 |
(...skipping 10 matching lines...) Expand all Loading... |
675 AggregateAndVerify( | 668 AggregateAndVerify( |
676 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 669 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
677 } | 670 } |
678 | 671 |
679 // Tests a reference to a valid surface with no submitted frame. This quad | 672 // Tests a reference to a valid surface with no submitted frame. This quad |
680 // should also just be dropped. | 673 // should also just be dropped. |
681 TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) { | 674 TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) { |
682 LocalFrameId empty_local_frame_id = allocator_.GenerateId(); | 675 LocalFrameId empty_local_frame_id = allocator_.GenerateId(); |
683 SurfaceId surface_with_no_frame_id(factory_.frame_sink_id(), | 676 SurfaceId surface_with_no_frame_id(factory_.frame_sink_id(), |
684 empty_local_frame_id); | 677 empty_local_frame_id); |
685 factory_.Create(empty_local_frame_id); | |
686 | 678 |
687 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), | 679 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), |
688 test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f), | 680 test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f), |
689 test::Quad::SolidColorQuad(SK_ColorBLUE)}; | 681 test::Quad::SolidColorQuad(SK_ColorBLUE)}; |
690 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; | 682 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; |
691 | 683 |
692 SubmitCompositorFrame(&factory_, passes, arraysize(passes), | 684 SubmitCompositorFrame(&factory_, passes, arraysize(passes), |
693 root_local_frame_id_); | 685 root_local_frame_id_); |
694 | 686 |
695 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), | 687 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), |
696 test::Quad::SolidColorQuad(SK_ColorBLUE)}; | 688 test::Quad::SolidColorQuad(SK_ColorBLUE)}; |
697 test::Pass expected_passes[] = { | 689 test::Pass expected_passes[] = { |
698 test::Pass(expected_quads, arraysize(expected_quads))}; | 690 test::Pass(expected_quads, arraysize(expected_quads))}; |
699 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 691 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
700 SurfaceId ids[] = {root_surface_id, surface_with_no_frame_id}; | 692 SurfaceId ids[] = {root_surface_id, surface_with_no_frame_id}; |
701 AggregateAndVerify( | 693 AggregateAndVerify( |
702 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 694 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
703 factory_.Destroy(empty_local_frame_id); | |
704 } | 695 } |
705 | 696 |
706 // Tests a surface quad referencing itself, generating a trivial cycle. | 697 // Tests a surface quad referencing itself, generating a trivial cycle. |
707 // The quad creating the cycle should be dropped from the final frame. | 698 // The quad creating the cycle should be dropped from the final frame. |
708 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleCyclicalReference) { | 699 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleCyclicalReference) { |
709 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 700 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
710 test::Quad quads[] = {test::Quad::SurfaceQuad(root_surface_id, 1.f), | 701 test::Quad quads[] = {test::Quad::SurfaceQuad(root_surface_id, 1.f), |
711 test::Quad::SolidColorQuad(SK_ColorYELLOW)}; | 702 test::Quad::SolidColorQuad(SK_ColorYELLOW)}; |
712 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; | 703 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; |
713 | 704 |
714 SubmitCompositorFrame(&factory_, passes, arraysize(passes), | 705 SubmitCompositorFrame(&factory_, passes, arraysize(passes), |
715 root_local_frame_id_); | 706 root_local_frame_id_); |
716 | 707 |
717 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorYELLOW)}; | 708 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorYELLOW)}; |
718 test::Pass expected_passes[] = { | 709 test::Pass expected_passes[] = { |
719 test::Pass(expected_quads, arraysize(expected_quads))}; | 710 test::Pass(expected_quads, arraysize(expected_quads))}; |
720 SurfaceId ids[] = {root_surface_id}; | 711 SurfaceId ids[] = {root_surface_id}; |
721 AggregateAndVerify( | 712 AggregateAndVerify( |
722 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 713 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
723 } | 714 } |
724 | 715 |
725 // Tests a more complex cycle with one intermediate surface. | 716 // Tests a more complex cycle with one intermediate surface. |
726 TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) { | 717 TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) { |
| 718 SurfaceFactory child_factory(kArbitraryFrameSinkId, &manager_, |
| 719 &empty_client_); |
727 LocalFrameId child_local_frame_id = allocator_.GenerateId(); | 720 LocalFrameId child_local_frame_id = allocator_.GenerateId(); |
728 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); | 721 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); |
729 factory_.Create(child_local_frame_id); | |
730 | 722 |
731 test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), | 723 test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), |
732 test::Quad::SurfaceQuad(child_surface_id, 1.f), | 724 test::Quad::SurfaceQuad(child_surface_id, 1.f), |
733 test::Quad::SolidColorQuad(SK_ColorCYAN)}; | 725 test::Quad::SolidColorQuad(SK_ColorCYAN)}; |
734 test::Pass parent_passes[] = { | 726 test::Pass parent_passes[] = { |
735 test::Pass(parent_quads, arraysize(parent_quads))}; | 727 test::Pass(parent_quads, arraysize(parent_quads))}; |
736 | 728 |
737 SubmitCompositorFrame(&factory_, parent_passes, arraysize(parent_passes), | 729 SubmitCompositorFrame(&factory_, parent_passes, arraysize(parent_passes), |
738 root_local_frame_id_); | 730 root_local_frame_id_); |
739 | 731 |
740 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 732 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
741 test::Quad child_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), | 733 test::Quad child_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), |
742 test::Quad::SurfaceQuad(root_surface_id, 1.f), | 734 test::Quad::SurfaceQuad(root_surface_id, 1.f), |
743 test::Quad::SolidColorQuad(SK_ColorMAGENTA)}; | 735 test::Quad::SolidColorQuad(SK_ColorMAGENTA)}; |
744 test::Pass child_passes[] = {test::Pass(child_quads, arraysize(child_quads))}; | 736 test::Pass child_passes[] = {test::Pass(child_quads, arraysize(child_quads))}; |
745 | 737 |
746 SubmitCompositorFrame(&factory_, child_passes, arraysize(child_passes), | 738 SubmitCompositorFrame(&child_factory, child_passes, arraysize(child_passes), |
747 child_local_frame_id); | 739 child_local_frame_id); |
748 | 740 |
749 // The child surface's reference to the root_surface_ will be dropped, so | 741 // The child surface's reference to the root_surface_ will be dropped, so |
750 // we'll end up with: | 742 // we'll end up with: |
751 // SK_ColorBLUE from the parent | 743 // SK_ColorBLUE from the parent |
752 // SK_ColorGREEN from the child | 744 // SK_ColorGREEN from the child |
753 // SK_ColorMAGENTA from the child | 745 // SK_ColorMAGENTA from the child |
754 // SK_ColorCYAN from the parent | 746 // SK_ColorCYAN from the parent |
755 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), | 747 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), |
756 test::Quad::SolidColorQuad(SK_ColorGREEN), | 748 test::Quad::SolidColorQuad(SK_ColorGREEN), |
757 test::Quad::SolidColorQuad(SK_ColorMAGENTA), | 749 test::Quad::SolidColorQuad(SK_ColorMAGENTA), |
758 test::Quad::SolidColorQuad(SK_ColorCYAN)}; | 750 test::Quad::SolidColorQuad(SK_ColorCYAN)}; |
759 test::Pass expected_passes[] = { | 751 test::Pass expected_passes[] = { |
760 test::Pass(expected_quads, arraysize(expected_quads))}; | 752 test::Pass(expected_quads, arraysize(expected_quads))}; |
761 SurfaceId ids[] = {root_surface_id, child_surface_id}; | 753 SurfaceId ids[] = {root_surface_id, child_surface_id}; |
762 AggregateAndVerify( | 754 AggregateAndVerify( |
763 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); | 755 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); |
764 factory_.Destroy(child_local_frame_id); | |
765 } | 756 } |
766 | 757 |
767 // Tests that we map render pass IDs from different surfaces into a unified | 758 // Tests that we map render pass IDs from different surfaces into a unified |
768 // namespace and update RenderPassDrawQuad's id references to match. | 759 // namespace and update RenderPassDrawQuad's id references to match. |
769 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) { | 760 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) { |
| 761 SurfaceFactory child_factory(kArbitraryFrameSinkId, &manager_, |
| 762 &empty_client_); |
770 LocalFrameId child_local_frame_id = allocator_.GenerateId(); | 763 LocalFrameId child_local_frame_id = allocator_.GenerateId(); |
771 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); | 764 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); |
772 factory_.Create(child_local_frame_id); | |
773 | 765 |
774 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; | 766 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; |
775 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)}, | 767 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)}, |
776 {test::Quad::RenderPassQuad(child_pass_id[0])}}; | 768 {test::Quad::RenderPassQuad(child_pass_id[0])}}; |
777 test::Pass surface_passes[] = { | 769 test::Pass surface_passes[] = { |
778 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]), | 770 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]), |
779 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])}; | 771 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])}; |
780 | 772 |
781 SubmitCompositorFrame(&factory_, surface_passes, arraysize(surface_passes), | 773 SubmitCompositorFrame(&child_factory, surface_passes, |
782 child_local_frame_id); | 774 arraysize(surface_passes), child_local_frame_id); |
783 | 775 |
784 // Pass IDs from the parent surface may collide with ones from the child. | 776 // Pass IDs from the parent surface may collide with ones from the child. |
785 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; | 777 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; |
786 test::Quad parent_quad[][1] = { | 778 test::Quad parent_quad[][1] = { |
787 {test::Quad::SurfaceQuad(child_surface_id, 1.f)}, | 779 {test::Quad::SurfaceQuad(child_surface_id, 1.f)}, |
788 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; | 780 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; |
789 test::Pass parent_passes[] = { | 781 test::Pass parent_passes[] = { |
790 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), | 782 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), |
791 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; | 783 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; |
792 | 784 |
(...skipping 23 matching lines...) Expand all Loading... |
816 aggregated_pass_list[2]->quad_list.front()}; | 808 aggregated_pass_list[2]->quad_list.front()}; |
817 ASSERT_EQ(render_pass_quads[0]->material, DrawQuad::RENDER_PASS); | 809 ASSERT_EQ(render_pass_quads[0]->material, DrawQuad::RENDER_PASS); |
818 EXPECT_EQ( | 810 EXPECT_EQ( |
819 actual_pass_ids[0], | 811 actual_pass_ids[0], |
820 RenderPassDrawQuad::MaterialCast(render_pass_quads[0])->render_pass_id); | 812 RenderPassDrawQuad::MaterialCast(render_pass_quads[0])->render_pass_id); |
821 | 813 |
822 ASSERT_EQ(render_pass_quads[1]->material, DrawQuad::RENDER_PASS); | 814 ASSERT_EQ(render_pass_quads[1]->material, DrawQuad::RENDER_PASS); |
823 EXPECT_EQ( | 815 EXPECT_EQ( |
824 actual_pass_ids[1], | 816 actual_pass_ids[1], |
825 RenderPassDrawQuad::MaterialCast(render_pass_quads[1])->render_pass_id); | 817 RenderPassDrawQuad::MaterialCast(render_pass_quads[1])->render_pass_id); |
826 factory_.Destroy(child_local_frame_id); | |
827 } | 818 } |
828 | 819 |
829 void AddSolidColorQuadWithBlendMode(const gfx::Size& size, | 820 void AddSolidColorQuadWithBlendMode(const gfx::Size& size, |
830 RenderPass* pass, | 821 RenderPass* pass, |
831 const SkXfermode::Mode blend_mode) { | 822 const SkXfermode::Mode blend_mode) { |
832 const gfx::Transform layer_to_target_transform; | 823 const gfx::Transform layer_to_target_transform; |
833 const gfx::Size layer_bounds(size); | 824 const gfx::Size layer_bounds(size); |
834 const gfx::Rect visible_layer_rect(size); | 825 const gfx::Rect visible_layer_rect(size); |
835 const gfx::Rect clip_rect(size); | 826 const gfx::Rect clip_rect(size); |
836 | 827 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateSharedQuadStateProperties) { | 870 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateSharedQuadStateProperties) { |
880 const SkXfermode::Mode blend_modes[] = {SkXfermode::kClear_Mode, // 0 | 871 const SkXfermode::Mode blend_modes[] = {SkXfermode::kClear_Mode, // 0 |
881 SkXfermode::kSrc_Mode, // 1 | 872 SkXfermode::kSrc_Mode, // 1 |
882 SkXfermode::kDst_Mode, // 2 | 873 SkXfermode::kDst_Mode, // 2 |
883 SkXfermode::kSrcOver_Mode, // 3 | 874 SkXfermode::kSrcOver_Mode, // 3 |
884 SkXfermode::kDstOver_Mode, // 4 | 875 SkXfermode::kDstOver_Mode, // 4 |
885 SkXfermode::kSrcIn_Mode, // 5 | 876 SkXfermode::kSrcIn_Mode, // 5 |
886 SkXfermode::kDstIn_Mode, // 6 | 877 SkXfermode::kDstIn_Mode, // 6 |
887 }; | 878 }; |
888 | 879 |
| 880 SurfaceFactory grandchild_factory(kArbitraryFrameSinkId, &manager_, |
| 881 &empty_client_); |
| 882 SurfaceFactory child_one_factory(kArbitraryFrameSinkId, &manager_, |
| 883 &empty_client_); |
| 884 SurfaceFactory child_two_factory(kArbitraryFrameSinkId, &manager_, |
| 885 &empty_client_); |
889 RenderPassId pass_id(1, 1); | 886 RenderPassId pass_id(1, 1); |
890 LocalFrameId grandchild_local_frame_id = allocator_.GenerateId(); | 887 LocalFrameId grandchild_local_frame_id = allocator_.GenerateId(); |
891 SurfaceId grandchild_surface_id(factory_.frame_sink_id(), | 888 SurfaceId grandchild_surface_id(factory_.frame_sink_id(), |
892 grandchild_local_frame_id); | 889 grandchild_local_frame_id); |
893 factory_.Create(grandchild_local_frame_id); | 890 grandchild_factory.SubmitCompositorFrame(grandchild_local_frame_id, |
| 891 CompositorFrame(), |
| 892 SurfaceFactory::DrawCallback()); |
894 std::unique_ptr<RenderPass> grandchild_pass = RenderPass::Create(); | 893 std::unique_ptr<RenderPass> grandchild_pass = RenderPass::Create(); |
895 gfx::Rect output_rect(SurfaceSize()); | 894 gfx::Rect output_rect(SurfaceSize()); |
896 gfx::Rect damage_rect(SurfaceSize()); | 895 gfx::Rect damage_rect(SurfaceSize()); |
897 gfx::Transform transform_to_root_target; | 896 gfx::Transform transform_to_root_target; |
898 grandchild_pass->SetNew( | 897 grandchild_pass->SetNew( |
899 pass_id, output_rect, damage_rect, transform_to_root_target); | 898 pass_id, output_rect, damage_rect, transform_to_root_target); |
900 AddSolidColorQuadWithBlendMode( | 899 AddSolidColorQuadWithBlendMode( |
901 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); | 900 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); |
902 QueuePassAsFrame(std::move(grandchild_pass), grandchild_local_frame_id); | 901 QueuePassAsFrame(std::move(grandchild_pass), grandchild_local_frame_id, |
| 902 grandchild_factory); |
903 | 903 |
904 LocalFrameId child_one_local_frame_id = allocator_.GenerateId(); | 904 LocalFrameId child_one_local_frame_id = allocator_.GenerateId(); |
905 SurfaceId child_one_surface_id(factory_.frame_sink_id(), | 905 SurfaceId child_one_surface_id(factory_.frame_sink_id(), |
906 child_one_local_frame_id); | 906 child_one_local_frame_id); |
907 factory_.Create(child_one_local_frame_id); | 907 child_one_factory.SubmitCompositorFrame(child_one_local_frame_id, |
| 908 CompositorFrame(), |
| 909 SurfaceFactory::DrawCallback()); |
908 | 910 |
909 std::unique_ptr<RenderPass> child_one_pass = RenderPass::Create(); | 911 std::unique_ptr<RenderPass> child_one_pass = RenderPass::Create(); |
910 child_one_pass->SetNew( | 912 child_one_pass->SetNew( |
911 pass_id, output_rect, damage_rect, transform_to_root_target); | 913 pass_id, output_rect, damage_rect, transform_to_root_target); |
912 AddSolidColorQuadWithBlendMode( | 914 AddSolidColorQuadWithBlendMode( |
913 SurfaceSize(), child_one_pass.get(), blend_modes[1]); | 915 SurfaceSize(), child_one_pass.get(), blend_modes[1]); |
914 SurfaceDrawQuad* grandchild_surface_quad = | 916 SurfaceDrawQuad* grandchild_surface_quad = |
915 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 917 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
916 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(), | 918 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(), |
917 gfx::Rect(SurfaceSize()), | 919 gfx::Rect(SurfaceSize()), |
918 gfx::Rect(SurfaceSize()), | 920 gfx::Rect(SurfaceSize()), |
919 grandchild_surface_id); | 921 grandchild_surface_id); |
920 AddSolidColorQuadWithBlendMode( | 922 AddSolidColorQuadWithBlendMode( |
921 SurfaceSize(), child_one_pass.get(), blend_modes[3]); | 923 SurfaceSize(), child_one_pass.get(), blend_modes[3]); |
922 QueuePassAsFrame(std::move(child_one_pass), child_one_local_frame_id); | 924 QueuePassAsFrame(std::move(child_one_pass), child_one_local_frame_id, |
| 925 child_one_factory); |
923 | 926 |
924 LocalFrameId child_two_local_frame_id = allocator_.GenerateId(); | 927 LocalFrameId child_two_local_frame_id = allocator_.GenerateId(); |
925 SurfaceId child_two_surface_id(factory_.frame_sink_id(), | 928 SurfaceId child_two_surface_id(factory_.frame_sink_id(), |
926 child_two_local_frame_id); | 929 child_two_local_frame_id); |
927 factory_.Create(child_two_local_frame_id); | 930 child_two_factory.SubmitCompositorFrame(child_two_local_frame_id, |
| 931 CompositorFrame(), |
| 932 SurfaceFactory::DrawCallback()); |
928 | 933 |
929 std::unique_ptr<RenderPass> child_two_pass = RenderPass::Create(); | 934 std::unique_ptr<RenderPass> child_two_pass = RenderPass::Create(); |
930 child_two_pass->SetNew( | 935 child_two_pass->SetNew( |
931 pass_id, output_rect, damage_rect, transform_to_root_target); | 936 pass_id, output_rect, damage_rect, transform_to_root_target); |
932 AddSolidColorQuadWithBlendMode( | 937 AddSolidColorQuadWithBlendMode( |
933 SurfaceSize(), child_two_pass.get(), blend_modes[5]); | 938 SurfaceSize(), child_two_pass.get(), blend_modes[5]); |
934 QueuePassAsFrame(std::move(child_two_pass), child_two_local_frame_id); | 939 QueuePassAsFrame(std::move(child_two_pass), child_two_local_frame_id, |
| 940 child_two_factory); |
935 | 941 |
936 std::unique_ptr<RenderPass> root_pass = RenderPass::Create(); | 942 std::unique_ptr<RenderPass> root_pass = RenderPass::Create(); |
937 root_pass->SetNew( | 943 root_pass->SetNew( |
938 pass_id, output_rect, damage_rect, transform_to_root_target); | 944 pass_id, output_rect, damage_rect, transform_to_root_target); |
939 | 945 |
940 AddSolidColorQuadWithBlendMode( | 946 AddSolidColorQuadWithBlendMode( |
941 SurfaceSize(), root_pass.get(), blend_modes[0]); | 947 SurfaceSize(), root_pass.get(), blend_modes[0]); |
942 SurfaceDrawQuad* child_one_surface_quad = | 948 SurfaceDrawQuad* child_one_surface_quad = |
943 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 949 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
944 child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), | 950 child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), |
945 gfx::Rect(SurfaceSize()), | 951 gfx::Rect(SurfaceSize()), |
946 gfx::Rect(SurfaceSize()), | 952 gfx::Rect(SurfaceSize()), |
947 child_one_surface_id); | 953 child_one_surface_id); |
948 AddSolidColorQuadWithBlendMode( | 954 AddSolidColorQuadWithBlendMode( |
949 SurfaceSize(), root_pass.get(), blend_modes[4]); | 955 SurfaceSize(), root_pass.get(), blend_modes[4]); |
950 SurfaceDrawQuad* child_two_surface_quad = | 956 SurfaceDrawQuad* child_two_surface_quad = |
951 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 957 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
952 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), | 958 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), |
953 gfx::Rect(SurfaceSize()), | 959 gfx::Rect(SurfaceSize()), |
954 gfx::Rect(SurfaceSize()), | 960 gfx::Rect(SurfaceSize()), |
955 child_two_surface_id); | 961 child_two_surface_id); |
956 AddSolidColorQuadWithBlendMode( | 962 AddSolidColorQuadWithBlendMode( |
957 SurfaceSize(), root_pass.get(), blend_modes[6]); | 963 SurfaceSize(), root_pass.get(), blend_modes[6]); |
958 | 964 |
959 QueuePassAsFrame(std::move(root_pass), root_local_frame_id_); | 965 QueuePassAsFrame(std::move(root_pass), root_local_frame_id_, factory_); |
960 | 966 |
961 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 967 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
962 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 968 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
963 | 969 |
964 const RenderPassList& aggregated_pass_list = | 970 const RenderPassList& aggregated_pass_list = |
965 aggregated_frame.render_pass_list; | 971 aggregated_frame.render_pass_list; |
966 | 972 |
967 ASSERT_EQ(1u, aggregated_pass_list.size()); | 973 ASSERT_EQ(1u, aggregated_pass_list.size()); |
968 | 974 |
969 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list; | 975 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list; |
970 | 976 |
971 ASSERT_EQ(7u, aggregated_quad_list.size()); | 977 ASSERT_EQ(7u, aggregated_quad_list.size()); |
972 | 978 |
973 for (auto iter = aggregated_quad_list.cbegin(); | 979 for (auto iter = aggregated_quad_list.cbegin(); |
974 iter != aggregated_quad_list.cend(); | 980 iter != aggregated_quad_list.cend(); |
975 ++iter) { | 981 ++iter) { |
976 EXPECT_EQ(blend_modes[iter.index()], iter->shared_quad_state->blend_mode) | 982 EXPECT_EQ(blend_modes[iter.index()], iter->shared_quad_state->blend_mode) |
977 << iter.index(); | 983 << iter.index(); |
978 } | 984 } |
979 factory_.Destroy(child_one_local_frame_id); | |
980 factory_.Destroy(child_two_local_frame_id); | |
981 factory_.Destroy(grandchild_local_frame_id); | |
982 } | 985 } |
983 | 986 |
984 // This tests that when aggregating a frame with multiple render passes that we | 987 // This tests that when aggregating a frame with multiple render passes that we |
985 // map the transforms for the root pass but do not modify the transform on child | 988 // map the transforms for the root pass but do not modify the transform on child |
986 // passes. | 989 // passes. |
987 // | 990 // |
988 // The root surface has one pass with a surface quad transformed by +10 in the y | 991 // The root surface has one pass with a surface quad transformed by +10 in the y |
989 // direction. | 992 // direction. |
990 // | 993 // |
991 // The middle surface has one pass with a surface quad scaled by 2 in the x | 994 // The middle surface has one pass with a surface quad scaled by 2 in the x |
992 // and 3 in the y directions. | 995 // and 3 in the y directions. |
993 // | 996 // |
994 // The child surface has two passes. The first pass has a quad with a transform | 997 // The child surface has two passes. The first pass has a quad with a transform |
995 // of +5 in the x direction. The second pass has a reference to the first pass' | 998 // of +5 in the x direction. The second pass has a reference to the first pass' |
996 // pass id and a transform of +8 in the x direction. | 999 // pass id and a transform of +8 in the x direction. |
997 // | 1000 // |
998 // After aggregation, the child surface's root pass quad should have all | 1001 // After aggregation, the child surface's root pass quad should have all |
999 // transforms concatenated for a total transform of +23 x, +10 y. The | 1002 // transforms concatenated for a total transform of +23 x, +10 y. The |
1000 // contributing render pass' transform in the aggregate frame should not be | 1003 // contributing render pass' transform in the aggregate frame should not be |
1001 // affected. | 1004 // affected. |
1002 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) { | 1005 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) { |
1003 // Innermost child surface. | 1006 // Innermost child surface. |
| 1007 SurfaceFactory child_factory(kArbitraryFrameSinkId, &manager_, |
| 1008 &empty_client_); |
1004 LocalFrameId child_local_frame_id = allocator_.GenerateId(); | 1009 LocalFrameId child_local_frame_id = allocator_.GenerateId(); |
1005 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); | 1010 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); |
1006 factory_.Create(child_local_frame_id); | |
1007 { | 1011 { |
1008 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; | 1012 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; |
1009 test::Quad child_quads[][1] = { | 1013 test::Quad child_quads[][1] = { |
1010 {test::Quad::SolidColorQuad(SK_ColorGREEN)}, | 1014 {test::Quad::SolidColorQuad(SK_ColorGREEN)}, |
1011 {test::Quad::RenderPassQuad(child_pass_id[0])}, | 1015 {test::Quad::RenderPassQuad(child_pass_id[0])}, |
1012 }; | 1016 }; |
1013 test::Pass child_passes[] = { | 1017 test::Pass child_passes[] = { |
1014 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]), | 1018 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]), |
1015 test::Pass(child_quads[1], arraysize(child_quads[1]), | 1019 test::Pass(child_quads[1], arraysize(child_quads[1]), |
1016 child_pass_id[1])}; | 1020 child_pass_id[1])}; |
1017 | 1021 |
1018 CompositorFrame child_frame; | 1022 CompositorFrame child_frame; |
1019 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), | 1023 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), |
1020 child_passes, arraysize(child_passes)); | 1024 child_passes, arraysize(child_passes)); |
1021 | 1025 |
1022 RenderPass* child_nonroot_pass = child_frame.render_pass_list[0].get(); | 1026 RenderPass* child_nonroot_pass = child_frame.render_pass_list[0].get(); |
1023 child_nonroot_pass->transform_to_root_target.Translate(8, 0); | 1027 child_nonroot_pass->transform_to_root_target.Translate(8, 0); |
1024 SharedQuadState* child_nonroot_pass_sqs = | 1028 SharedQuadState* child_nonroot_pass_sqs = |
1025 child_nonroot_pass->shared_quad_state_list.front(); | 1029 child_nonroot_pass->shared_quad_state_list.front(); |
1026 child_nonroot_pass_sqs->quad_to_target_transform.Translate(5, 0); | 1030 child_nonroot_pass_sqs->quad_to_target_transform.Translate(5, 0); |
1027 | 1031 |
1028 RenderPass* child_root_pass = child_frame.render_pass_list[1].get(); | 1032 RenderPass* child_root_pass = child_frame.render_pass_list[1].get(); |
1029 SharedQuadState* child_root_pass_sqs = | 1033 SharedQuadState* child_root_pass_sqs = |
1030 child_root_pass->shared_quad_state_list.front(); | 1034 child_root_pass->shared_quad_state_list.front(); |
1031 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); | 1035 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); |
1032 child_root_pass_sqs->is_clipped = true; | 1036 child_root_pass_sqs->is_clipped = true; |
1033 child_root_pass_sqs->clip_rect = gfx::Rect(0, 0, 5, 5); | 1037 child_root_pass_sqs->clip_rect = gfx::Rect(0, 0, 5, 5); |
1034 | 1038 |
1035 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), | 1039 child_factory.SubmitCompositorFrame(child_local_frame_id, |
1036 SurfaceFactory::DrawCallback()); | 1040 std::move(child_frame), |
| 1041 SurfaceFactory::DrawCallback()); |
1037 } | 1042 } |
1038 | 1043 |
1039 // Middle child surface. | 1044 // Middle child surface. |
| 1045 SurfaceFactory middle_factory(kArbitraryFrameSinkId, &manager_, |
| 1046 &empty_client_); |
1040 LocalFrameId middle_local_frame_id = allocator_.GenerateId(); | 1047 LocalFrameId middle_local_frame_id = allocator_.GenerateId(); |
1041 SurfaceId middle_surface_id(factory_.frame_sink_id(), middle_local_frame_id); | 1048 SurfaceId middle_surface_id(factory_.frame_sink_id(), middle_local_frame_id); |
1042 factory_.Create(middle_local_frame_id); | |
1043 { | 1049 { |
1044 test::Quad middle_quads[] = { | 1050 test::Quad middle_quads[] = { |
1045 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; | 1051 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; |
1046 test::Pass middle_passes[] = { | 1052 test::Pass middle_passes[] = { |
1047 test::Pass(middle_quads, arraysize(middle_quads)), | 1053 test::Pass(middle_quads, arraysize(middle_quads)), |
1048 }; | 1054 }; |
1049 | 1055 |
1050 CompositorFrame middle_frame; | 1056 CompositorFrame middle_frame; |
1051 AddPasses(&middle_frame.render_pass_list, gfx::Rect(SurfaceSize()), | 1057 AddPasses(&middle_frame.render_pass_list, gfx::Rect(SurfaceSize()), |
1052 middle_passes, arraysize(middle_passes)); | 1058 middle_passes, arraysize(middle_passes)); |
1053 | 1059 |
1054 RenderPass* middle_root_pass = middle_frame.render_pass_list[0].get(); | 1060 RenderPass* middle_root_pass = middle_frame.render_pass_list[0].get(); |
1055 middle_root_pass->quad_list.ElementAt(0)->visible_rect = | 1061 middle_root_pass->quad_list.ElementAt(0)->visible_rect = |
1056 gfx::Rect(0, 1, 100, 7); | 1062 gfx::Rect(0, 1, 100, 7); |
1057 SharedQuadState* middle_root_pass_sqs = | 1063 SharedQuadState* middle_root_pass_sqs = |
1058 middle_root_pass->shared_quad_state_list.front(); | 1064 middle_root_pass->shared_quad_state_list.front(); |
1059 middle_root_pass_sqs->quad_to_target_transform.Scale(2, 3); | 1065 middle_root_pass_sqs->quad_to_target_transform.Scale(2, 3); |
1060 | 1066 |
1061 factory_.SubmitCompositorFrame(middle_local_frame_id, | 1067 middle_factory.SubmitCompositorFrame(middle_local_frame_id, |
1062 std::move(middle_frame), | 1068 std::move(middle_frame), |
1063 SurfaceFactory::DrawCallback()); | 1069 SurfaceFactory::DrawCallback()); |
1064 } | 1070 } |
1065 | 1071 |
1066 // Root surface. | 1072 // Root surface. |
1067 test::Quad secondary_quads[] = { | 1073 test::Quad secondary_quads[] = { |
1068 test::Quad::SolidColorQuad(1), | 1074 test::Quad::SolidColorQuad(1), |
1069 test::Quad::SurfaceQuad(middle_surface_id, 1.f)}; | 1075 test::Quad::SurfaceQuad(middle_surface_id, 1.f)}; |
1070 test::Quad root_quads[] = {test::Quad::SolidColorQuad(1)}; | 1076 test::Quad root_quads[] = {test::Quad::SolidColorQuad(1)}; |
1071 test::Pass root_passes[] = { | 1077 test::Pass root_passes[] = { |
1072 test::Pass(secondary_quads, arraysize(secondary_quads)), | 1078 test::Pass(secondary_quads, arraysize(secondary_quads)), |
1073 test::Pass(root_quads, arraysize(root_quads))}; | 1079 test::Pass(root_quads, arraysize(root_quads))}; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 EXPECT_TRUE( | 1161 EXPECT_TRUE( |
1156 aggregated_pass_list[1]->shared_quad_state_list.ElementAt(1)->is_clipped); | 1162 aggregated_pass_list[1]->shared_quad_state_list.ElementAt(1)->is_clipped); |
1157 | 1163 |
1158 // The second quad in the root pass is aggregated from the child, so its | 1164 // The second quad in the root pass is aggregated from the child, so its |
1159 // clip rect must be transformed by the child's translation/scale and | 1165 // clip rect must be transformed by the child's translation/scale and |
1160 // clipped be the visible_rects for both children. | 1166 // clipped be the visible_rects for both children. |
1161 EXPECT_EQ(gfx::Rect(0, 13, 8, 12).ToString(), | 1167 EXPECT_EQ(gfx::Rect(0, 13, 8, 12).ToString(), |
1162 aggregated_pass_list[1] | 1168 aggregated_pass_list[1] |
1163 ->shared_quad_state_list.ElementAt(1) | 1169 ->shared_quad_state_list.ElementAt(1) |
1164 ->clip_rect.ToString()); | 1170 ->clip_rect.ToString()); |
1165 | |
1166 factory_.Destroy(middle_local_frame_id); | |
1167 factory_.Destroy(child_local_frame_id); | |
1168 } | 1171 } |
1169 | 1172 |
1170 // Tests that damage rects are aggregated correctly when surfaces change. | 1173 // Tests that damage rects are aggregated correctly when surfaces change. |
1171 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) { | 1174 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) { |
| 1175 SurfaceFactory child_factory(kArbitraryFrameSinkId, &manager_, |
| 1176 &empty_client_); |
| 1177 SurfaceFactory parent_factory(kArbitraryFrameSinkId, &manager_, |
| 1178 &empty_client_); |
1172 test::Quad child_quads[] = {test::Quad::RenderPassQuad(RenderPassId(1, 1))}; | 1179 test::Quad child_quads[] = {test::Quad::RenderPassQuad(RenderPassId(1, 1))}; |
1173 test::Pass child_passes[] = { | 1180 test::Pass child_passes[] = { |
1174 test::Pass(child_quads, arraysize(child_quads), RenderPassId(1, 1))}; | 1181 test::Pass(child_quads, arraysize(child_quads), RenderPassId(1, 1))}; |
1175 | 1182 |
1176 CompositorFrame child_frame; | 1183 CompositorFrame child_frame; |
1177 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), | 1184 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), |
1178 child_passes, arraysize(child_passes)); | 1185 child_passes, arraysize(child_passes)); |
1179 | 1186 |
1180 RenderPass* child_root_pass = child_frame.render_pass_list[0].get(); | 1187 RenderPass* child_root_pass = child_frame.render_pass_list[0].get(); |
1181 SharedQuadState* child_root_pass_sqs = | 1188 SharedQuadState* child_root_pass_sqs = |
1182 child_root_pass->shared_quad_state_list.front(); | 1189 child_root_pass->shared_quad_state_list.front(); |
1183 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); | 1190 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); |
1184 | 1191 |
1185 LocalFrameId child_local_frame_id = allocator_.GenerateId(); | 1192 LocalFrameId child_local_frame_id = allocator_.GenerateId(); |
1186 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); | 1193 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); |
1187 factory_.Create(child_local_frame_id); | 1194 child_factory.SubmitCompositorFrame(child_local_frame_id, |
1188 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), | 1195 std::move(child_frame), |
1189 SurfaceFactory::DrawCallback()); | 1196 SurfaceFactory::DrawCallback()); |
1190 | 1197 |
1191 test::Quad parent_surface_quads[] = { | 1198 test::Quad parent_surface_quads[] = { |
1192 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; | 1199 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; |
1193 test::Pass parent_surface_passes[] = { | 1200 test::Pass parent_surface_passes[] = { |
1194 test::Pass(parent_surface_quads, arraysize(parent_surface_quads), | 1201 test::Pass(parent_surface_quads, arraysize(parent_surface_quads), |
1195 RenderPassId(1, 1))}; | 1202 RenderPassId(1, 1))}; |
1196 | 1203 |
1197 // Parent surface is only used to test if the transform is applied correctly | 1204 // Parent surface is only used to test if the transform is applied correctly |
1198 // to the child surface's damage. | 1205 // to the child surface's damage. |
1199 CompositorFrame parent_surface_frame; | 1206 CompositorFrame parent_surface_frame; |
1200 AddPasses(&parent_surface_frame.render_pass_list, gfx::Rect(SurfaceSize()), | 1207 AddPasses(&parent_surface_frame.render_pass_list, gfx::Rect(SurfaceSize()), |
1201 parent_surface_passes, arraysize(parent_surface_passes)); | 1208 parent_surface_passes, arraysize(parent_surface_passes)); |
1202 | 1209 |
1203 LocalFrameId parent_local_frame_id = allocator_.GenerateId(); | 1210 LocalFrameId parent_local_frame_id = allocator_.GenerateId(); |
1204 SurfaceId parent_surface_id(factory_.frame_sink_id(), parent_local_frame_id); | 1211 SurfaceId parent_surface_id(factory_.frame_sink_id(), parent_local_frame_id); |
1205 factory_.Create(parent_local_frame_id); | 1212 parent_factory.SubmitCompositorFrame(parent_local_frame_id, |
1206 factory_.SubmitCompositorFrame(parent_local_frame_id, | 1213 std::move(parent_surface_frame), |
1207 std::move(parent_surface_frame), | 1214 SurfaceFactory::DrawCallback()); |
1208 SurfaceFactory::DrawCallback()); | |
1209 | 1215 |
1210 test::Quad root_surface_quads[] = { | 1216 test::Quad root_surface_quads[] = { |
1211 test::Quad::SurfaceQuad(parent_surface_id, 1.f)}; | 1217 test::Quad::SurfaceQuad(parent_surface_id, 1.f)}; |
1212 test::Quad root_render_pass_quads[] = { | 1218 test::Quad root_render_pass_quads[] = { |
1213 test::Quad::RenderPassQuad(RenderPassId(1, 1))}; | 1219 test::Quad::RenderPassQuad(RenderPassId(1, 1))}; |
1214 | 1220 |
1215 test::Pass root_passes[] = { | 1221 test::Pass root_passes[] = { |
1216 test::Pass(root_surface_quads, arraysize(root_surface_quads), | 1222 test::Pass(root_surface_quads, arraysize(root_surface_quads), |
1217 RenderPassId(1, 1)), | 1223 RenderPassId(1, 1)), |
1218 test::Pass(root_render_pass_quads, arraysize(root_render_pass_quads), | 1224 test::Pass(root_render_pass_quads, arraysize(root_render_pass_quads), |
(...skipping 28 matching lines...) Expand all Loading... |
1247 CompositorFrame child_frame; | 1253 CompositorFrame child_frame; |
1248 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), | 1254 AddPasses(&child_frame.render_pass_list, gfx::Rect(SurfaceSize()), |
1249 child_passes, arraysize(child_passes)); | 1255 child_passes, arraysize(child_passes)); |
1250 | 1256 |
1251 RenderPass* child_root_pass = child_frame.render_pass_list[0].get(); | 1257 RenderPass* child_root_pass = child_frame.render_pass_list[0].get(); |
1252 SharedQuadState* child_root_pass_sqs = | 1258 SharedQuadState* child_root_pass_sqs = |
1253 child_root_pass->shared_quad_state_list.front(); | 1259 child_root_pass->shared_quad_state_list.front(); |
1254 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); | 1260 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); |
1255 child_root_pass->damage_rect = gfx::Rect(10, 10, 10, 10); | 1261 child_root_pass->damage_rect = gfx::Rect(10, 10, 10, 10); |
1256 | 1262 |
1257 factory_.SubmitCompositorFrame(child_local_frame_id, std::move(child_frame), | 1263 child_factory.SubmitCompositorFrame(child_local_frame_id, |
1258 SurfaceFactory::DrawCallback()); | 1264 std::move(child_frame), |
| 1265 SurfaceFactory::DrawCallback()); |
1259 | 1266 |
1260 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); | 1267 SurfaceId root_surface_id(factory_.frame_sink_id(), root_local_frame_id_); |
1261 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 1268 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
1262 | 1269 |
1263 const RenderPassList& aggregated_pass_list = | 1270 const RenderPassList& aggregated_pass_list = |
1264 aggregated_frame.render_pass_list; | 1271 aggregated_frame.render_pass_list; |
1265 | 1272 |
1266 ASSERT_EQ(2u, aggregated_pass_list.size()); | 1273 ASSERT_EQ(2u, aggregated_pass_list.size()); |
1267 | 1274 |
1268 // Outer surface didn't change, so transformed inner damage rect should be | 1275 // Outer surface didn't change, so transformed inner damage rect should be |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 1339 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
1333 | 1340 |
1334 const RenderPassList& aggregated_pass_list = | 1341 const RenderPassList& aggregated_pass_list = |
1335 aggregated_frame.render_pass_list; | 1342 aggregated_frame.render_pass_list; |
1336 | 1343 |
1337 ASSERT_EQ(2u, aggregated_pass_list.size()); | 1344 ASSERT_EQ(2u, aggregated_pass_list.size()); |
1338 | 1345 |
1339 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains( | 1346 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains( |
1340 gfx::Rect(SurfaceSize()))); | 1347 gfx::Rect(SurfaceSize()))); |
1341 } | 1348 } |
1342 | |
1343 factory_.Destroy(child_local_frame_id); | |
1344 } | 1349 } |
1345 | 1350 |
1346 // Check that damage is correctly calculated for surfaces with | 1351 // Check that damage is correctly calculated for surfaces with |
1347 // SetPreviousFrameSurface. | 1352 // SetPreviousFrameSurface. |
1348 TEST_F(SurfaceAggregatorValidSurfaceTest, SwitchSurfaceDamage) { | 1353 TEST_F(SurfaceAggregatorValidSurfaceTest, SwitchSurfaceDamage) { |
| 1354 SurfaceFactory factory2(kArbitraryFrameSinkId, &manager_, &empty_client_); |
1349 test::Quad root_render_pass_quads[] = {test::Quad::SolidColorQuad(1)}; | 1355 test::Quad root_render_pass_quads[] = {test::Quad::SolidColorQuad(1)}; |
1350 | 1356 |
1351 test::Pass root_passes[] = {test::Pass(root_render_pass_quads, | 1357 test::Pass root_passes[] = {test::Pass(root_render_pass_quads, |
1352 arraysize(root_render_pass_quads), | 1358 arraysize(root_render_pass_quads), |
1353 RenderPassId(2, 1))}; | 1359 RenderPassId(2, 1))}; |
1354 | 1360 |
1355 CompositorFrame root_frame; | 1361 CompositorFrame root_frame; |
1356 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes, | 1362 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), root_passes, |
1357 arraysize(root_passes)); | 1363 arraysize(root_passes)); |
1358 | 1364 |
(...skipping 25 matching lines...) Expand all Loading... |
1384 test::Pass root_passes[] = {test::Pass(root_render_pass_quads, | 1390 test::Pass root_passes[] = {test::Pass(root_render_pass_quads, |
1385 arraysize(root_render_pass_quads), | 1391 arraysize(root_render_pass_quads), |
1386 RenderPassId(2, 1))}; | 1392 RenderPassId(2, 1))}; |
1387 | 1393 |
1388 CompositorFrame root_frame; | 1394 CompositorFrame root_frame; |
1389 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), | 1395 AddPasses(&root_frame.render_pass_list, gfx::Rect(SurfaceSize()), |
1390 root_passes, arraysize(root_passes)); | 1396 root_passes, arraysize(root_passes)); |
1391 | 1397 |
1392 root_frame.render_pass_list[0]->damage_rect = gfx::Rect(1, 2, 3, 4); | 1398 root_frame.render_pass_list[0]->damage_rect = gfx::Rect(1, 2, 3, 4); |
1393 | 1399 |
1394 factory_.Create(second_root_local_frame_id); | 1400 factory2.SubmitCompositorFrame(second_root_local_frame_id, |
1395 factory_.SubmitCompositorFrame(second_root_local_frame_id, | |
1396 std::move(root_frame), | 1401 std::move(root_frame), |
1397 SurfaceFactory::DrawCallback()); | 1402 SurfaceFactory::DrawCallback()); |
1398 factory_.SetPreviousFrameSurface(second_root_local_frame_id, | 1403 factory2.SetPreviousFrameSurface(second_root_local_frame_id, |
1399 root_local_frame_id_); | 1404 root_local_frame_id_); |
1400 } | 1405 } |
1401 { | 1406 { |
1402 CompositorFrame aggregated_frame = | 1407 CompositorFrame aggregated_frame = |
1403 aggregator_.Aggregate(second_root_surface_id); | 1408 aggregator_.Aggregate(second_root_surface_id); |
1404 | 1409 |
1405 const RenderPassList& aggregated_pass_list = | 1410 const RenderPassList& aggregated_pass_list = |
1406 aggregated_frame.render_pass_list; | 1411 aggregated_frame.render_pass_list; |
1407 | 1412 |
1408 ASSERT_EQ(1u, aggregated_pass_list.size()); | 1413 ASSERT_EQ(1u, aggregated_pass_list.size()); |
1409 | 1414 |
1410 // Frame from SetPreviousFrameSurface was aggregated last, so damage rect | 1415 // Frame from SetPreviousFrameSurface was aggregated last, so damage rect |
1411 // from new surface should be used. | 1416 // from new surface should be used. |
1412 EXPECT_EQ(gfx::Rect(1, 2, 3, 4), aggregated_pass_list[0]->damage_rect); | 1417 EXPECT_EQ(gfx::Rect(1, 2, 3, 4), aggregated_pass_list[0]->damage_rect); |
1413 } | 1418 } |
1414 { | 1419 { |
1415 CompositorFrame aggregated_frame = | 1420 CompositorFrame aggregated_frame = |
1416 aggregator_.Aggregate(second_root_surface_id); | 1421 aggregator_.Aggregate(second_root_surface_id); |
1417 | 1422 |
1418 const RenderPassList& aggregated_pass_list = | 1423 const RenderPassList& aggregated_pass_list = |
1419 aggregated_frame.render_pass_list; | 1424 aggregated_frame.render_pass_list; |
1420 | 1425 |
1421 ASSERT_EQ(1u, aggregated_pass_list.size()); | 1426 ASSERT_EQ(1u, aggregated_pass_list.size()); |
1422 | 1427 |
1423 // No new frame, so no new damage. | 1428 // No new frame, so no new damage. |
1424 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty()); | 1429 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty()); |
1425 } | 1430 } |
1426 factory_.Destroy(second_root_local_frame_id); | |
1427 } | 1431 } |
1428 | 1432 |
1429 class SurfaceAggregatorPartialSwapTest | 1433 class SurfaceAggregatorPartialSwapTest |
1430 : public SurfaceAggregatorValidSurfaceTest { | 1434 : public SurfaceAggregatorValidSurfaceTest { |
1431 public: | 1435 public: |
1432 SurfaceAggregatorPartialSwapTest() | 1436 SurfaceAggregatorPartialSwapTest() |
1433 : SurfaceAggregatorValidSurfaceTest(true) {} | 1437 : SurfaceAggregatorValidSurfaceTest(true) {} |
1434 }; | 1438 }; |
1435 | 1439 |
1436 // Tests that quads outside the damage rect are ignored. | 1440 // Tests that quads outside the damage rect are ignored. |
1437 TEST_F(SurfaceAggregatorPartialSwapTest, IgnoreOutside) { | 1441 TEST_F(SurfaceAggregatorPartialSwapTest, IgnoreOutside) { |
| 1442 SurfaceFactory child_factory(kArbitraryFrameSinkId, &manager_, |
| 1443 &empty_client_); |
1438 LocalFrameId child_local_frame_id = allocator_.GenerateId(); | 1444 LocalFrameId child_local_frame_id = allocator_.GenerateId(); |
1439 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); | 1445 SurfaceId child_surface_id(factory_.frame_sink_id(), child_local_frame_id); |
1440 factory_.Create(child_local_frame_id); | |
1441 // The child surface has three quads, one with a visible rect of 13,13 4x4 and | 1446 // The child surface has three quads, one with a visible rect of 13,13 4x4 and |
1442 // the other other with a visible rect of 10,10 2x2 (relative to root target | 1447 // the other other with a visible rect of 10,10 2x2 (relative to root target |
1443 // space), and one with a non-invertible transform. | 1448 // space), and one with a non-invertible transform. |
1444 { | 1449 { |
1445 RenderPassId child_pass_id = RenderPassId(1, 1); | 1450 RenderPassId child_pass_id = RenderPassId(1, 1); |
1446 test::Quad child_quads1[] = {test::Quad::RenderPassQuad(child_pass_id)}; | 1451 test::Quad child_quads1[] = {test::Quad::RenderPassQuad(child_pass_id)}; |
1447 test::Quad child_quads2[] = {test::Quad::RenderPassQuad(child_pass_id)}; | 1452 test::Quad child_quads2[] = {test::Quad::RenderPassQuad(child_pass_id)}; |
1448 test::Quad child_quads3[] = {test::Quad::RenderPassQuad(child_pass_id)}; | 1453 test::Quad child_quads3[] = {test::Quad::RenderPassQuad(child_pass_id)}; |
1449 test::Pass child_passes[] = { | 1454 test::Pass child_passes[] = { |
1450 test::Pass(child_quads1, arraysize(child_quads1), child_pass_id), | 1455 test::Pass(child_quads1, arraysize(child_quads1), child_pass_id), |
(...skipping 16 matching lines...) Expand all Loading... |
1467 | 1472 |
1468 SharedQuadState* child_noninvertible_sqs = | 1473 SharedQuadState* child_noninvertible_sqs = |
1469 child_pass_list[2]->shared_quad_state_list.ElementAt(0u); | 1474 child_pass_list[2]->shared_quad_state_list.ElementAt(0u); |
1470 child_noninvertible_sqs->quad_to_target_transform.matrix().setDouble(0, 0, | 1475 child_noninvertible_sqs->quad_to_target_transform.matrix().setDouble(0, 0, |
1471 0.0); | 1476 0.0); |
1472 EXPECT_FALSE( | 1477 EXPECT_FALSE( |
1473 child_noninvertible_sqs->quad_to_target_transform.IsInvertible()); | 1478 child_noninvertible_sqs->quad_to_target_transform.IsInvertible()); |
1474 child_pass_list[2]->quad_list.ElementAt(0)->visible_rect = | 1479 child_pass_list[2]->quad_list.ElementAt(0)->visible_rect = |
1475 gfx::Rect(0, 0, 2, 2); | 1480 gfx::Rect(0, 0, 2, 2); |
1476 | 1481 |
1477 SubmitPassListAsFrame(&factory_, child_local_frame_id, &child_pass_list); | 1482 SubmitPassListAsFrame(&child_factory, child_local_frame_id, |
| 1483 &child_pass_list); |
1478 } | 1484 } |
1479 | 1485 |
1480 { | 1486 { |
1481 test::Quad root_quads[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)}; | 1487 test::Quad root_quads[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)}; |
1482 | 1488 |
1483 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; | 1489 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; |
1484 | 1490 |
1485 RenderPassList root_pass_list; | 1491 RenderPassList root_pass_list; |
1486 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, | 1492 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, |
1487 arraysize(root_passes)); | 1493 arraysize(root_passes)); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1565 child_sqs->quad_to_target_transform.Scale(2, 2); | 1571 child_sqs->quad_to_target_transform.Scale(2, 2); |
1566 | 1572 |
1567 child_pass_list[1]->quad_list.ElementAt(0)->visible_rect = | 1573 child_pass_list[1]->quad_list.ElementAt(0)->visible_rect = |
1568 gfx::Rect(0, 0, 2, 2); | 1574 gfx::Rect(0, 0, 2, 2); |
1569 | 1575 |
1570 RenderPass* child_root_pass = child_pass_list[1].get(); | 1576 RenderPass* child_root_pass = child_pass_list[1].get(); |
1571 | 1577 |
1572 child_root_pass->copy_requests.push_back( | 1578 child_root_pass->copy_requests.push_back( |
1573 CopyOutputRequest::CreateEmptyRequest()); | 1579 CopyOutputRequest::CreateEmptyRequest()); |
1574 child_root_pass->damage_rect = gfx::Rect(); | 1580 child_root_pass->damage_rect = gfx::Rect(); |
1575 SubmitPassListAsFrame(&factory_, child_local_frame_id, &child_pass_list); | 1581 SubmitPassListAsFrame(&child_factory, child_local_frame_id, |
| 1582 &child_pass_list); |
1576 } | 1583 } |
1577 | 1584 |
1578 { | 1585 { |
1579 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 1586 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
1580 | 1587 |
1581 const RenderPassList& aggregated_pass_list = | 1588 const RenderPassList& aggregated_pass_list = |
1582 aggregated_frame.render_pass_list; | 1589 aggregated_frame.render_pass_list; |
1583 | 1590 |
1584 // Output frame should have no damage, but all quads included. | 1591 // Output frame should have no damage, but all quads included. |
1585 ASSERT_EQ(3u, aggregated_pass_list.size()); | 1592 ASSERT_EQ(3u, aggregated_pass_list.size()); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 EXPECT_EQ(0u, aggregated_pass_list[0]->quad_list.size()); | 1699 EXPECT_EQ(0u, aggregated_pass_list[0]->quad_list.size()); |
1693 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[1]->damage_rect); | 1700 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[1]->damage_rect); |
1694 EXPECT_EQ(1u, aggregated_pass_list[1]->quad_list.size()); | 1701 EXPECT_EQ(1u, aggregated_pass_list[1]->quad_list.size()); |
1695 | 1702 |
1696 // First render pass draw quad is outside damage rect, so shouldn't be | 1703 // First render pass draw quad is outside damage rect, so shouldn't be |
1697 // drawn. SurfaceDrawQuad is after background filter, so corresponding | 1704 // drawn. SurfaceDrawQuad is after background filter, so corresponding |
1698 // RenderPassDrawQuad should be drawn. | 1705 // RenderPassDrawQuad should be drawn. |
1699 EXPECT_EQ(gfx::Rect(10, 10, 2, 2), aggregated_pass_list[2]->damage_rect); | 1706 EXPECT_EQ(gfx::Rect(10, 10, 2, 2), aggregated_pass_list[2]->damage_rect); |
1700 EXPECT_EQ(1u, aggregated_pass_list[2]->quad_list.size()); | 1707 EXPECT_EQ(1u, aggregated_pass_list[2]->quad_list.size()); |
1701 } | 1708 } |
1702 | |
1703 factory_.Destroy(child_local_frame_id); | |
1704 } | 1709 } |
1705 | 1710 |
1706 class SurfaceAggregatorWithResourcesTest : public testing::Test { | 1711 class SurfaceAggregatorWithResourcesTest : public testing::Test { |
1707 public: | 1712 public: |
1708 void SetUp() override { | 1713 void SetUp() override { |
1709 shared_bitmap_manager_.reset(new TestSharedBitmapManager); | 1714 shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
1710 resource_provider_ = | 1715 resource_provider_ = |
1711 FakeResourceProvider::Create(nullptr, shared_bitmap_manager_.get()); | 1716 FakeResourceProvider::Create(nullptr, shared_bitmap_manager_.get()); |
1712 | 1717 |
1713 aggregator_.reset( | 1718 aggregator_.reset( |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1788 frame.render_pass_list.push_back(std::move(pass)); | 1793 frame.render_pass_list.push_back(std::move(pass)); |
1789 factory->SubmitCompositorFrame(surface_id.local_frame_id(), std::move(frame), | 1794 factory->SubmitCompositorFrame(surface_id.local_frame_id(), std::move(frame), |
1790 SurfaceFactory::DrawCallback()); | 1795 SurfaceFactory::DrawCallback()); |
1791 } | 1796 } |
1792 | 1797 |
1793 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) { | 1798 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) { |
1794 ResourceTrackingSurfaceFactoryClient client; | 1799 ResourceTrackingSurfaceFactoryClient client; |
1795 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); | 1800 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); |
1796 LocalFrameId local_frame_id(7u, 0); | 1801 LocalFrameId local_frame_id(7u, 0); |
1797 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); | 1802 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); |
1798 factory.Create(local_frame_id); | |
1799 | 1803 |
1800 ResourceId ids[] = {11, 12, 13}; | 1804 ResourceId ids[] = {11, 12, 13}; |
1801 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), | 1805 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), |
1802 &factory, surface_id); | 1806 &factory, surface_id); |
1803 | 1807 |
1804 CompositorFrame frame = aggregator_->Aggregate(surface_id); | 1808 CompositorFrame frame = aggregator_->Aggregate(surface_id); |
1805 | 1809 |
1806 // Nothing should be available to be returned yet. | 1810 // Nothing should be available to be returned yet. |
1807 EXPECT_TRUE(client.returned_resources().empty()); | 1811 EXPECT_TRUE(client.returned_resources().empty()); |
1808 | 1812 |
1809 SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), &factory, | 1813 SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), &factory, |
1810 surface_id); | 1814 surface_id); |
1811 | 1815 |
1812 frame = aggregator_->Aggregate(surface_id); | 1816 frame = aggregator_->Aggregate(surface_id); |
1813 | 1817 |
1814 ASSERT_EQ(3u, client.returned_resources().size()); | 1818 ASSERT_EQ(3u, client.returned_resources().size()); |
1815 ResourceId returned_ids[3]; | 1819 ResourceId returned_ids[3]; |
1816 for (size_t i = 0; i < 3; ++i) { | 1820 for (size_t i = 0; i < 3; ++i) { |
1817 returned_ids[i] = client.returned_resources()[i].id; | 1821 returned_ids[i] = client.returned_resources()[i].id; |
1818 } | 1822 } |
1819 EXPECT_THAT(returned_ids, | 1823 EXPECT_THAT(returned_ids, |
1820 testing::WhenSorted(testing::ElementsAreArray(ids))); | 1824 testing::WhenSorted(testing::ElementsAreArray(ids))); |
1821 factory.Destroy(local_frame_id); | |
1822 } | 1825 } |
1823 | 1826 |
1824 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) { | 1827 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) { |
1825 ResourceTrackingSurfaceFactoryClient client; | 1828 ResourceTrackingSurfaceFactoryClient client; |
1826 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); | 1829 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); |
1827 LocalFrameId local_frame_id(7u, 0); | 1830 LocalFrameId local_frame_id(7u, 0); |
1828 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); | 1831 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); |
1829 factory.Create(local_frame_id); | |
1830 | 1832 |
1831 CompositorFrame frame; | 1833 CompositorFrame frame; |
1832 std::unique_ptr<RenderPass> pass = RenderPass::Create(); | 1834 std::unique_ptr<RenderPass> pass = RenderPass::Create(); |
1833 pass->id = RenderPassId(1, 1); | 1835 pass->id = RenderPassId(1, 1); |
1834 TransferableResource resource; | 1836 TransferableResource resource; |
1835 resource.id = 11; | 1837 resource.id = 11; |
1836 // ResourceProvider is software but resource is not, so it should be | 1838 // ResourceProvider is software but resource is not, so it should be |
1837 // ignored. | 1839 // ignored. |
1838 resource.is_software = false; | 1840 resource.is_software = false; |
1839 frame.resource_list.push_back(resource); | 1841 frame.resource_list.push_back(resource); |
1840 frame.render_pass_list.push_back(std::move(pass)); | 1842 frame.render_pass_list.push_back(std::move(pass)); |
1841 factory.SubmitCompositorFrame(local_frame_id, std::move(frame), | 1843 factory.SubmitCompositorFrame(local_frame_id, std::move(frame), |
1842 SurfaceFactory::DrawCallback()); | 1844 SurfaceFactory::DrawCallback()); |
1843 | 1845 |
1844 CompositorFrame returned_frame = aggregator_->Aggregate(surface_id); | 1846 CompositorFrame returned_frame = aggregator_->Aggregate(surface_id); |
1845 | 1847 |
1846 // Nothing should be available to be returned yet. | 1848 // Nothing should be available to be returned yet. |
1847 EXPECT_TRUE(client.returned_resources().empty()); | 1849 EXPECT_TRUE(client.returned_resources().empty()); |
1848 | 1850 |
1849 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, | 1851 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, |
1850 surface_id); | 1852 surface_id); |
1851 ASSERT_EQ(1u, client.returned_resources().size()); | 1853 ASSERT_EQ(1u, client.returned_resources().size()); |
1852 EXPECT_EQ(11u, client.returned_resources()[0].id); | 1854 EXPECT_EQ(11u, client.returned_resources()[0].id); |
1853 | |
1854 factory.Destroy(local_frame_id); | |
1855 } | 1855 } |
1856 | 1856 |
1857 TEST_F(SurfaceAggregatorWithResourcesTest, TwoSurfaces) { | 1857 TEST_F(SurfaceAggregatorWithResourcesTest, TwoSurfaces) { |
1858 ResourceTrackingSurfaceFactoryClient client; | 1858 ResourceTrackingSurfaceFactoryClient client; |
1859 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); | 1859 SurfaceFactory factory1(kArbitraryFrameSinkId, &manager_, &client); |
| 1860 SurfaceFactory factory2(kArbitraryFrameSinkId, &manager_, &client); |
1860 LocalFrameId local_frame1_id(7u, 0); | 1861 LocalFrameId local_frame1_id(7u, 0); |
1861 SurfaceId surface1_id(kArbitraryFrameSinkId, local_frame1_id); | 1862 SurfaceId surface1_id(kArbitraryFrameSinkId, local_frame1_id); |
1862 factory.Create(local_frame1_id); | |
1863 | 1863 |
1864 LocalFrameId local_frame2_id(8u, 0); | 1864 LocalFrameId local_frame2_id(8u, 0); |
1865 SurfaceId surface2_id(kArbitraryFrameSinkId, local_frame2_id); | 1865 SurfaceId surface2_id(kArbitraryFrameSinkId, local_frame2_id); |
1866 factory.Create(local_frame2_id); | |
1867 | 1866 |
1868 ResourceId ids[] = {11, 12, 13}; | 1867 ResourceId ids[] = {11, 12, 13}; |
1869 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), | 1868 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), |
1870 &factory, surface1_id); | 1869 &factory1, surface1_id); |
1871 ResourceId ids2[] = {14, 15, 16}; | 1870 ResourceId ids2[] = {14, 15, 16}; |
1872 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), true, SurfaceId(), | 1871 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), true, SurfaceId(), |
1873 &factory, surface2_id); | 1872 &factory2, surface2_id); |
1874 | 1873 |
1875 CompositorFrame frame = aggregator_->Aggregate(surface1_id); | 1874 CompositorFrame frame = aggregator_->Aggregate(surface1_id); |
1876 | 1875 |
1877 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, | 1876 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory1, |
1878 surface1_id); | 1877 surface1_id); |
1879 | 1878 |
1880 // Nothing should be available to be returned yet. | 1879 // Nothing should be available to be returned yet. |
1881 EXPECT_TRUE(client.returned_resources().empty()); | 1880 EXPECT_TRUE(client.returned_resources().empty()); |
1882 | 1881 |
1883 frame = aggregator_->Aggregate(surface2_id); | 1882 frame = aggregator_->Aggregate(surface2_id); |
1884 | 1883 |
1885 // surface1_id wasn't referenced, so its resources should be returned. | 1884 // surface1_id wasn't referenced, so its resources should be returned. |
1886 ASSERT_EQ(3u, client.returned_resources().size()); | 1885 ASSERT_EQ(3u, client.returned_resources().size()); |
1887 ResourceId returned_ids[3]; | 1886 ResourceId returned_ids[3]; |
1888 for (size_t i = 0; i < 3; ++i) { | 1887 for (size_t i = 0; i < 3; ++i) { |
1889 returned_ids[i] = client.returned_resources()[i].id; | 1888 returned_ids[i] = client.returned_resources()[i].id; |
1890 } | 1889 } |
1891 EXPECT_THAT(returned_ids, | 1890 EXPECT_THAT(returned_ids, |
1892 testing::WhenSorted(testing::ElementsAreArray(ids))); | 1891 testing::WhenSorted(testing::ElementsAreArray(ids))); |
1893 EXPECT_EQ(3u, resource_provider_->num_resources()); | 1892 EXPECT_EQ(3u, resource_provider_->num_resources()); |
1894 factory.Destroy(local_frame1_id); | |
1895 factory.Destroy(local_frame2_id); | |
1896 } | 1893 } |
1897 | 1894 |
1898 // Ensure that aggregator completely ignores Surfaces that reference invalid | 1895 // Ensure that aggregator completely ignores Surfaces that reference invalid |
1899 // resources. | 1896 // resources. |
1900 TEST_F(SurfaceAggregatorWithResourcesTest, InvalidChildSurface) { | 1897 TEST_F(SurfaceAggregatorWithResourcesTest, InvalidChildSurface) { |
1901 ResourceTrackingSurfaceFactoryClient client; | 1898 ResourceTrackingSurfaceFactoryClient client; |
1902 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); | 1899 SurfaceFactory root_factory(kArbitraryFrameSinkId, &manager_, &client); |
| 1900 SurfaceFactory middle_factory(kArbitraryFrameSinkId, &manager_, &client); |
| 1901 SurfaceFactory child_factory(kArbitraryFrameSinkId, &manager_, &client); |
1903 LocalFrameId root_local_frame_id(7u, 1); | 1902 LocalFrameId root_local_frame_id(7u, 1); |
1904 SurfaceId root_surface_id(kArbitraryFrameSinkId, root_local_frame_id); | 1903 SurfaceId root_surface_id(kArbitraryFrameSinkId, root_local_frame_id); |
1905 factory.Create(root_local_frame_id); | |
1906 LocalFrameId middle_local_frame_id(8u, 1); | 1904 LocalFrameId middle_local_frame_id(8u, 1); |
1907 SurfaceId middle_surface_id(kArbitraryFrameSinkId, middle_local_frame_id); | 1905 SurfaceId middle_surface_id(kArbitraryFrameSinkId, middle_local_frame_id); |
1908 factory.Create(middle_local_frame_id); | |
1909 LocalFrameId child_local_frame_id(9u, 1); | 1906 LocalFrameId child_local_frame_id(9u, 1); |
1910 SurfaceId child_surface_id(kArbitraryFrameSinkId, child_local_frame_id); | 1907 SurfaceId child_surface_id(kArbitraryFrameSinkId, child_local_frame_id); |
1911 factory.Create(child_local_frame_id); | |
1912 | 1908 |
1913 ResourceId ids[] = {14, 15, 16}; | 1909 ResourceId ids[] = {14, 15, 16}; |
1914 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), | 1910 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), |
1915 &factory, child_surface_id); | 1911 &child_factory, child_surface_id); |
1916 | 1912 |
1917 ResourceId ids2[] = {17, 18, 19}; | 1913 ResourceId ids2[] = {17, 18, 19}; |
1918 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), false, | 1914 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), false, |
1919 child_surface_id, &factory, | 1915 child_surface_id, &middle_factory, |
1920 middle_surface_id); | 1916 middle_surface_id); |
1921 | 1917 |
1922 ResourceId ids3[] = {20, 21, 22}; | 1918 ResourceId ids3[] = {20, 21, 22}; |
1923 SubmitCompositorFrameWithResources(ids3, arraysize(ids3), true, | 1919 SubmitCompositorFrameWithResources(ids3, arraysize(ids3), true, |
1924 middle_surface_id, &factory, | 1920 middle_surface_id, &root_factory, |
1925 root_surface_id); | 1921 root_surface_id); |
1926 | 1922 |
1927 CompositorFrame frame; | 1923 CompositorFrame frame; |
1928 frame = aggregator_->Aggregate(root_surface_id); | 1924 frame = aggregator_->Aggregate(root_surface_id); |
1929 | 1925 |
1930 RenderPassList* pass_list = &frame.render_pass_list; | 1926 RenderPassList* pass_list = &frame.render_pass_list; |
1931 ASSERT_EQ(1u, pass_list->size()); | 1927 ASSERT_EQ(1u, pass_list->size()); |
1932 EXPECT_EQ(1u, pass_list->back()->shared_quad_state_list.size()); | 1928 EXPECT_EQ(1u, pass_list->back()->shared_quad_state_list.size()); |
1933 EXPECT_EQ(3u, pass_list->back()->quad_list.size()); | 1929 EXPECT_EQ(3u, pass_list->back()->quad_list.size()); |
1934 SubmitCompositorFrameWithResources(ids2, arraysize(ids), true, | 1930 SubmitCompositorFrameWithResources(ids2, arraysize(ids), true, |
1935 child_surface_id, &factory, | 1931 child_surface_id, &middle_factory, |
1936 middle_surface_id); | 1932 middle_surface_id); |
1937 | 1933 |
1938 frame = aggregator_->Aggregate(root_surface_id); | 1934 frame = aggregator_->Aggregate(root_surface_id); |
1939 | 1935 |
1940 pass_list = &frame.render_pass_list; | 1936 pass_list = &frame.render_pass_list; |
1941 ASSERT_EQ(1u, pass_list->size()); | 1937 ASSERT_EQ(1u, pass_list->size()); |
1942 EXPECT_EQ(3u, pass_list->back()->shared_quad_state_list.size()); | 1938 EXPECT_EQ(3u, pass_list->back()->shared_quad_state_list.size()); |
1943 EXPECT_EQ(9u, pass_list->back()->quad_list.size()); | 1939 EXPECT_EQ(9u, pass_list->back()->quad_list.size()); |
1944 | |
1945 factory.Destroy(root_local_frame_id); | |
1946 factory.Destroy(child_local_frame_id); | |
1947 factory.Destroy(middle_local_frame_id); | |
1948 } | 1940 } |
1949 | 1941 |
1950 TEST_F(SurfaceAggregatorWithResourcesTest, SecureOutputTexture) { | 1942 TEST_F(SurfaceAggregatorWithResourcesTest, SecureOutputTexture) { |
1951 ResourceTrackingSurfaceFactoryClient client; | 1943 ResourceTrackingSurfaceFactoryClient client; |
1952 SurfaceFactory factory(kArbitraryFrameSinkId, &manager_, &client); | 1944 SurfaceFactory factory1(kArbitraryFrameSinkId, &manager_, &client); |
| 1945 SurfaceFactory factory2(kArbitraryFrameSinkId, &manager_, &client); |
1953 LocalFrameId local_frame1_id(7u, 0); | 1946 LocalFrameId local_frame1_id(7u, 0); |
1954 SurfaceId surface1_id(kArbitraryFrameSinkId, local_frame1_id); | 1947 SurfaceId surface1_id(kArbitraryFrameSinkId, local_frame1_id); |
1955 factory.Create(local_frame1_id); | |
1956 | 1948 |
1957 LocalFrameId local_frame2_id(8u, 0); | 1949 LocalFrameId local_frame2_id(8u, 0); |
1958 SurfaceId surface2_id(kArbitraryFrameSinkId, local_frame2_id); | 1950 SurfaceId surface2_id(kArbitraryFrameSinkId, local_frame2_id); |
1959 factory.Create(local_frame2_id); | |
1960 | 1951 |
1961 ResourceId ids[] = {11, 12, 13}; | 1952 ResourceId ids[] = {11, 12, 13}; |
1962 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), | 1953 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), |
1963 &factory, surface1_id); | 1954 &factory1, surface1_id); |
1964 | 1955 |
1965 CompositorFrame frame = aggregator_->Aggregate(surface1_id); | 1956 CompositorFrame frame = aggregator_->Aggregate(surface1_id); |
1966 | 1957 |
1967 RenderPass* render_pass = frame.render_pass_list.back().get(); | 1958 RenderPass* render_pass = frame.render_pass_list.back().get(); |
1968 | 1959 |
1969 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, render_pass->quad_list.back()->material); | 1960 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, render_pass->quad_list.back()->material); |
1970 | 1961 |
1971 { | 1962 { |
1972 std::unique_ptr<RenderPass> pass = RenderPass::Create(); | 1963 std::unique_ptr<RenderPass> pass = RenderPass::Create(); |
1973 pass->id = RenderPassId(1, 1); | 1964 pass->id = RenderPassId(1, 1); |
1974 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); | 1965 SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
1975 sqs->opacity = 1.f; | 1966 sqs->opacity = 1.f; |
1976 SurfaceDrawQuad* surface_quad = | 1967 SurfaceDrawQuad* surface_quad = |
1977 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 1968 pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
| 1969 |
1978 surface_quad->SetNew(sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), | 1970 surface_quad->SetNew(sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), |
1979 surface1_id); | 1971 surface1_id); |
1980 pass->copy_requests.push_back(CopyOutputRequest::CreateEmptyRequest()); | 1972 pass->copy_requests.push_back(CopyOutputRequest::CreateEmptyRequest()); |
1981 | 1973 |
1982 CompositorFrame frame; | 1974 CompositorFrame frame; |
1983 frame.render_pass_list.push_back(std::move(pass)); | 1975 frame.render_pass_list.push_back(std::move(pass)); |
1984 | 1976 |
1985 factory.SubmitCompositorFrame(local_frame2_id, std::move(frame), | 1977 factory2.SubmitCompositorFrame(local_frame2_id, std::move(frame), |
1986 SurfaceFactory::DrawCallback()); | 1978 SurfaceFactory::DrawCallback()); |
1987 } | 1979 } |
1988 | 1980 |
1989 frame = aggregator_->Aggregate(surface2_id); | 1981 frame = aggregator_->Aggregate(surface2_id); |
1990 EXPECT_EQ(1u, frame.render_pass_list.size()); | 1982 EXPECT_EQ(1u, frame.render_pass_list.size()); |
1991 render_pass = frame.render_pass_list.front().get(); | 1983 render_pass = frame.render_pass_list.front().get(); |
1992 | 1984 |
1993 // Parent has copy request, so texture should not be drawn. | 1985 // Parent has copy request, so texture should not be drawn. |
1994 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); | 1986 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); |
1995 | 1987 |
1996 frame = aggregator_->Aggregate(surface2_id); | 1988 frame = aggregator_->Aggregate(surface2_id); |
1997 EXPECT_EQ(1u, frame.render_pass_list.size()); | 1989 EXPECT_EQ(1u, frame.render_pass_list.size()); |
1998 render_pass = frame.render_pass_list.front().get(); | 1990 render_pass = frame.render_pass_list.front().get(); |
1999 | 1991 |
2000 // Copy request has been executed earlier, so texture should be drawn. | 1992 // Copy request has been executed earlier, so texture should be drawn. |
2001 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, | 1993 EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, |
2002 render_pass->quad_list.front()->material); | 1994 render_pass->quad_list.front()->material); |
2003 | 1995 |
2004 aggregator_->set_output_is_secure(false); | 1996 aggregator_->set_output_is_secure(false); |
2005 | 1997 |
2006 frame = aggregator_->Aggregate(surface2_id); | 1998 frame = aggregator_->Aggregate(surface2_id); |
2007 render_pass = frame.render_pass_list.back().get(); | 1999 render_pass = frame.render_pass_list.back().get(); |
2008 | 2000 |
2009 // Output is insecure, so texture should be drawn. | 2001 // Output is insecure, so texture should be drawn. |
2010 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); | 2002 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); |
2011 | |
2012 factory.Destroy(local_frame1_id); | |
2013 factory.Destroy(local_frame2_id); | |
2014 } | 2003 } |
2015 | 2004 |
2016 } // namespace | 2005 } // namespace |
2017 } // namespace cc | 2006 } // namespace cc |
2018 | 2007 |
OLD | NEW |