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

Side by Side Diff: cc/surfaces/surface_aggregator_unittest.cc

Issue 1304063014: cc: Plumbing for BeginFrameSource based on Surfaces (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add surface_id to SurfaceFactoryClient::SetBeginFrameSource Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/compositor_frame.h" 5 #include "cc/output/compositor_frame.h"
6 #include "cc/output/delegated_frame_data.h" 6 #include "cc/output/delegated_frame_data.h"
7 #include "cc/quads/render_pass.h" 7 #include "cc/quads/render_pass.h"
8 #include "cc/quads/render_pass_draw_quad.h" 8 #include "cc/quads/render_pass_draw_quad.h"
9 #include "cc/quads/solid_color_draw_quad.h" 9 #include "cc/quads/solid_color_draw_quad.h"
10 #include "cc/quads/surface_draw_quad.h" 10 #include "cc/quads/surface_draw_quad.h"
(...skipping 25 matching lines...) Expand all
36 } 36 }
37 37
38 gfx::Size SurfaceSize() { 38 gfx::Size SurfaceSize() {
39 static gfx::Size size(5, 5); 39 static gfx::Size size(5, 5);
40 return size; 40 return size;
41 } 41 }
42 42
43 class EmptySurfaceFactoryClient : public SurfaceFactoryClient { 43 class EmptySurfaceFactoryClient : public SurfaceFactoryClient {
44 public: 44 public:
45 void ReturnResources(const ReturnedResourceArray& resources) override {} 45 void ReturnResources(const ReturnedResourceArray& resources) override {}
46 void SetBeginFrameSource(SurfaceId surface_id,
47 BeginFrameSource* begin_frame_source) override {}
48 };
49
50 class FakeSurfaceAggregatorClient : public SurfaceAggregatorClient {
51 public:
52 void AddSurface(Surface* surface) override {
53 EXPECT_FALSE(HasSurface(surface));
54 surfaces_.insert(surface);
55 }
56
57 void RemoveSurface(Surface* surface) override {
58 EXPECT_TRUE(HasSurface(surface));
59 surfaces_.erase(surface);
60 }
61
62 bool HasSurface(Surface* surface) const {
63 return surfaces_.count(surface) != 0;
64 }
65
66 private:
67 std::set<Surface*> surfaces_;
46 }; 68 };
47 69
48 class SurfaceAggregatorTest : public testing::Test { 70 class SurfaceAggregatorTest : public testing::Test {
49 public: 71 public:
50 explicit SurfaceAggregatorTest(bool use_damage_rect) 72 explicit SurfaceAggregatorTest(bool use_damage_rect)
51 : factory_(&manager_, &empty_client_), 73 : factory_(&manager_, &empty_client_),
52 aggregator_(&manager_, NULL, use_damage_rect) {} 74 aggregator_(&surface_aggregator_client_,
75 &manager_,
76 NULL,
77 use_damage_rect) {}
53 78
54 SurfaceAggregatorTest() : SurfaceAggregatorTest(false) {} 79 SurfaceAggregatorTest() : SurfaceAggregatorTest(false) {}
55 80
56 protected: 81 protected:
57 SurfaceManager manager_; 82 SurfaceManager manager_;
58 EmptySurfaceFactoryClient empty_client_; 83 EmptySurfaceFactoryClient empty_client_;
59 SurfaceFactory factory_; 84 SurfaceFactory factory_;
85 FakeSurfaceAggregatorClient surface_aggregator_client_;
60 SurfaceAggregator aggregator_; 86 SurfaceAggregator aggregator_;
61 }; 87 };
62 88
63 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) { 89 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) {
64 SurfaceId one_id(7); 90 SurfaceId one_id(7);
65 factory_.Create(one_id); 91 factory_.Create(one_id);
92 Surface* surface = manager_.GetSurfaceForId(one_id);
93
94 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface));
66 scoped_ptr<CompositorFrame> frame = aggregator_.Aggregate(one_id); 95 scoped_ptr<CompositorFrame> frame = aggregator_.Aggregate(one_id);
67 EXPECT_FALSE(frame); 96 EXPECT_FALSE(frame);
97 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface));
98
68 factory_.Destroy(one_id); 99 factory_.Destroy(one_id);
69 } 100 }
70 101
71 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest { 102 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest {
72 public: 103 public:
73 explicit SurfaceAggregatorValidSurfaceTest(bool use_damage_rect) 104 explicit SurfaceAggregatorValidSurfaceTest(bool use_damage_rect)
74 : SurfaceAggregatorTest(use_damage_rect), 105 : SurfaceAggregatorTest(use_damage_rect),
75 allocator_(1u), 106 allocator_(1u),
76 child_allocator_(2u) {} 107 child_allocator_(2u) {}
77 SurfaceAggregatorValidSurfaceTest() 108 SurfaceAggregatorValidSurfaceTest()
78 : SurfaceAggregatorValidSurfaceTest(false) {} 109 : SurfaceAggregatorValidSurfaceTest(false) {}
79 110
80 void SetUp() override { 111 void SetUp() override {
81 SurfaceAggregatorTest::SetUp(); 112 SurfaceAggregatorTest::SetUp();
82 root_surface_id_ = allocator_.GenerateId(); 113 root_surface_id_ = allocator_.GenerateId();
83 factory_.Create(root_surface_id_); 114 factory_.Create(root_surface_id_);
115 root_surface_ = manager_.GetSurfaceForId(root_surface_id_);
84 } 116 }
85 117
86 void TearDown() override { 118 void TearDown() override {
87 factory_.Destroy(root_surface_id_); 119 factory_.Destroy(root_surface_id_);
88 SurfaceAggregatorTest::TearDown(); 120 SurfaceAggregatorTest::TearDown();
89 } 121 }
90 122
91 void AggregateAndVerify(test::Pass* expected_passes, 123 void AggregateAndVerify(test::Pass* expected_passes,
92 size_t expected_pass_count, 124 size_t expected_pass_count,
93 SurfaceId* surface_ids, 125 SurfaceId* surface_ids,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 176
145 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 177 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
146 child_frame->delegated_frame_data = delegated_frame_data.Pass(); 178 child_frame->delegated_frame_data = delegated_frame_data.Pass();
147 179
148 factory_.SubmitCompositorFrame(surface_id, child_frame.Pass(), 180 factory_.SubmitCompositorFrame(surface_id, child_frame.Pass(),
149 SurfaceFactory::DrawCallback()); 181 SurfaceFactory::DrawCallback());
150 } 182 }
151 183
152 protected: 184 protected:
153 SurfaceId root_surface_id_; 185 SurfaceId root_surface_id_;
186 Surface* root_surface_;
154 SurfaceIdAllocator allocator_; 187 SurfaceIdAllocator allocator_;
155 SurfaceIdAllocator child_allocator_; 188 SurfaceIdAllocator child_allocator_;
156 }; 189 };
157 190
158 // Tests that a very simple frame containing only two solid color quads makes it 191 // Tests that a very simple frame containing only two solid color quads makes it
159 // through the aggregator correctly. 192 // through the aggregator correctly.
160 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleFrame) { 193 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleFrame) {
161 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorRED), 194 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorRED),
162 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 195 test::Quad::SolidColorQuad(SK_ColorBLUE)};
163 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 196 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
164 197
165 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_); 198 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_);
166 199
167 SurfaceId ids[] = {root_surface_id_}; 200 SurfaceId ids[] = {root_surface_id_};
201
202 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
168 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); 203 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids));
204 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
169 } 205 }
170 206
171 TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) { 207 TEST_F(SurfaceAggregatorValidSurfaceTest, OpacityCopied) {
172 SurfaceId embedded_surface_id = allocator_.GenerateId(); 208 SurfaceId embedded_surface_id = allocator_.GenerateId();
173 factory_.Create(embedded_surface_id); 209 factory_.Create(embedded_surface_id);
210 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id);
211 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
174 212
175 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 213 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
176 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 214 test::Quad::SolidColorQuad(SK_ColorBLUE)};
177 test::Pass embedded_passes[] = { 215 test::Pass embedded_passes[] = {
178 test::Pass(embedded_quads, arraysize(embedded_quads))}; 216 test::Pass(embedded_quads, arraysize(embedded_quads))};
179 217
180 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes), 218 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes),
181 embedded_surface_id); 219 embedded_surface_id);
182 220
183 test::Quad quads[] = {test::Quad::SurfaceQuad(embedded_surface_id, .5f)}; 221 test::Quad quads[] = {test::Quad::SurfaceQuad(embedded_surface_id, .5f)};
184 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 222 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
185 223
186 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_); 224 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_);
187 225
226 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
227 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
228
188 scoped_ptr<CompositorFrame> aggregated_frame = 229 scoped_ptr<CompositorFrame> aggregated_frame =
189 aggregator_.Aggregate(root_surface_id_); 230 aggregator_.Aggregate(root_surface_id_);
190 231
232 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
233 EXPECT_TRUE(surface_aggregator_client_.HasSurface(embedded_surface));
234
191 ASSERT_TRUE(aggregated_frame); 235 ASSERT_TRUE(aggregated_frame);
192 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 236 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
193 237
194 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 238 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
195 239
196 RenderPassList& render_pass_list(frame_data->render_pass_list); 240 RenderPassList& render_pass_list(frame_data->render_pass_list);
197 ASSERT_EQ(2u, render_pass_list.size()); 241 ASSERT_EQ(2u, render_pass_list.size());
198 SharedQuadStateList& shared_quad_state_list( 242 SharedQuadStateList& shared_quad_state_list(
199 render_pass_list[0]->shared_quad_state_list); 243 render_pass_list[0]->shared_quad_state_list);
200 ASSERT_EQ(2u, shared_quad_state_list.size()); 244 ASSERT_EQ(2u, shared_quad_state_list.size());
(...skipping 13 matching lines...) Expand all
214 test::Quad::SolidColorQuad(SK_ColorLTGRAY)}, 258 test::Quad::SolidColorQuad(SK_ColorLTGRAY)},
215 {test::Quad::SolidColorQuad(SK_ColorGRAY), 259 {test::Quad::SolidColorQuad(SK_ColorGRAY),
216 test::Quad::SolidColorQuad(SK_ColorDKGRAY)}}; 260 test::Quad::SolidColorQuad(SK_ColorDKGRAY)}};
217 test::Pass passes[] = { 261 test::Pass passes[] = {
218 test::Pass(quads[0], arraysize(quads[0]), RenderPassId(1, 1)), 262 test::Pass(quads[0], arraysize(quads[0]), RenderPassId(1, 1)),
219 test::Pass(quads[1], arraysize(quads[1]), RenderPassId(1, 2))}; 263 test::Pass(quads[1], arraysize(quads[1]), RenderPassId(1, 2))};
220 264
221 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_); 265 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_);
222 266
223 SurfaceId ids[] = {root_surface_id_}; 267 SurfaceId ids[] = {root_surface_id_};
268
269 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
224 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids)); 270 AggregateAndVerify(passes, arraysize(passes), ids, arraysize(ids));
271 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
225 } 272 }
226 273
227 // This tests very simple embedding. root_surface has a frame containing a few 274 // This tests very simple embedding. root_surface has a frame containing a few
228 // solid color quads and a surface quad referencing embedded_surface. 275 // solid color quads and a surface quad referencing embedded_surface.
229 // embedded_surface has a frame containing only a solid color quad. The solid 276 // embedded_surface has a frame containing only a solid color quad. The solid
230 // color quad should be aggregated into the final frame. 277 // color quad should be aggregated into the final frame.
231 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) { 278 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleSurfaceReference) {
232 SurfaceId embedded_surface_id = allocator_.GenerateId(); 279 SurfaceId embedded_surface_id = allocator_.GenerateId();
233 factory_.Create(embedded_surface_id); 280 factory_.Create(embedded_surface_id);
281 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id);
282 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
234 283
235 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 284 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
236 test::Pass embedded_passes[] = { 285 test::Pass embedded_passes[] = {
237 test::Pass(embedded_quads, arraysize(embedded_quads))}; 286 test::Pass(embedded_quads, arraysize(embedded_quads))};
238 287
239 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes), 288 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes),
240 embedded_surface_id); 289 embedded_surface_id);
241 290
242 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 291 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
243 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 292 test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
244 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 293 test::Quad::SolidColorQuad(SK_ColorBLACK)};
245 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; 294 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
246 295
247 SubmitCompositorFrame(root_passes, arraysize(root_passes), root_surface_id_); 296 SubmitCompositorFrame(root_passes, arraysize(root_passes), root_surface_id_);
248 297
298 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
299 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
300
249 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 301 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
250 test::Quad::SolidColorQuad(SK_ColorGREEN), 302 test::Quad::SolidColorQuad(SK_ColorGREEN),
251 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 303 test::Quad::SolidColorQuad(SK_ColorBLACK)};
252 test::Pass expected_passes[] = { 304 test::Pass expected_passes[] = {
253 test::Pass(expected_quads, arraysize(expected_quads))}; 305 test::Pass(expected_quads, arraysize(expected_quads))};
254 SurfaceId ids[] = {root_surface_id_, embedded_surface_id}; 306 SurfaceId ids[] = {root_surface_id_, embedded_surface_id};
255 AggregateAndVerify( 307 AggregateAndVerify(
256 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 308 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
257 309
310 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
311 EXPECT_TRUE(surface_aggregator_client_.HasSurface(embedded_surface));
312
258 factory_.Destroy(embedded_surface_id); 313 factory_.Destroy(embedded_surface_id);
259 } 314 }
260 315
261 TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) { 316 TEST_F(SurfaceAggregatorValidSurfaceTest, CopyRequest) {
262 SurfaceId embedded_surface_id = allocator_.GenerateId(); 317 SurfaceId embedded_surface_id = allocator_.GenerateId();
263 factory_.Create(embedded_surface_id); 318 factory_.Create(embedded_surface_id);
319 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id);
320 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
264 321
265 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 322 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
266 test::Pass embedded_passes[] = { 323 test::Pass embedded_passes[] = {
267 test::Pass(embedded_quads, arraysize(embedded_quads))}; 324 test::Pass(embedded_quads, arraysize(embedded_quads))};
268 325
269 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes), 326 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes),
270 embedded_surface_id); 327 embedded_surface_id);
271 scoped_ptr<CopyOutputRequest> copy_request( 328 scoped_ptr<CopyOutputRequest> copy_request(
272 CopyOutputRequest::CreateEmptyRequest()); 329 CopyOutputRequest::CreateEmptyRequest());
273 CopyOutputRequest* copy_request_ptr = copy_request.get(); 330 CopyOutputRequest* copy_request_ptr = copy_request.get();
274 factory_.RequestCopyOfSurface(embedded_surface_id, copy_request.Pass()); 331 factory_.RequestCopyOfSurface(embedded_surface_id, copy_request.Pass());
275 332
276 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 333 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
277 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 334 test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
278 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 335 test::Quad::SolidColorQuad(SK_ColorBLACK)};
279 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; 336 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
280 337
281 SubmitCompositorFrame(root_passes, arraysize(root_passes), root_surface_id_); 338 SubmitCompositorFrame(root_passes, arraysize(root_passes), root_surface_id_);
282 339
340 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
341 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
342
283 scoped_ptr<CompositorFrame> aggregated_frame = 343 scoped_ptr<CompositorFrame> aggregated_frame =
284 aggregator_.Aggregate(root_surface_id_); 344 aggregator_.Aggregate(root_surface_id_);
285 345
346 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
347 EXPECT_TRUE(surface_aggregator_client_.HasSurface(embedded_surface));
348
286 ASSERT_TRUE(aggregated_frame); 349 ASSERT_TRUE(aggregated_frame);
287 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 350 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
288 351
289 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 352 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
290 353
291 test::Quad expected_quads[] = { 354 test::Quad expected_quads[] = {
292 test::Quad::SolidColorQuad(SK_ColorWHITE), 355 test::Quad::SolidColorQuad(SK_ColorWHITE),
293 test::Quad::RenderPassQuad(frame_data->render_pass_list[0]->id), 356 test::Quad::RenderPassQuad(frame_data->render_pass_list[0]->id),
294 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 357 test::Quad::SolidColorQuad(SK_ColorBLACK)};
295 test::Pass expected_passes[] = { 358 test::Pass expected_passes[] = {
(...skipping 16 matching lines...) Expand all
312 aggregator_.previous_contained_surfaces().end()); 375 aggregator_.previous_contained_surfaces().end());
313 } 376 }
314 377
315 factory_.Destroy(embedded_surface_id); 378 factory_.Destroy(embedded_surface_id);
316 } 379 }
317 380
318 // Root surface may contain copy requests. 381 // Root surface may contain copy requests.
319 TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) { 382 TEST_F(SurfaceAggregatorValidSurfaceTest, RootCopyRequest) {
320 SurfaceId embedded_surface_id = allocator_.GenerateId(); 383 SurfaceId embedded_surface_id = allocator_.GenerateId();
321 factory_.Create(embedded_surface_id); 384 factory_.Create(embedded_surface_id);
385 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id);
386 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
322 387
323 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; 388 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)};
324 test::Pass embedded_passes[] = { 389 test::Pass embedded_passes[] = {
325 test::Pass(embedded_quads, arraysize(embedded_quads))}; 390 test::Pass(embedded_quads, arraysize(embedded_quads))};
326 391
327 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes), 392 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes),
328 embedded_surface_id); 393 embedded_surface_id);
329 scoped_ptr<CopyOutputRequest> copy_request( 394 scoped_ptr<CopyOutputRequest> copy_request(
330 CopyOutputRequest::CreateEmptyRequest()); 395 CopyOutputRequest::CreateEmptyRequest());
331 CopyOutputRequest* copy_request_ptr = copy_request.get(); 396 CopyOutputRequest* copy_request_ptr = copy_request.get();
(...skipping 20 matching lines...) Expand all
352 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 417 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
353 pass_list.swap(frame_data->render_pass_list); 418 pass_list.swap(frame_data->render_pass_list);
354 419
355 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 420 scoped_ptr<CompositorFrame> frame(new CompositorFrame);
356 frame->delegated_frame_data = frame_data.Pass(); 421 frame->delegated_frame_data = frame_data.Pass();
357 422
358 factory_.SubmitCompositorFrame(root_surface_id_, frame.Pass(), 423 factory_.SubmitCompositorFrame(root_surface_id_, frame.Pass(),
359 SurfaceFactory::DrawCallback()); 424 SurfaceFactory::DrawCallback());
360 } 425 }
361 426
427 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
428 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
429
362 scoped_ptr<CompositorFrame> aggregated_frame = 430 scoped_ptr<CompositorFrame> aggregated_frame =
363 aggregator_.Aggregate(root_surface_id_); 431 aggregator_.Aggregate(root_surface_id_);
364 432
433 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
434 EXPECT_TRUE(surface_aggregator_client_.HasSurface(embedded_surface));
435
365 ASSERT_TRUE(aggregated_frame); 436 ASSERT_TRUE(aggregated_frame);
366 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 437 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
367 438
368 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 439 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
369 440
370 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), 441 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE),
371 test::Quad::SolidColorQuad(SK_ColorGREEN), 442 test::Quad::SolidColorQuad(SK_ColorGREEN),
372 test::Quad::SolidColorQuad(SK_ColorBLACK)}; 443 test::Quad::SolidColorQuad(SK_ColorBLACK)};
373 test::Pass expected_passes[] = { 444 test::Pass expected_passes[] = {
374 test::Pass(expected_quads, arraysize(expected_quads)), 445 test::Pass(expected_quads, arraysize(expected_quads)),
(...skipping 27 matching lines...) Expand all
402 DCHECK(original_pass_list[0]->copy_requests.empty()); 473 DCHECK(original_pass_list[0]->copy_requests.empty());
403 DCHECK(original_pass_list[1]->copy_requests.empty()); 474 DCHECK(original_pass_list[1]->copy_requests.empty());
404 475
405 factory_.Destroy(embedded_surface_id); 476 factory_.Destroy(embedded_surface_id);
406 } 477 }
407 478
408 // This tests referencing a surface that has multiple render passes. 479 // This tests referencing a surface that has multiple render passes.
409 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { 480 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) {
410 SurfaceId embedded_surface_id = child_allocator_.GenerateId(); 481 SurfaceId embedded_surface_id = child_allocator_.GenerateId();
411 factory_.Create(embedded_surface_id); 482 factory_.Create(embedded_surface_id);
483 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id);
484 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
412 485
413 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), 486 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2),
414 RenderPassId(1, 3)}; 487 RenderPassId(1, 3)};
415 488
416 test::Quad embedded_quads[][2] = { 489 test::Quad embedded_quads[][2] = {
417 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)}, 490 {test::Quad::SolidColorQuad(1), test::Quad::SolidColorQuad(2)},
418 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])}, 491 {test::Quad::SolidColorQuad(3), test::Quad::RenderPassQuad(pass_ids[0])},
419 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}}; 492 {test::Quad::SolidColorQuad(4), test::Quad::RenderPassQuad(pass_ids[1])}};
420 test::Pass embedded_passes[] = { 493 test::Pass embedded_passes[] = {
421 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]), 494 test::Pass(embedded_quads[0], arraysize(embedded_quads[0]), pass_ids[0]),
422 test::Pass(embedded_quads[1], arraysize(embedded_quads[1]), pass_ids[1]), 495 test::Pass(embedded_quads[1], arraysize(embedded_quads[1]), pass_ids[1]),
423 test::Pass(embedded_quads[2], arraysize(embedded_quads[2]), pass_ids[2])}; 496 test::Pass(embedded_quads[2], arraysize(embedded_quads[2]), pass_ids[2])};
424 497
425 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes), 498 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes),
426 embedded_surface_id); 499 embedded_surface_id);
427 500
428 test::Quad root_quads[][2] = { 501 test::Quad root_quads[][2] = {
429 {test::Quad::SolidColorQuad(5), test::Quad::SolidColorQuad(6)}, 502 {test::Quad::SolidColorQuad(5), test::Quad::SolidColorQuad(6)},
430 {test::Quad::SurfaceQuad(embedded_surface_id, 1.f), 503 {test::Quad::SurfaceQuad(embedded_surface_id, 1.f),
431 test::Quad::RenderPassQuad(pass_ids[0])}, 504 test::Quad::RenderPassQuad(pass_ids[0])},
432 {test::Quad::SolidColorQuad(7), test::Quad::RenderPassQuad(pass_ids[1])}}; 505 {test::Quad::SolidColorQuad(7), test::Quad::RenderPassQuad(pass_ids[1])}};
433 test::Pass root_passes[] = { 506 test::Pass root_passes[] = {
434 test::Pass(root_quads[0], arraysize(root_quads[0]), pass_ids[0]), 507 test::Pass(root_quads[0], arraysize(root_quads[0]), pass_ids[0]),
435 test::Pass(root_quads[1], arraysize(root_quads[1]), pass_ids[1]), 508 test::Pass(root_quads[1], arraysize(root_quads[1]), pass_ids[1]),
436 test::Pass(root_quads[2], arraysize(root_quads[2]), pass_ids[2])}; 509 test::Pass(root_quads[2], arraysize(root_quads[2]), pass_ids[2])};
437 510
438 SubmitCompositorFrame(root_passes, arraysize(root_passes), root_surface_id_); 511 SubmitCompositorFrame(root_passes, arraysize(root_passes), root_surface_id_);
439 512
513 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
514 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface));
515
440 scoped_ptr<CompositorFrame> aggregated_frame = 516 scoped_ptr<CompositorFrame> aggregated_frame =
441 aggregator_.Aggregate(root_surface_id_); 517 aggregator_.Aggregate(root_surface_id_);
442 518
519 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
520 EXPECT_TRUE(surface_aggregator_client_.HasSurface(embedded_surface));
521
443 ASSERT_TRUE(aggregated_frame); 522 ASSERT_TRUE(aggregated_frame);
444 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 523 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
445 524
446 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 525 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
447 526
448 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 527 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
449 528
450 ASSERT_EQ(5u, aggregated_pass_list.size()); 529 ASSERT_EQ(5u, aggregated_pass_list.size());
451 RenderPassId actual_pass_ids[] = { 530 RenderPassId actual_pass_ids[] = {
452 aggregated_pass_list[0]->id, aggregated_pass_list[1]->id, 531 aggregated_pass_list[0]->id, aggregated_pass_list[1]->id,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 631 test::Quad::SolidColorQuad(SK_ColorBLUE)};
553 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 632 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
554 633
555 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_); 634 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_);
556 635
557 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 636 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
558 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 637 test::Quad::SolidColorQuad(SK_ColorBLUE)};
559 test::Pass expected_passes[] = { 638 test::Pass expected_passes[] = {
560 test::Pass(expected_quads, arraysize(expected_quads))}; 639 test::Pass(expected_quads, arraysize(expected_quads))};
561 SurfaceId ids[] = {root_surface_id_, InvalidSurfaceId()}; 640 SurfaceId ids[] = {root_surface_id_, InvalidSurfaceId()};
641
642 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
562 AggregateAndVerify( 643 AggregateAndVerify(
563 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 644 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
645 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
564 } 646 }
565 647
566 // Tests a reference to a valid surface with no submitted frame. This quad 648 // Tests a reference to a valid surface with no submitted frame. This quad
567 // should also just be dropped. 649 // should also just be dropped.
568 TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) { 650 TEST_F(SurfaceAggregatorValidSurfaceTest, ValidSurfaceReferenceWithNoFrame) {
569 SurfaceId surface_with_no_frame_id = allocator_.GenerateId(); 651 SurfaceId surface_with_no_frame_id = allocator_.GenerateId();
570 factory_.Create(surface_with_no_frame_id); 652 factory_.Create(surface_with_no_frame_id);
653 Surface* surface_with_no_frame =
654 manager_.GetSurfaceForId(surface_with_no_frame_id);
655
571 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 656 test::Quad quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
572 test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f), 657 test::Quad::SurfaceQuad(surface_with_no_frame_id, 1.f),
573 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 658 test::Quad::SolidColorQuad(SK_ColorBLUE)};
574 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 659 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
575 660
576 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_); 661 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_);
577 662
578 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN), 663 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN),
579 test::Quad::SolidColorQuad(SK_ColorBLUE)}; 664 test::Quad::SolidColorQuad(SK_ColorBLUE)};
580 test::Pass expected_passes[] = { 665 test::Pass expected_passes[] = {
581 test::Pass(expected_quads, arraysize(expected_quads))}; 666 test::Pass(expected_quads, arraysize(expected_quads))};
582 SurfaceId ids[] = {root_surface_id_, surface_with_no_frame_id}; 667 SurfaceId ids[] = {root_surface_id_, surface_with_no_frame_id};
668 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
669 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface_with_no_frame));
583 AggregateAndVerify( 670 AggregateAndVerify(
584 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 671 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
672 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
673 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface_with_no_frame));
585 factory_.Destroy(surface_with_no_frame_id); 674 factory_.Destroy(surface_with_no_frame_id);
586 } 675 }
587 676
588 // Tests a surface quad referencing itself, generating a trivial cycle. 677 // Tests a surface quad referencing itself, generating a trivial cycle.
589 // The quad creating the cycle should be dropped from the final frame. 678 // The quad creating the cycle should be dropped from the final frame.
590 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleCyclicalReference) { 679 TEST_F(SurfaceAggregatorValidSurfaceTest, SimpleCyclicalReference) {
591 test::Quad quads[] = {test::Quad::SurfaceQuad(root_surface_id_, 1.f), 680 test::Quad quads[] = {test::Quad::SurfaceQuad(root_surface_id_, 1.f),
592 test::Quad::SolidColorQuad(SK_ColorYELLOW)}; 681 test::Quad::SolidColorQuad(SK_ColorYELLOW)};
593 test::Pass passes[] = {test::Pass(quads, arraysize(quads))}; 682 test::Pass passes[] = {test::Pass(quads, arraysize(quads))};
594 683
595 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_); 684 SubmitCompositorFrame(passes, arraysize(passes), root_surface_id_);
596 685
597 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorYELLOW)}; 686 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorYELLOW)};
598 test::Pass expected_passes[] = { 687 test::Pass expected_passes[] = {
599 test::Pass(expected_quads, arraysize(expected_quads))}; 688 test::Pass(expected_quads, arraysize(expected_quads))};
600 SurfaceId ids[] = {root_surface_id_}; 689 SurfaceId ids[] = {root_surface_id_};
690 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
601 AggregateAndVerify( 691 AggregateAndVerify(
602 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 692 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
693 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
603 } 694 }
604 695
605 // Tests a more complex cycle with one intermediate surface. 696 // Tests a more complex cycle with one intermediate surface.
606 TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) { 697 TEST_F(SurfaceAggregatorValidSurfaceTest, TwoSurfaceCyclicalReference) {
607 SurfaceId child_surface_id = allocator_.GenerateId(); 698 SurfaceId child_surface_id = allocator_.GenerateId();
608 factory_.Create(child_surface_id); 699 factory_.Create(child_surface_id);
700 Surface* child_surface = manager_.GetSurfaceForId(child_surface_id);
701 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
609 702
610 test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), 703 test::Quad parent_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE),
611 test::Quad::SurfaceQuad(child_surface_id, 1.f), 704 test::Quad::SurfaceQuad(child_surface_id, 1.f),
612 test::Quad::SolidColorQuad(SK_ColorCYAN)}; 705 test::Quad::SolidColorQuad(SK_ColorCYAN)};
613 test::Pass parent_passes[] = { 706 test::Pass parent_passes[] = {
614 test::Pass(parent_quads, arraysize(parent_quads))}; 707 test::Pass(parent_quads, arraysize(parent_quads))};
615 708
616 SubmitCompositorFrame(parent_passes, arraysize(parent_passes), 709 SubmitCompositorFrame(parent_passes, arraysize(parent_passes),
617 root_surface_id_); 710 root_surface_id_);
618 711
(...skipping 11 matching lines...) Expand all
630 // SK_ColorGREEN from the child 723 // SK_ColorGREEN from the child
631 // SK_ColorMAGENTA from the child 724 // SK_ColorMAGENTA from the child
632 // SK_ColorCYAN from the parent 725 // SK_ColorCYAN from the parent
633 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE), 726 test::Quad expected_quads[] = {test::Quad::SolidColorQuad(SK_ColorBLUE),
634 test::Quad::SolidColorQuad(SK_ColorGREEN), 727 test::Quad::SolidColorQuad(SK_ColorGREEN),
635 test::Quad::SolidColorQuad(SK_ColorMAGENTA), 728 test::Quad::SolidColorQuad(SK_ColorMAGENTA),
636 test::Quad::SolidColorQuad(SK_ColorCYAN)}; 729 test::Quad::SolidColorQuad(SK_ColorCYAN)};
637 test::Pass expected_passes[] = { 730 test::Pass expected_passes[] = {
638 test::Pass(expected_quads, arraysize(expected_quads))}; 731 test::Pass(expected_quads, arraysize(expected_quads))};
639 SurfaceId ids[] = {root_surface_id_, child_surface_id}; 732 SurfaceId ids[] = {root_surface_id_, child_surface_id};
733 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
734 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
640 AggregateAndVerify( 735 AggregateAndVerify(
641 expected_passes, arraysize(expected_passes), ids, arraysize(ids)); 736 expected_passes, arraysize(expected_passes), ids, arraysize(ids));
737 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
738 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
642 factory_.Destroy(child_surface_id); 739 factory_.Destroy(child_surface_id);
643 } 740 }
644 741
645 // Tests that we map render pass IDs from different surfaces into a unified 742 // Tests that we map render pass IDs from different surfaces into a unified
646 // namespace and update RenderPassDrawQuad's id references to match. 743 // namespace and update RenderPassDrawQuad's id references to match.
647 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) { 744 TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassIdMapping) {
648 SurfaceId child_surface_id = allocator_.GenerateId(); 745 SurfaceId child_surface_id = allocator_.GenerateId();
649 factory_.Create(child_surface_id); 746 factory_.Create(child_surface_id);
747 Surface* child_surface = manager_.GetSurfaceForId(child_surface_id);
748 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
650 749
651 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; 750 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)};
652 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)}, 751 test::Quad child_quad[][1] = {{test::Quad::SolidColorQuad(SK_ColorGREEN)},
653 {test::Quad::RenderPassQuad(child_pass_id[0])}}; 752 {test::Quad::RenderPassQuad(child_pass_id[0])}};
654 test::Pass surface_passes[] = { 753 test::Pass surface_passes[] = {
655 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]), 754 test::Pass(child_quad[0], arraysize(child_quad[0]), child_pass_id[0]),
656 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])}; 755 test::Pass(child_quad[1], arraysize(child_quad[1]), child_pass_id[1])};
657 756
658 SubmitCompositorFrame(surface_passes, arraysize(surface_passes), 757 SubmitCompositorFrame(surface_passes, arraysize(surface_passes),
659 child_surface_id); 758 child_surface_id);
660 759
661 // Pass IDs from the parent surface may collide with ones from the child. 760 // Pass IDs from the parent surface may collide with ones from the child.
662 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; 761 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)};
663 test::Quad parent_quad[][1] = { 762 test::Quad parent_quad[][1] = {
664 {test::Quad::SurfaceQuad(child_surface_id, 1.f)}, 763 {test::Quad::SurfaceQuad(child_surface_id, 1.f)},
665 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; 764 {test::Quad::RenderPassQuad(parent_pass_id[0])}};
666 test::Pass parent_passes[] = { 765 test::Pass parent_passes[] = {
667 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), 766 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]),
668 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; 767 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])};
669 768
670 SubmitCompositorFrame(parent_passes, arraysize(parent_passes), 769 SubmitCompositorFrame(parent_passes, arraysize(parent_passes),
671 root_surface_id_); 770 root_surface_id_);
771
772 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
773 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
774
672 scoped_ptr<CompositorFrame> aggregated_frame = 775 scoped_ptr<CompositorFrame> aggregated_frame =
673 aggregator_.Aggregate(root_surface_id_); 776 aggregator_.Aggregate(root_surface_id_);
674 777
778 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
779 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
780
675 ASSERT_TRUE(aggregated_frame); 781 ASSERT_TRUE(aggregated_frame);
676 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 782 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
677 783
678 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 784 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
679 785
680 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 786 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
681 787
682 ASSERT_EQ(3u, aggregated_pass_list.size()); 788 ASSERT_EQ(3u, aggregated_pass_list.size());
683 RenderPassId actual_pass_ids[] = {aggregated_pass_list[0]->id, 789 RenderPassId actual_pass_ids[] = {aggregated_pass_list[0]->id,
684 aggregated_pass_list[1]->id, 790 aggregated_pass_list[1]->id,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 SkXfermode::kDst_Mode, // 2 868 SkXfermode::kDst_Mode, // 2
763 SkXfermode::kSrcOver_Mode, // 3 869 SkXfermode::kSrcOver_Mode, // 3
764 SkXfermode::kDstOver_Mode, // 4 870 SkXfermode::kDstOver_Mode, // 4
765 SkXfermode::kSrcIn_Mode, // 5 871 SkXfermode::kSrcIn_Mode, // 5
766 SkXfermode::kDstIn_Mode, // 6 872 SkXfermode::kDstIn_Mode, // 6
767 }; 873 };
768 874
769 RenderPassId pass_id(1, 1); 875 RenderPassId pass_id(1, 1);
770 SurfaceId grandchild_surface_id = allocator_.GenerateId(); 876 SurfaceId grandchild_surface_id = allocator_.GenerateId();
771 factory_.Create(grandchild_surface_id); 877 factory_.Create(grandchild_surface_id);
878 Surface* grandchild_surface = manager_.GetSurfaceForId(grandchild_surface_id);
879 EXPECT_FALSE(surface_aggregator_client_.HasSurface(grandchild_surface));
772 scoped_ptr<RenderPass> grandchild_pass = RenderPass::Create(); 880 scoped_ptr<RenderPass> grandchild_pass = RenderPass::Create();
773 gfx::Rect output_rect(SurfaceSize()); 881 gfx::Rect output_rect(SurfaceSize());
774 gfx::Rect damage_rect(SurfaceSize()); 882 gfx::Rect damage_rect(SurfaceSize());
775 gfx::Transform transform_to_root_target; 883 gfx::Transform transform_to_root_target;
776 grandchild_pass->SetNew( 884 grandchild_pass->SetNew(
777 pass_id, output_rect, damage_rect, transform_to_root_target); 885 pass_id, output_rect, damage_rect, transform_to_root_target);
778 AddSolidColorQuadWithBlendMode( 886 AddSolidColorQuadWithBlendMode(
779 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); 887 SurfaceSize(), grandchild_pass.get(), blend_modes[2]);
780 QueuePassAsFrame(grandchild_pass.Pass(), grandchild_surface_id); 888 QueuePassAsFrame(grandchild_pass.Pass(), grandchild_surface_id);
781 889
782 SurfaceId child_one_surface_id = allocator_.GenerateId(); 890 SurfaceId child_one_surface_id = allocator_.GenerateId();
783 factory_.Create(child_one_surface_id); 891 factory_.Create(child_one_surface_id);
892 Surface* child_one_surface = manager_.GetSurfaceForId(child_one_surface_id);
893 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_one_surface));
784 894
785 scoped_ptr<RenderPass> child_one_pass = RenderPass::Create(); 895 scoped_ptr<RenderPass> child_one_pass = RenderPass::Create();
786 child_one_pass->SetNew( 896 child_one_pass->SetNew(
787 pass_id, output_rect, damage_rect, transform_to_root_target); 897 pass_id, output_rect, damage_rect, transform_to_root_target);
788 AddSolidColorQuadWithBlendMode( 898 AddSolidColorQuadWithBlendMode(
789 SurfaceSize(), child_one_pass.get(), blend_modes[1]); 899 SurfaceSize(), child_one_pass.get(), blend_modes[1]);
790 SurfaceDrawQuad* grandchild_surface_quad = 900 SurfaceDrawQuad* grandchild_surface_quad =
791 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 901 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
792 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(), 902 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(),
793 gfx::Rect(SurfaceSize()), 903 gfx::Rect(SurfaceSize()),
794 gfx::Rect(SurfaceSize()), 904 gfx::Rect(SurfaceSize()),
795 grandchild_surface_id); 905 grandchild_surface_id);
796 AddSolidColorQuadWithBlendMode( 906 AddSolidColorQuadWithBlendMode(
797 SurfaceSize(), child_one_pass.get(), blend_modes[3]); 907 SurfaceSize(), child_one_pass.get(), blend_modes[3]);
798 QueuePassAsFrame(child_one_pass.Pass(), child_one_surface_id); 908 QueuePassAsFrame(child_one_pass.Pass(), child_one_surface_id);
799 909
800 SurfaceId child_two_surface_id = allocator_.GenerateId(); 910 SurfaceId child_two_surface_id = allocator_.GenerateId();
801 factory_.Create(child_two_surface_id); 911 factory_.Create(child_two_surface_id);
912 Surface* child_two_surface = manager_.GetSurfaceForId(child_two_surface_id);
913 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_two_surface));
802 914
803 scoped_ptr<RenderPass> child_two_pass = RenderPass::Create(); 915 scoped_ptr<RenderPass> child_two_pass = RenderPass::Create();
804 child_two_pass->SetNew( 916 child_two_pass->SetNew(
805 pass_id, output_rect, damage_rect, transform_to_root_target); 917 pass_id, output_rect, damage_rect, transform_to_root_target);
806 AddSolidColorQuadWithBlendMode( 918 AddSolidColorQuadWithBlendMode(
807 SurfaceSize(), child_two_pass.get(), blend_modes[5]); 919 SurfaceSize(), child_two_pass.get(), blend_modes[5]);
808 QueuePassAsFrame(child_two_pass.Pass(), child_two_surface_id); 920 QueuePassAsFrame(child_two_pass.Pass(), child_two_surface_id);
809 921
810 scoped_ptr<RenderPass> root_pass = RenderPass::Create(); 922 scoped_ptr<RenderPass> root_pass = RenderPass::Create();
811 root_pass->SetNew( 923 root_pass->SetNew(
(...skipping 13 matching lines...) Expand all
825 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); 937 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
826 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), 938 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(),
827 gfx::Rect(SurfaceSize()), 939 gfx::Rect(SurfaceSize()),
828 gfx::Rect(SurfaceSize()), 940 gfx::Rect(SurfaceSize()),
829 child_two_surface_id); 941 child_two_surface_id);
830 AddSolidColorQuadWithBlendMode( 942 AddSolidColorQuadWithBlendMode(
831 SurfaceSize(), root_pass.get(), blend_modes[6]); 943 SurfaceSize(), root_pass.get(), blend_modes[6]);
832 944
833 QueuePassAsFrame(root_pass.Pass(), root_surface_id_); 945 QueuePassAsFrame(root_pass.Pass(), root_surface_id_);
834 946
947 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
948 EXPECT_FALSE(surface_aggregator_client_.HasSurface(grandchild_surface));
949 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_one_surface));
950 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_two_surface));
951
835 scoped_ptr<CompositorFrame> aggregated_frame = 952 scoped_ptr<CompositorFrame> aggregated_frame =
836 aggregator_.Aggregate(root_surface_id_); 953 aggregator_.Aggregate(root_surface_id_);
837 954
955 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
956 EXPECT_TRUE(surface_aggregator_client_.HasSurface(grandchild_surface));
957 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_one_surface));
958 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_two_surface));
959
838 ASSERT_TRUE(aggregated_frame); 960 ASSERT_TRUE(aggregated_frame);
839 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 961 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
840 962
841 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 963 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
842 964
843 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 965 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
844 966
845 ASSERT_EQ(1u, aggregated_pass_list.size()); 967 ASSERT_EQ(1u, aggregated_pass_list.size());
846 968
847 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list; 969 const QuadList& aggregated_quad_list = aggregated_pass_list[0]->quad_list;
(...skipping 25 matching lines...) Expand all
873 // of +5 in the x direction. The second pass has a reference to the first pass' 995 // of +5 in the x direction. The second pass has a reference to the first pass'
874 // pass id and a transform of +8 in the x direction. 996 // pass id and a transform of +8 in the x direction.
875 // 997 //
876 // After aggregation, the child surface's root pass quad should have all 998 // After aggregation, the child surface's root pass quad should have all
877 // transforms concatenated for a total transform of +23 x, +10 y. The 999 // transforms concatenated for a total transform of +23 x, +10 y. The
878 // contributing render pass' transform in the aggregate frame should not be 1000 // contributing render pass' transform in the aggregate frame should not be
879 // affected. 1001 // affected.
880 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) { 1002 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateMultiplePassWithTransform) {
881 // Innermost child surface. 1003 // Innermost child surface.
882 SurfaceId child_surface_id = allocator_.GenerateId(); 1004 SurfaceId child_surface_id = allocator_.GenerateId();
1005 factory_.Create(child_surface_id);
1006 Surface* child_surface = manager_.GetSurfaceForId(child_surface_id);
1007 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
883 { 1008 {
884 factory_.Create(child_surface_id);
885 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; 1009 RenderPassId child_pass_id[] = {RenderPassId(1, 1), RenderPassId(1, 2)};
886 test::Quad child_quads[][1] = { 1010 test::Quad child_quads[][1] = {
887 {test::Quad::SolidColorQuad(SK_ColorGREEN)}, 1011 {test::Quad::SolidColorQuad(SK_ColorGREEN)},
888 {test::Quad::RenderPassQuad(child_pass_id[0])}, 1012 {test::Quad::RenderPassQuad(child_pass_id[0])},
889 }; 1013 };
890 test::Pass child_passes[] = { 1014 test::Pass child_passes[] = {
891 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]), 1015 test::Pass(child_quads[0], arraysize(child_quads[0]), child_pass_id[0]),
892 test::Pass(child_quads[1], arraysize(child_quads[1]), 1016 test::Pass(child_quads[1], arraysize(child_quads[1]),
893 child_pass_id[1])}; 1017 child_pass_id[1])};
894 1018
(...skipping 19 matching lines...) Expand all
914 1038
915 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 1039 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
916 child_frame->delegated_frame_data = child_frame_data.Pass(); 1040 child_frame->delegated_frame_data = child_frame_data.Pass();
917 1041
918 factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), 1042 factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(),
919 SurfaceFactory::DrawCallback()); 1043 SurfaceFactory::DrawCallback());
920 } 1044 }
921 1045
922 // Middle child surface. 1046 // Middle child surface.
923 SurfaceId middle_surface_id = allocator_.GenerateId(); 1047 SurfaceId middle_surface_id = allocator_.GenerateId();
1048 factory_.Create(middle_surface_id);
1049 Surface* middle_surface = manager_.GetSurfaceForId(middle_surface_id);
1050 EXPECT_FALSE(surface_aggregator_client_.HasSurface(middle_surface));
924 { 1051 {
925 factory_.Create(middle_surface_id);
926 test::Quad middle_quads[] = { 1052 test::Quad middle_quads[] = {
927 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; 1053 test::Quad::SurfaceQuad(child_surface_id, 1.f)};
928 test::Pass middle_passes[] = { 1054 test::Pass middle_passes[] = {
929 test::Pass(middle_quads, arraysize(middle_quads)), 1055 test::Pass(middle_quads, arraysize(middle_quads)),
930 }; 1056 };
931 1057
932 RenderPassList middle_pass_list; 1058 RenderPassList middle_pass_list;
933 AddPasses(&middle_pass_list, gfx::Rect(SurfaceSize()), middle_passes, 1059 AddPasses(&middle_pass_list, gfx::Rect(SurfaceSize()), middle_passes,
934 arraysize(middle_passes)); 1060 arraysize(middle_passes));
935 1061
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 1104
979 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); 1105 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData);
980 root_pass_list.swap(root_frame_data->render_pass_list); 1106 root_pass_list.swap(root_frame_data->render_pass_list);
981 1107
982 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); 1108 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame);
983 root_frame->delegated_frame_data = root_frame_data.Pass(); 1109 root_frame->delegated_frame_data = root_frame_data.Pass();
984 1110
985 factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), 1111 factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(),
986 SurfaceFactory::DrawCallback()); 1112 SurfaceFactory::DrawCallback());
987 1113
1114 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
1115 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
1116 EXPECT_FALSE(surface_aggregator_client_.HasSurface(middle_surface));
1117
988 scoped_ptr<CompositorFrame> aggregated_frame = 1118 scoped_ptr<CompositorFrame> aggregated_frame =
989 aggregator_.Aggregate(root_surface_id_); 1119 aggregator_.Aggregate(root_surface_id_);
990 1120
1121 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1122 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1123 EXPECT_TRUE(surface_aggregator_client_.HasSurface(middle_surface));
1124
991 ASSERT_TRUE(aggregated_frame); 1125 ASSERT_TRUE(aggregated_frame);
992 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1126 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
993 1127
994 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 1128 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
995 1129
996 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1130 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
997 1131
998 ASSERT_EQ(3u, aggregated_pass_list.size()); 1132 ASSERT_EQ(3u, aggregated_pass_list.size());
999 1133
1000 ASSERT_EQ(1u, aggregated_pass_list[0]->shared_quad_state_list.size()); 1134 ASSERT_EQ(1u, aggregated_pass_list[0]->shared_quad_state_list.size());
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0); 1218 child_root_pass_sqs->quad_to_target_transform.Translate(8, 0);
1085 1219
1086 scoped_ptr<DelegatedFrameData> child_frame_data(new DelegatedFrameData); 1220 scoped_ptr<DelegatedFrameData> child_frame_data(new DelegatedFrameData);
1087 child_pass_list.swap(child_frame_data->render_pass_list); 1221 child_pass_list.swap(child_frame_data->render_pass_list);
1088 1222
1089 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 1223 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
1090 child_frame->delegated_frame_data = child_frame_data.Pass(); 1224 child_frame->delegated_frame_data = child_frame_data.Pass();
1091 1225
1092 SurfaceId child_surface_id = allocator_.GenerateId(); 1226 SurfaceId child_surface_id = allocator_.GenerateId();
1093 factory_.Create(child_surface_id); 1227 factory_.Create(child_surface_id);
1228 Surface* child_surface = manager_.GetSurfaceForId(child_surface_id);
1094 factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), 1229 factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(),
1095 SurfaceFactory::DrawCallback()); 1230 SurfaceFactory::DrawCallback());
1096 1231
1097 test::Quad parent_surface_quads[] = { 1232 test::Quad parent_surface_quads[] = {
1098 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; 1233 test::Quad::SurfaceQuad(child_surface_id, 1.f)};
1099 test::Pass parent_surface_passes[] = { 1234 test::Pass parent_surface_passes[] = {
1100 test::Pass(parent_surface_quads, arraysize(parent_surface_quads), 1235 test::Pass(parent_surface_quads, arraysize(parent_surface_quads),
1101 RenderPassId(1, 1))}; 1236 RenderPassId(1, 1))};
1102 1237
1103 RenderPassList parent_surface_pass_list; 1238 RenderPassList parent_surface_pass_list;
1104 AddPasses(&parent_surface_pass_list, 1239 AddPasses(&parent_surface_pass_list,
1105 gfx::Rect(SurfaceSize()), 1240 gfx::Rect(SurfaceSize()),
1106 parent_surface_passes, 1241 parent_surface_passes,
1107 arraysize(parent_surface_passes)); 1242 arraysize(parent_surface_passes));
1108 1243
1109 // Parent surface is only used to test if the transform is applied correctly 1244 // Parent surface is only used to test if the transform is applied correctly
1110 // to the child surface's damage. 1245 // to the child surface's damage.
1111 scoped_ptr<DelegatedFrameData> parent_surface_frame_data( 1246 scoped_ptr<DelegatedFrameData> parent_surface_frame_data(
1112 new DelegatedFrameData); 1247 new DelegatedFrameData);
1113 parent_surface_pass_list.swap(parent_surface_frame_data->render_pass_list); 1248 parent_surface_pass_list.swap(parent_surface_frame_data->render_pass_list);
1114 1249
1115 scoped_ptr<CompositorFrame> parent_surface_frame(new CompositorFrame); 1250 scoped_ptr<CompositorFrame> parent_surface_frame(new CompositorFrame);
1116 parent_surface_frame->delegated_frame_data = parent_surface_frame_data.Pass(); 1251 parent_surface_frame->delegated_frame_data = parent_surface_frame_data.Pass();
1117 1252
1118 SurfaceId parent_surface_id = allocator_.GenerateId(); 1253 SurfaceId parent_surface_id = allocator_.GenerateId();
1119 factory_.Create(parent_surface_id); 1254 factory_.Create(parent_surface_id);
1255 Surface* parent_surface = manager_.GetSurfaceForId(parent_surface_id);
1120 factory_.SubmitCompositorFrame(parent_surface_id, parent_surface_frame.Pass(), 1256 factory_.SubmitCompositorFrame(parent_surface_id, parent_surface_frame.Pass(),
1121 SurfaceFactory::DrawCallback()); 1257 SurfaceFactory::DrawCallback());
1122 1258
1123 test::Quad root_surface_quads[] = { 1259 test::Quad root_surface_quads[] = {
1124 test::Quad::SurfaceQuad(parent_surface_id, 1.f)}; 1260 test::Quad::SurfaceQuad(parent_surface_id, 1.f)};
1125 test::Quad root_render_pass_quads[] = { 1261 test::Quad root_render_pass_quads[] = {
1126 test::Quad::RenderPassQuad(RenderPassId(1, 1))}; 1262 test::Quad::RenderPassQuad(RenderPassId(1, 1))};
1127 1263
1128 test::Pass root_passes[] = { 1264 test::Pass root_passes[] = {
1129 test::Pass(root_surface_quads, arraysize(root_surface_quads), 1265 test::Pass(root_surface_quads, arraysize(root_surface_quads),
(...skipping 15 matching lines...) Expand all
1145 1281
1146 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); 1282 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData);
1147 root_pass_list.swap(root_frame_data->render_pass_list); 1283 root_pass_list.swap(root_frame_data->render_pass_list);
1148 1284
1149 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); 1285 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame);
1150 root_frame->delegated_frame_data = root_frame_data.Pass(); 1286 root_frame->delegated_frame_data = root_frame_data.Pass();
1151 1287
1152 factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), 1288 factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(),
1153 SurfaceFactory::DrawCallback()); 1289 SurfaceFactory::DrawCallback());
1154 1290
1291 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
1292 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
1293 EXPECT_FALSE(surface_aggregator_client_.HasSurface(parent_surface));
1294
1155 scoped_ptr<CompositorFrame> aggregated_frame = 1295 scoped_ptr<CompositorFrame> aggregated_frame =
1156 aggregator_.Aggregate(root_surface_id_); 1296 aggregator_.Aggregate(root_surface_id_);
1157 1297
1298 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1299 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1300 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1301
1158 ASSERT_TRUE(aggregated_frame); 1302 ASSERT_TRUE(aggregated_frame);
1159 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1303 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1160 1304
1161 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 1305 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
1162 1306
1163 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1307 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1164 1308
1165 ASSERT_EQ(2u, aggregated_pass_list.size()); 1309 ASSERT_EQ(2u, aggregated_pass_list.size());
1166 1310
1167 // Damage rect for first aggregation should contain entire root surface. 1311 // Damage rect for first aggregation should contain entire root surface.
(...skipping 14 matching lines...) Expand all
1182 1326
1183 scoped_ptr<DelegatedFrameData> child_frame_data(new DelegatedFrameData); 1327 scoped_ptr<DelegatedFrameData> child_frame_data(new DelegatedFrameData);
1184 child_pass_list.swap(child_frame_data->render_pass_list); 1328 child_pass_list.swap(child_frame_data->render_pass_list);
1185 1329
1186 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); 1330 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
1187 child_frame->delegated_frame_data = child_frame_data.Pass(); 1331 child_frame->delegated_frame_data = child_frame_data.Pass();
1188 1332
1189 factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), 1333 factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(),
1190 SurfaceFactory::DrawCallback()); 1334 SurfaceFactory::DrawCallback());
1191 1335
1336 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1337 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1338 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1339
1192 scoped_ptr<CompositorFrame> aggregated_frame = 1340 scoped_ptr<CompositorFrame> aggregated_frame =
1193 aggregator_.Aggregate(root_surface_id_); 1341 aggregator_.Aggregate(root_surface_id_);
1194 1342
1343 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1344 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1345 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1346
1195 ASSERT_TRUE(aggregated_frame); 1347 ASSERT_TRUE(aggregated_frame);
1196 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1348 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1197 1349
1198 DelegatedFrameData* frame_data = 1350 DelegatedFrameData* frame_data =
1199 aggregated_frame->delegated_frame_data.get(); 1351 aggregated_frame->delegated_frame_data.get();
1200 1352
1201 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1353 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1202 1354
1203 ASSERT_EQ(2u, aggregated_pass_list.size()); 1355 ASSERT_EQ(2u, aggregated_pass_list.size());
1204 1356
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1244 1396
1245 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); 1397 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData);
1246 root_pass_list.swap(root_frame_data->render_pass_list); 1398 root_pass_list.swap(root_frame_data->render_pass_list);
1247 1399
1248 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); 1400 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame);
1249 root_frame->delegated_frame_data = root_frame_data.Pass(); 1401 root_frame->delegated_frame_data = root_frame_data.Pass();
1250 1402
1251 factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), 1403 factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(),
1252 SurfaceFactory::DrawCallback()); 1404 SurfaceFactory::DrawCallback());
1253 1405
1406 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1407 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1408 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1409
1254 scoped_ptr<CompositorFrame> aggregated_frame = 1410 scoped_ptr<CompositorFrame> aggregated_frame =
1255 aggregator_.Aggregate(root_surface_id_); 1411 aggregator_.Aggregate(root_surface_id_);
1256 1412
1413 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1414 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1415 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1416
1257 ASSERT_TRUE(aggregated_frame); 1417 ASSERT_TRUE(aggregated_frame);
1258 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1418 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1259 1419
1260 DelegatedFrameData* frame_data = 1420 DelegatedFrameData* frame_data =
1261 aggregated_frame->delegated_frame_data.get(); 1421 aggregated_frame->delegated_frame_data.get();
1262 1422
1263 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1423 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1264 1424
1265 ASSERT_EQ(2u, aggregated_pass_list.size()); 1425 ASSERT_EQ(2u, aggregated_pass_list.size());
1266 1426
1267 // The root surface was enqueued without being aggregated once, so it should 1427 // The root surface was enqueued without being aggregated once, so it should
1268 // be treated as completely damaged. 1428 // be treated as completely damaged.
1269 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains( 1429 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains(
1270 gfx::Rect(SurfaceSize()))); 1430 gfx::Rect(SurfaceSize())));
1271 } 1431 }
1272 1432
1273 // No Surface changed, so no damage should be given. 1433 // No Surface changed, so no damage should be given.
1274 { 1434 {
1435 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1436 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1437 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1438
1275 scoped_ptr<CompositorFrame> aggregated_frame = 1439 scoped_ptr<CompositorFrame> aggregated_frame =
1276 aggregator_.Aggregate(root_surface_id_); 1440 aggregator_.Aggregate(root_surface_id_);
1277 1441
1442 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1443 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1444 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1445
1278 ASSERT_TRUE(aggregated_frame); 1446 ASSERT_TRUE(aggregated_frame);
1279 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1447 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1280 1448
1281 DelegatedFrameData* frame_data = 1449 DelegatedFrameData* frame_data =
1282 aggregated_frame->delegated_frame_data.get(); 1450 aggregated_frame->delegated_frame_data.get();
1283 1451
1284 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1452 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1285 1453
1286 ASSERT_EQ(2u, aggregated_pass_list.size()); 1454 ASSERT_EQ(2u, aggregated_pass_list.size());
1287 1455
1288 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.IsEmpty()); 1456 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.IsEmpty());
1289 } 1457 }
1290 1458
1291 // SetFullDamageRectForSurface should cause the entire output to be 1459 // SetFullDamageRectForSurface should cause the entire output to be
1292 // marked as damaged. 1460 // marked as damaged.
1293 { 1461 {
1462 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1463 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1464 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1465
1294 aggregator_.SetFullDamageForSurface(root_surface_id_); 1466 aggregator_.SetFullDamageForSurface(root_surface_id_);
1295 scoped_ptr<CompositorFrame> aggregated_frame = 1467 scoped_ptr<CompositorFrame> aggregated_frame =
1296 aggregator_.Aggregate(root_surface_id_); 1468 aggregator_.Aggregate(root_surface_id_);
1297 1469
1470 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1471 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1472 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface));
1473
1298 ASSERT_TRUE(aggregated_frame); 1474 ASSERT_TRUE(aggregated_frame);
1299 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1475 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1300 1476
1301 DelegatedFrameData* frame_data = 1477 DelegatedFrameData* frame_data =
1302 aggregated_frame->delegated_frame_data.get(); 1478 aggregated_frame->delegated_frame_data.get();
1303 1479
1304 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1480 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1305 1481
1306 ASSERT_EQ(2u, aggregated_pass_list.size()); 1482 ASSERT_EQ(2u, aggregated_pass_list.size());
1307 1483
1308 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains( 1484 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains(
1309 gfx::Rect(SurfaceSize()))); 1485 gfx::Rect(SurfaceSize())));
1310 } 1486 }
1311 1487
1312 factory_.Destroy(child_surface_id); 1488 factory_.Destroy(child_surface_id);
1313 } 1489 }
1314 1490
1315 class SurfaceAggregatorPartialSwapTest 1491 class SurfaceAggregatorPartialSwapTest
1316 : public SurfaceAggregatorValidSurfaceTest { 1492 : public SurfaceAggregatorValidSurfaceTest {
1317 public: 1493 public:
1318 SurfaceAggregatorPartialSwapTest() 1494 SurfaceAggregatorPartialSwapTest()
1319 : SurfaceAggregatorValidSurfaceTest(true) {} 1495 : SurfaceAggregatorValidSurfaceTest(true) {}
1320 }; 1496 };
1321 1497
1322 // Tests that quads outside the damage rect are ignored. 1498 // Tests that quads outside the damage rect are ignored.
1323 TEST_F(SurfaceAggregatorPartialSwapTest, IgnoreOutside) { 1499 TEST_F(SurfaceAggregatorPartialSwapTest, IgnoreOutside) {
1324 SurfaceId child_surface_id = allocator_.GenerateId(); 1500 SurfaceId child_surface_id = allocator_.GenerateId();
1325 factory_.Create(child_surface_id); 1501 factory_.Create(child_surface_id);
1502 Surface* child_surface = manager_.GetSurfaceForId(child_surface_id);
1326 // The child surface has two quads, one with a visible rect of 13,13 4x4 and 1503 // The child surface has two quads, one with a visible rect of 13,13 4x4 and
1327 // the other other with a visible rect of 10,10 2x2 (relative to root target 1504 // the other other with a visible rect of 10,10 2x2 (relative to root target
1328 // space). 1505 // space).
1329 { 1506 {
1330 RenderPassId child_pass_id = RenderPassId(1, 1); 1507 RenderPassId child_pass_id = RenderPassId(1, 1);
1331 test::Quad child_quads1[] = {test::Quad::RenderPassQuad(child_pass_id)}; 1508 test::Quad child_quads1[] = {test::Quad::RenderPassQuad(child_pass_id)};
1332 test::Quad child_quads2[] = {test::Quad::RenderPassQuad(child_pass_id)}; 1509 test::Quad child_quads2[] = {test::Quad::RenderPassQuad(child_pass_id)};
1333 test::Pass child_passes[] = { 1510 test::Pass child_passes[] = {
1334 test::Pass(child_quads1, arraysize(child_quads1), child_pass_id), 1511 test::Pass(child_quads1, arraysize(child_quads1), child_pass_id),
1335 test::Pass(child_quads2, arraysize(child_quads2), child_pass_id)}; 1512 test::Pass(child_quads2, arraysize(child_quads2), child_pass_id)};
(...skipping 25 matching lines...) Expand all
1361 arraysize(root_passes)); 1538 arraysize(root_passes));
1362 1539
1363 RenderPass* root_pass = root_pass_list.at(0u); 1540 RenderPass* root_pass = root_pass_list.at(0u);
1364 root_pass->shared_quad_state_list.front() 1541 root_pass->shared_quad_state_list.front()
1365 ->quad_to_target_transform.Translate(10, 10); 1542 ->quad_to_target_transform.Translate(10, 10);
1366 root_pass->damage_rect = gfx::Rect(0, 0, 1, 1); 1543 root_pass->damage_rect = gfx::Rect(0, 0, 1, 1);
1367 1544
1368 SubmitPassListAsFrame(root_surface_id_, &root_pass_list); 1545 SubmitPassListAsFrame(root_surface_id_, &root_pass_list);
1369 } 1546 }
1370 1547
1548 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_));
1549 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
1550
1371 scoped_ptr<CompositorFrame> aggregated_frame = 1551 scoped_ptr<CompositorFrame> aggregated_frame =
1372 aggregator_.Aggregate(root_surface_id_); 1552 aggregator_.Aggregate(root_surface_id_);
1373 1553
1554 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1555 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1556
1374 ASSERT_TRUE(aggregated_frame); 1557 ASSERT_TRUE(aggregated_frame);
1375 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1558 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1376 1559
1377 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); 1560 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get();
1378 1561
1379 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1562 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1380 1563
1381 ASSERT_EQ(2u, aggregated_pass_list.size()); 1564 ASSERT_EQ(2u, aggregated_pass_list.size());
1382 1565
1383 // Damage rect for first aggregation should contain entire root surface. 1566 // Damage rect for first aggregation should contain entire root surface.
(...skipping 12 matching lines...) Expand all
1396 arraysize(root_passes)); 1579 arraysize(root_passes));
1397 1580
1398 RenderPass* root_pass = root_pass_list.at(0u); 1581 RenderPass* root_pass = root_pass_list.at(0u);
1399 root_pass->shared_quad_state_list.front() 1582 root_pass->shared_quad_state_list.front()
1400 ->quad_to_target_transform.Translate(10, 10); 1583 ->quad_to_target_transform.Translate(10, 10);
1401 root_pass->damage_rect = gfx::Rect(10, 10, 2, 2); 1584 root_pass->damage_rect = gfx::Rect(10, 10, 2, 2);
1402 SubmitPassListAsFrame(root_surface_id_, &root_pass_list); 1585 SubmitPassListAsFrame(root_surface_id_, &root_pass_list);
1403 } 1586 }
1404 1587
1405 { 1588 {
1589 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1590 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1591
1406 scoped_ptr<CompositorFrame> aggregated_frame = 1592 scoped_ptr<CompositorFrame> aggregated_frame =
1407 aggregator_.Aggregate(root_surface_id_); 1593 aggregator_.Aggregate(root_surface_id_);
1408 1594
1595 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1596 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1597
1409 ASSERT_TRUE(aggregated_frame); 1598 ASSERT_TRUE(aggregated_frame);
1410 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1599 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1411 1600
1412 DelegatedFrameData* frame_data = 1601 DelegatedFrameData* frame_data =
1413 aggregated_frame->delegated_frame_data.get(); 1602 aggregated_frame->delegated_frame_data.get();
1414 1603
1415 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1604 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1416 1605
1417 ASSERT_EQ(2u, aggregated_pass_list.size()); 1606 ASSERT_EQ(2u, aggregated_pass_list.size());
1418 1607
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 1640
1452 RenderPass* child_root_pass = child_pass_list.at(1u); 1641 RenderPass* child_root_pass = child_pass_list.at(1u);
1453 1642
1454 child_root_pass->copy_requests.push_back( 1643 child_root_pass->copy_requests.push_back(
1455 CopyOutputRequest::CreateEmptyRequest()); 1644 CopyOutputRequest::CreateEmptyRequest());
1456 child_root_pass->damage_rect = gfx::Rect(); 1645 child_root_pass->damage_rect = gfx::Rect();
1457 SubmitPassListAsFrame(child_surface_id, &child_pass_list); 1646 SubmitPassListAsFrame(child_surface_id, &child_pass_list);
1458 } 1647 }
1459 1648
1460 { 1649 {
1650 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1651 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1652
1461 scoped_ptr<CompositorFrame> aggregated_frame = 1653 scoped_ptr<CompositorFrame> aggregated_frame =
1462 aggregator_.Aggregate(root_surface_id_); 1654 aggregator_.Aggregate(root_surface_id_);
1463 1655
1656 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1657 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1658
1464 ASSERT_TRUE(aggregated_frame); 1659 ASSERT_TRUE(aggregated_frame);
1465 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1660 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1466 1661
1467 DelegatedFrameData* frame_data = 1662 DelegatedFrameData* frame_data =
1468 aggregated_frame->delegated_frame_data.get(); 1663 aggregated_frame->delegated_frame_data.get();
1469 1664
1470 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1665 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1471 1666
1472 // Output frame should have no damage, but all quads included. 1667 // Output frame should have no damage, but all quads included.
1473 ASSERT_EQ(3u, aggregated_pass_list.size()); 1668 ASSERT_EQ(3u, aggregated_pass_list.size());
1474 1669
1475 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.IsEmpty()); 1670 EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.IsEmpty());
1476 ASSERT_EQ(1u, aggregated_pass_list[0]->quad_list.size()); 1671 ASSERT_EQ(1u, aggregated_pass_list[0]->quad_list.size());
1477 ASSERT_EQ(1u, aggregated_pass_list[1]->quad_list.size()); 1672 ASSERT_EQ(1u, aggregated_pass_list[1]->quad_list.size());
1478 EXPECT_EQ(gfx::Rect(1, 1, 2, 2), 1673 EXPECT_EQ(gfx::Rect(1, 1, 2, 2),
1479 aggregated_pass_list[0]->quad_list.ElementAt(0)->visible_rect); 1674 aggregated_pass_list[0]->quad_list.ElementAt(0)->visible_rect);
1480 EXPECT_EQ(gfx::Rect(0, 0, 2, 2), 1675 EXPECT_EQ(gfx::Rect(0, 0, 2, 2),
1481 aggregated_pass_list[1]->quad_list.ElementAt(0)->visible_rect); 1676 aggregated_pass_list[1]->quad_list.ElementAt(0)->visible_rect);
1482 } 1677 }
1483 1678
1484 { 1679 {
1680 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1681 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1682
1485 scoped_ptr<CompositorFrame> aggregated_frame = 1683 scoped_ptr<CompositorFrame> aggregated_frame =
1486 aggregator_.Aggregate(root_surface_id_); 1684 aggregator_.Aggregate(root_surface_id_);
1487 1685
1686 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_));
1687 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1688
1488 ASSERT_TRUE(aggregated_frame); 1689 ASSERT_TRUE(aggregated_frame);
1489 ASSERT_TRUE(aggregated_frame->delegated_frame_data); 1690 ASSERT_TRUE(aggregated_frame->delegated_frame_data);
1490 1691
1491 DelegatedFrameData* frame_data = 1692 DelegatedFrameData* frame_data =
1492 aggregated_frame->delegated_frame_data.get(); 1693 aggregated_frame->delegated_frame_data.get();
1493 1694
1494 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; 1695 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
1495 // There were no changes since last aggregation, so output should be empty 1696 // There were no changes since last aggregation, so output should be empty
1496 // and have no damage. 1697 // and have no damage.
1497 ASSERT_EQ(1u, aggregated_pass_list.size()); 1698 ASSERT_EQ(1u, aggregated_pass_list.size());
1498 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty()); 1699 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty());
1499 ASSERT_EQ(0u, aggregated_pass_list[0]->quad_list.size()); 1700 ASSERT_EQ(0u, aggregated_pass_list[0]->quad_list.size());
1500 } 1701 }
1501 1702
1502 factory_.Destroy(child_surface_id); 1703 factory_.Destroy(child_surface_id);
1503 } 1704 }
1504 1705
1505 class SurfaceAggregatorWithResourcesTest : public testing::Test { 1706 class SurfaceAggregatorWithResourcesTest : public testing::Test {
1506 public: 1707 public:
1507 void SetUp() override { 1708 void SetUp() override {
1508 output_surface_ = FakeOutputSurface::CreateSoftware( 1709 output_surface_ = FakeOutputSurface::CreateSoftware(
1509 make_scoped_ptr(new SoftwareOutputDevice)); 1710 make_scoped_ptr(new SoftwareOutputDevice));
1510 output_surface_->BindToClient(&output_surface_client_); 1711 output_surface_->BindToClient(&output_surface_client_);
1511 shared_bitmap_manager_.reset(new TestSharedBitmapManager); 1712 shared_bitmap_manager_.reset(new TestSharedBitmapManager);
1512 1713
1513 resource_provider_ = FakeResourceProvider::Create( 1714 resource_provider_ = FakeResourceProvider::Create(
1514 output_surface_.get(), shared_bitmap_manager_.get()); 1715 output_surface_.get(), shared_bitmap_manager_.get());
1515 1716
1516 aggregator_.reset( 1717 aggregator_.reset(new SurfaceAggregator(&surface_aggregator_client_,
1517 new SurfaceAggregator(&manager_, resource_provider_.get(), false)); 1718 &manager_, resource_provider_.get(),
1719 false));
1518 } 1720 }
1519 1721
1520 protected: 1722 protected:
1521 SurfaceManager manager_; 1723 SurfaceManager manager_;
1522 FakeOutputSurfaceClient output_surface_client_; 1724 FakeOutputSurfaceClient output_surface_client_;
1523 scoped_ptr<OutputSurface> output_surface_; 1725 scoped_ptr<OutputSurface> output_surface_;
1524 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 1726 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
1525 scoped_ptr<ResourceProvider> resource_provider_; 1727 scoped_ptr<ResourceProvider> resource_provider_;
1526 scoped_ptr<SurfaceAggregator> aggregator_; 1728 scoped_ptr<SurfaceAggregator> aggregator_;
1729 FakeSurfaceAggregatorClient surface_aggregator_client_;
1527 }; 1730 };
1528 1731
1529 class ResourceTrackingSurfaceFactoryClient : public SurfaceFactoryClient { 1732 class ResourceTrackingSurfaceFactoryClient : public SurfaceFactoryClient {
1530 public: 1733 public:
1531 ResourceTrackingSurfaceFactoryClient() {} 1734 ResourceTrackingSurfaceFactoryClient() {}
1532 ~ResourceTrackingSurfaceFactoryClient() override {} 1735 ~ResourceTrackingSurfaceFactoryClient() override {}
1533 1736
1534 void ReturnResources(const ReturnedResourceArray& resources) override { 1737 void ReturnResources(const ReturnedResourceArray& resources) override {
1535 returned_resources_ = resources; 1738 returned_resources_ = resources;
1536 } 1739 }
1537 1740
1538 ReturnedResourceArray returned_resources() const { 1741 ReturnedResourceArray returned_resources() const {
1539 return returned_resources_; 1742 return returned_resources_;
1540 } 1743 }
1541 1744
1745 void SetBeginFrameSource(SurfaceId surface_id,
1746 BeginFrameSource* begin_frame_source) override {}
1747
1542 private: 1748 private:
1543 ReturnedResourceArray returned_resources_; 1749 ReturnedResourceArray returned_resources_;
1544 1750
1545 DISALLOW_COPY_AND_ASSIGN(ResourceTrackingSurfaceFactoryClient); 1751 DISALLOW_COPY_AND_ASSIGN(ResourceTrackingSurfaceFactoryClient);
1546 }; 1752 };
1547 1753
1548 void SubmitCompositorFrameWithResources(ResourceId* resource_ids, 1754 void SubmitCompositorFrameWithResources(ResourceId* resource_ids,
1549 size_t num_resource_ids, 1755 size_t num_resource_ids,
1550 bool valid, 1756 bool valid,
1551 SurfaceId child_id, 1757 SurfaceId child_id,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 frame->delegated_frame_data = frame_data.Pass(); 1797 frame->delegated_frame_data = frame_data.Pass();
1592 factory->SubmitCompositorFrame(surface_id, frame.Pass(), 1798 factory->SubmitCompositorFrame(surface_id, frame.Pass(),
1593 SurfaceFactory::DrawCallback()); 1799 SurfaceFactory::DrawCallback());
1594 } 1800 }
1595 1801
1596 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) { 1802 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) {
1597 ResourceTrackingSurfaceFactoryClient client; 1803 ResourceTrackingSurfaceFactoryClient client;
1598 SurfaceFactory factory(&manager_, &client); 1804 SurfaceFactory factory(&manager_, &client);
1599 SurfaceId surface_id(7u); 1805 SurfaceId surface_id(7u);
1600 factory.Create(surface_id); 1806 factory.Create(surface_id);
1807 Surface* surface = manager_.GetSurfaceForId(surface_id);
1601 1808
1602 ResourceId ids[] = {11, 12, 13}; 1809 ResourceId ids[] = {11, 12, 13};
1603 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1810 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1604 &factory, surface_id); 1811 &factory, surface_id);
1605 1812
1813 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface));
1814
1606 scoped_ptr<CompositorFrame> frame = aggregator_->Aggregate(surface_id); 1815 scoped_ptr<CompositorFrame> frame = aggregator_->Aggregate(surface_id);
1607 1816
1817 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface));
1818
1608 // Nothing should be available to be returned yet. 1819 // Nothing should be available to be returned yet.
1609 EXPECT_TRUE(client.returned_resources().empty()); 1820 EXPECT_TRUE(client.returned_resources().empty());
1610 1821
1611 SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), &factory, 1822 SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), &factory,
1612 surface_id); 1823 surface_id);
1613 1824
1825 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface));
1826
1614 frame = aggregator_->Aggregate(surface_id); 1827 frame = aggregator_->Aggregate(surface_id);
1615 1828
1829 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface));
1830
1616 ASSERT_EQ(3u, client.returned_resources().size()); 1831 ASSERT_EQ(3u, client.returned_resources().size());
1617 ResourceId returned_ids[3]; 1832 ResourceId returned_ids[3];
1618 for (size_t i = 0; i < 3; ++i) { 1833 for (size_t i = 0; i < 3; ++i) {
1619 returned_ids[i] = client.returned_resources()[i].id; 1834 returned_ids[i] = client.returned_resources()[i].id;
1620 } 1835 }
1621 EXPECT_THAT(returned_ids, 1836 EXPECT_THAT(returned_ids,
1622 testing::WhenSorted(testing::ElementsAreArray(ids))); 1837 testing::WhenSorted(testing::ElementsAreArray(ids)));
1623 factory.Destroy(surface_id); 1838 factory.Destroy(surface_id);
1624 } 1839 }
1625 1840
1626 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) { 1841 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) {
1627 ResourceTrackingSurfaceFactoryClient client; 1842 ResourceTrackingSurfaceFactoryClient client;
1628 SurfaceFactory factory(&manager_, &client); 1843 SurfaceFactory factory(&manager_, &client);
1629 SurfaceId surface_id(7u); 1844 SurfaceId surface_id(7u);
1630 factory.Create(surface_id); 1845 factory.Create(surface_id);
1846 Surface* surface = manager_.GetSurfaceForId(surface_id);
1631 1847
1632 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 1848 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
1633 scoped_ptr<RenderPass> pass = RenderPass::Create(); 1849 scoped_ptr<RenderPass> pass = RenderPass::Create();
1634 pass->id = RenderPassId(1, 1); 1850 pass->id = RenderPassId(1, 1);
1635 TransferableResource resource; 1851 TransferableResource resource;
1636 resource.id = 11; 1852 resource.id = 11;
1637 // ResourceProvider is software but resource is not, so it should be 1853 // ResourceProvider is software but resource is not, so it should be
1638 // ignored. 1854 // ignored.
1639 resource.is_software = false; 1855 resource.is_software = false;
1640 frame_data->resource_list.push_back(resource); 1856 frame_data->resource_list.push_back(resource);
1641 frame_data->render_pass_list.push_back(pass.Pass()); 1857 frame_data->render_pass_list.push_back(pass.Pass());
1642 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 1858 scoped_ptr<CompositorFrame> frame(new CompositorFrame);
1643 frame->delegated_frame_data = frame_data.Pass(); 1859 frame->delegated_frame_data = frame_data.Pass();
1644 factory.SubmitCompositorFrame(surface_id, frame.Pass(), 1860 factory.SubmitCompositorFrame(surface_id, frame.Pass(),
1645 SurfaceFactory::DrawCallback()); 1861 SurfaceFactory::DrawCallback());
1646 1862
1863 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface));
1864
1647 scoped_ptr<CompositorFrame> returned_frame = 1865 scoped_ptr<CompositorFrame> returned_frame =
1648 aggregator_->Aggregate(surface_id); 1866 aggregator_->Aggregate(surface_id);
1649 1867
1868 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface));
1869
1650 // Nothing should be available to be returned yet. 1870 // Nothing should be available to be returned yet.
1651 EXPECT_TRUE(client.returned_resources().empty()); 1871 EXPECT_TRUE(client.returned_resources().empty());
1652 1872
1653 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, 1873 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory,
1654 surface_id); 1874 surface_id);
1655 ASSERT_EQ(1u, client.returned_resources().size()); 1875 ASSERT_EQ(1u, client.returned_resources().size());
1656 EXPECT_EQ(11u, client.returned_resources()[0].id); 1876 EXPECT_EQ(11u, client.returned_resources()[0].id);
1657 1877
1658 factory.Destroy(surface_id); 1878 factory.Destroy(surface_id);
1659 } 1879 }
1660 1880
1661 TEST_F(SurfaceAggregatorWithResourcesTest, TwoSurfaces) { 1881 TEST_F(SurfaceAggregatorWithResourcesTest, TwoSurfaces) {
1662 ResourceTrackingSurfaceFactoryClient client; 1882 ResourceTrackingSurfaceFactoryClient client;
1663 SurfaceFactory factory(&manager_, &client); 1883 SurfaceFactory factory(&manager_, &client);
1664 SurfaceId surface_id(7u); 1884 SurfaceId surface1_id(7u);
1665 factory.Create(surface_id); 1885 factory.Create(surface1_id);
1666 SurfaceId surface_id2(8u); 1886 Surface* surface1 = manager_.GetSurfaceForId(surface1_id);
1667 factory.Create(surface_id2); 1887
1888 SurfaceId surface2_id(8u);
1889 factory.Create(surface2_id);
1890 Surface* surface2 = manager_.GetSurfaceForId(surface2_id);
1668 1891
1669 ResourceId ids[] = {11, 12, 13}; 1892 ResourceId ids[] = {11, 12, 13};
1670 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1893 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1671 &factory, surface_id); 1894 &factory, surface1_id);
1672 ResourceId ids2[] = {14, 15, 16}; 1895 ResourceId ids2[] = {14, 15, 16};
1673 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), true, SurfaceId(), 1896 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), true, SurfaceId(),
1674 &factory, surface_id2); 1897 &factory, surface2_id);
1675 1898
1676 scoped_ptr<CompositorFrame> frame = aggregator_->Aggregate(surface_id); 1899 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface1));
1900 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface2));
1901
1902 scoped_ptr<CompositorFrame> frame = aggregator_->Aggregate(surface1_id);
1903
1904 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface1));
1905 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface2));
1677 1906
1678 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory, 1907 SubmitCompositorFrameWithResources(NULL, 0, true, SurfaceId(), &factory,
1679 surface_id); 1908 surface1_id);
1680 1909
1681 // Nothing should be available to be returned yet. 1910 // Nothing should be available to be returned yet.
1682 EXPECT_TRUE(client.returned_resources().empty()); 1911 EXPECT_TRUE(client.returned_resources().empty());
1683 1912
1684 frame = aggregator_->Aggregate(surface_id2); 1913 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface1));
1914 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface2));
1685 1915
1686 // surface_id wasn't referenced, so its resources should be returned. 1916 frame = aggregator_->Aggregate(surface2_id);
1917
1918 EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface1));
1919 EXPECT_TRUE(surface_aggregator_client_.HasSurface(surface2));
1920
1921 // surface1_id wasn't referenced, so its resources should be returned.
1687 ASSERT_EQ(3u, client.returned_resources().size()); 1922 ASSERT_EQ(3u, client.returned_resources().size());
1688 ResourceId returned_ids[3]; 1923 ResourceId returned_ids[3];
1689 for (size_t i = 0; i < 3; ++i) { 1924 for (size_t i = 0; i < 3; ++i) {
1690 returned_ids[i] = client.returned_resources()[i].id; 1925 returned_ids[i] = client.returned_resources()[i].id;
1691 } 1926 }
1692 EXPECT_THAT(returned_ids, 1927 EXPECT_THAT(returned_ids,
1693 testing::WhenSorted(testing::ElementsAreArray(ids))); 1928 testing::WhenSorted(testing::ElementsAreArray(ids)));
1694 EXPECT_EQ(3u, resource_provider_->num_resources()); 1929 EXPECT_EQ(3u, resource_provider_->num_resources());
1695 factory.Destroy(surface_id); 1930 factory.Destroy(surface1_id);
1696 factory.Destroy(surface_id2); 1931 factory.Destroy(surface2_id);
1697 } 1932 }
1698 1933
1699 // Ensure that aggregator completely ignores Surfaces that reference invalid 1934 // Ensure that aggregator completely ignores Surfaces that reference invalid
1700 // resources. 1935 // resources.
1701 TEST_F(SurfaceAggregatorWithResourcesTest, InvalidChildSurface) { 1936 TEST_F(SurfaceAggregatorWithResourcesTest, InvalidChildSurface) {
1702 ResourceTrackingSurfaceFactoryClient client; 1937 ResourceTrackingSurfaceFactoryClient client;
1703 SurfaceFactory factory(&manager_, &client); 1938 SurfaceFactory factory(&manager_, &client);
1704 SurfaceId root_surface_id(7u); 1939 SurfaceId root_surface_id(7u);
1705 factory.Create(root_surface_id); 1940 factory.Create(root_surface_id);
1941 Surface* root_surface = manager_.GetSurfaceForId(root_surface_id);
1706 SurfaceId middle_surface_id(8u); 1942 SurfaceId middle_surface_id(8u);
1707 factory.Create(middle_surface_id); 1943 factory.Create(middle_surface_id);
1944 Surface* middle_surface = manager_.GetSurfaceForId(middle_surface_id);
1708 SurfaceId child_surface_id(9u); 1945 SurfaceId child_surface_id(9u);
1709 factory.Create(child_surface_id); 1946 factory.Create(child_surface_id);
1947 Surface* child_surface = manager_.GetSurfaceForId(child_surface_id);
1710 1948
1711 ResourceId ids[] = {14, 15, 16}; 1949 ResourceId ids[] = {14, 15, 16};
1712 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(), 1950 SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
1713 &factory, child_surface_id); 1951 &factory, child_surface_id);
1714 1952
1715 ResourceId ids2[] = {17, 18, 19}; 1953 ResourceId ids2[] = {17, 18, 19};
1716 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), false, 1954 SubmitCompositorFrameWithResources(ids2, arraysize(ids2), false,
1717 child_surface_id, &factory, 1955 child_surface_id, &factory,
1718 middle_surface_id); 1956 middle_surface_id);
1719 1957
1720 ResourceId ids3[] = {20, 21, 22}; 1958 ResourceId ids3[] = {20, 21, 22};
1721 SubmitCompositorFrameWithResources(ids3, arraysize(ids3), true, 1959 SubmitCompositorFrameWithResources(ids3, arraysize(ids3), true,
1722 middle_surface_id, &factory, 1960 middle_surface_id, &factory,
1723 root_surface_id); 1961 root_surface_id);
1724 1962
1963 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface));
1964 EXPECT_FALSE(surface_aggregator_client_.HasSurface(middle_surface));
1965 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
1966
1725 scoped_ptr<CompositorFrame> frame; 1967 scoped_ptr<CompositorFrame> frame;
1726 frame = aggregator_->Aggregate(root_surface_id); 1968 frame = aggregator_->Aggregate(root_surface_id);
1727 1969
1970 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface));
1971 EXPECT_TRUE(surface_aggregator_client_.HasSurface(middle_surface));
1972 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
1973
1728 RenderPassList* pass_list = &frame->delegated_frame_data->render_pass_list; 1974 RenderPassList* pass_list = &frame->delegated_frame_data->render_pass_list;
1729 ASSERT_EQ(1u, pass_list->size()); 1975 ASSERT_EQ(1u, pass_list->size());
1730 EXPECT_EQ(1u, pass_list->back()->shared_quad_state_list.size()); 1976 EXPECT_EQ(1u, pass_list->back()->shared_quad_state_list.size());
1731 EXPECT_EQ(3u, pass_list->back()->quad_list.size()); 1977 EXPECT_EQ(3u, pass_list->back()->quad_list.size());
1732 1978
1733 SubmitCompositorFrameWithResources(ids2, arraysize(ids), true, 1979 SubmitCompositorFrameWithResources(ids2, arraysize(ids), true,
1734 child_surface_id, &factory, 1980 child_surface_id, &factory,
1735 middle_surface_id); 1981 middle_surface_id);
1736 1982
1983 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface));
1984 EXPECT_TRUE(surface_aggregator_client_.HasSurface(middle_surface));
1985 EXPECT_FALSE(surface_aggregator_client_.HasSurface(child_surface));
1986
1737 frame = aggregator_->Aggregate(root_surface_id); 1987 frame = aggregator_->Aggregate(root_surface_id);
1738 1988
1989 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface));
1990 EXPECT_TRUE(surface_aggregator_client_.HasSurface(middle_surface));
1991 EXPECT_TRUE(surface_aggregator_client_.HasSurface(child_surface));
1992
1739 pass_list = &frame->delegated_frame_data->render_pass_list; 1993 pass_list = &frame->delegated_frame_data->render_pass_list;
1740 ASSERT_EQ(1u, pass_list->size()); 1994 ASSERT_EQ(1u, pass_list->size());
1741 EXPECT_EQ(3u, pass_list->back()->shared_quad_state_list.size()); 1995 EXPECT_EQ(3u, pass_list->back()->shared_quad_state_list.size());
1742 EXPECT_EQ(9u, pass_list->back()->quad_list.size()); 1996 EXPECT_EQ(9u, pass_list->back()->quad_list.size());
1743 1997
1744 factory.Destroy(root_surface_id); 1998 factory.Destroy(root_surface_id);
1745 factory.Destroy(child_surface_id); 1999 factory.Destroy(child_surface_id);
1746 factory.Destroy(middle_surface_id); 2000 factory.Destroy(middle_surface_id);
1747 } 2001 }
1748 2002
1749 } // namespace 2003 } // namespace
1750 } // namespace cc 2004 } // namespace cc
1751 2005
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698