| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/output/compositor_frame.h" | 5 #include "cc/output/compositor_frame.h" |
| 6 #include "cc/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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 manager_.GetSurfaceForId(root_surface_id_)->GetEligibleFrame(); | 470 manager_.GetSurfaceForId(root_surface_id_)->GetEligibleFrame(); |
| 471 RenderPassList& original_pass_list = | 471 RenderPassList& original_pass_list = |
| 472 original_frame->delegated_frame_data->render_pass_list; | 472 original_frame->delegated_frame_data->render_pass_list; |
| 473 ASSERT_EQ(2u, original_pass_list.size()); | 473 ASSERT_EQ(2u, original_pass_list.size()); |
| 474 DCHECK(original_pass_list[0]->copy_requests.empty()); | 474 DCHECK(original_pass_list[0]->copy_requests.empty()); |
| 475 DCHECK(original_pass_list[1]->copy_requests.empty()); | 475 DCHECK(original_pass_list[1]->copy_requests.empty()); |
| 476 | 476 |
| 477 factory_.Destroy(embedded_surface_id); | 477 factory_.Destroy(embedded_surface_id); |
| 478 } | 478 } |
| 479 | 479 |
| 480 TEST_F(SurfaceAggregatorValidSurfaceTest, UnreferencedSurface) { | |
| 481 SurfaceId embedded_surface_id = allocator_.GenerateId(); | |
| 482 factory_.Create(embedded_surface_id); | |
| 483 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id); | |
| 484 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface)); | |
| 485 | |
| 486 test::Quad embedded_quads[] = {test::Quad::SolidColorQuad(SK_ColorGREEN)}; | |
| 487 test::Pass embedded_passes[] = { | |
| 488 test::Pass(embedded_quads, arraysize(embedded_quads))}; | |
| 489 | |
| 490 SubmitCompositorFrame(embedded_passes, arraysize(embedded_passes), | |
| 491 embedded_surface_id); | |
| 492 scoped_ptr<CopyOutputRequest> copy_request( | |
| 493 CopyOutputRequest::CreateEmptyRequest()); | |
| 494 CopyOutputRequest* copy_request_ptr = copy_request.get(); | |
| 495 factory_.RequestCopyOfSurface(embedded_surface_id, copy_request.Pass()); | |
| 496 | |
| 497 SurfaceId parent_surface_id = allocator_.GenerateId(); | |
| 498 factory_.Create(parent_surface_id); | |
| 499 Surface* parent_surface = manager_.GetSurfaceForId(parent_surface_id); | |
| 500 | |
| 501 test::Quad parent_quads[] = { | |
| 502 test::Quad::SolidColorQuad(SK_ColorWHITE), | |
| 503 test::Quad::SurfaceQuad(embedded_surface_id, 1.f), | |
| 504 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | |
| 505 test::Pass parent_passes[] = { | |
| 506 test::Pass(parent_quads, arraysize(parent_quads))}; | |
| 507 | |
| 508 { | |
| 509 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | |
| 510 AddPasses(&frame_data->render_pass_list, gfx::Rect(SurfaceSize()), | |
| 511 parent_passes, arraysize(parent_passes)); | |
| 512 | |
| 513 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | |
| 514 frame->delegated_frame_data = frame_data.Pass(); | |
| 515 frame->metadata.referenced_surfaces.push_back(embedded_surface_id); | |
| 516 | |
| 517 factory_.SubmitCompositorFrame(parent_surface_id, frame.Pass(), | |
| 518 SurfaceFactory::DrawCallback()); | |
| 519 } | |
| 520 | |
| 521 test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), | |
| 522 test::Quad::SolidColorQuad(SK_ColorBLACK)}; | |
| 523 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; | |
| 524 | |
| 525 { | |
| 526 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | |
| 527 AddPasses(&frame_data->render_pass_list, gfx::Rect(SurfaceSize()), | |
| 528 root_passes, arraysize(root_passes)); | |
| 529 | |
| 530 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | |
| 531 frame->delegated_frame_data = frame_data.Pass(); | |
| 532 frame->metadata.referenced_surfaces.push_back(parent_surface_id); | |
| 533 | |
| 534 factory_.SubmitCompositorFrame(root_surface_id_, frame.Pass(), | |
| 535 SurfaceFactory::DrawCallback()); | |
| 536 } | |
| 537 | |
| 538 EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_)); | |
| 539 EXPECT_FALSE(surface_aggregator_client_.HasSurface(parent_surface)); | |
| 540 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface)); | |
| 541 | |
| 542 scoped_ptr<CompositorFrame> aggregated_frame = | |
| 543 aggregator_.Aggregate(root_surface_id_); | |
| 544 | |
| 545 EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_)); | |
| 546 EXPECT_TRUE(surface_aggregator_client_.HasSurface(parent_surface)); | |
| 547 EXPECT_TRUE(surface_aggregator_client_.HasSurface(embedded_surface)); | |
| 548 | |
| 549 ASSERT_TRUE(aggregated_frame); | |
| 550 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | |
| 551 | |
| 552 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | |
| 553 | |
| 554 // First pass should come from surface that had a copy request but was not | |
| 555 // referenced directly. The second pass comes from the root surface. | |
| 556 // parent_quad should be ignored because it is neither referenced through a | |
| 557 // SurfaceDrawQuad nor has a copy request on it. | |
| 558 test::Pass expected_passes[] = { | |
| 559 test::Pass(embedded_quads, arraysize(embedded_quads)), | |
| 560 test::Pass(root_quads, arraysize(root_quads))}; | |
| 561 TestPassesMatchExpectations(expected_passes, arraysize(expected_passes), | |
| 562 &frame_data->render_pass_list); | |
| 563 ASSERT_EQ(2u, frame_data->render_pass_list.size()); | |
| 564 ASSERT_EQ(1u, frame_data->render_pass_list[0]->copy_requests.size()); | |
| 565 DCHECK_EQ(copy_request_ptr, | |
| 566 frame_data->render_pass_list[0]->copy_requests[0].get()); | |
| 567 | |
| 568 SurfaceId surface_ids[] = {root_surface_id_, parent_surface_id, | |
| 569 embedded_surface_id}; | |
| 570 EXPECT_EQ(arraysize(surface_ids), | |
| 571 aggregator_.previous_contained_surfaces().size()); | |
| 572 for (size_t i = 0; i < arraysize(surface_ids); i++) { | |
| 573 EXPECT_TRUE( | |
| 574 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != | |
| 575 aggregator_.previous_contained_surfaces().end()); | |
| 576 } | |
| 577 | |
| 578 factory_.Destroy(parent_surface_id); | |
| 579 factory_.Destroy(embedded_surface_id); | |
| 580 } | |
| 581 | |
| 582 // This tests referencing a surface that has multiple render passes. | 480 // This tests referencing a surface that has multiple render passes. |
| 583 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { | 481 TEST_F(SurfaceAggregatorValidSurfaceTest, MultiPassSurfaceReference) { |
| 584 SurfaceId embedded_surface_id = child_allocator_.GenerateId(); | 482 SurfaceId embedded_surface_id = child_allocator_.GenerateId(); |
| 585 factory_.Create(embedded_surface_id); | 483 factory_.Create(embedded_surface_id); |
| 586 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id); | 484 Surface* embedded_surface = manager_.GetSurfaceForId(embedded_surface_id); |
| 587 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface)); | 485 EXPECT_FALSE(surface_aggregator_client_.HasSurface(embedded_surface)); |
| 588 | 486 |
| 589 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), | 487 RenderPassId pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), |
| 590 RenderPassId(1, 3)}; | 488 RenderPassId(1, 3)}; |
| 591 | 489 |
| (...skipping 1510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2102 EXPECT_EQ(9u, pass_list->back()->quad_list.size()); | 2000 EXPECT_EQ(9u, pass_list->back()->quad_list.size()); |
| 2103 | 2001 |
| 2104 factory.Destroy(root_surface_id); | 2002 factory.Destroy(root_surface_id); |
| 2105 factory.Destroy(child_surface_id); | 2003 factory.Destroy(child_surface_id); |
| 2106 factory.Destroy(middle_surface_id); | 2004 factory.Destroy(middle_surface_id); |
| 2107 } | 2005 } |
| 2108 | 2006 |
| 2109 } // namespace | 2007 } // namespace |
| 2110 } // namespace cc | 2008 } // namespace cc |
| 2111 | 2009 |
| OLD | NEW |