| 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/base/region.h" |
| 5 #include "cc/base/scoped_ptr_vector.h" | 6 #include "cc/base/scoped_ptr_vector.h" |
| 6 #include "cc/output/compositor_frame_metadata.h" | 7 #include "cc/output/compositor_frame_metadata.h" |
| 7 #include "cc/output/gl_renderer.h" | 8 #include "cc/output/gl_renderer.h" |
| 8 #include "cc/output/output_surface.h" | 9 #include "cc/output/output_surface.h" |
| 9 #include "cc/output/output_surface_client.h" | 10 #include "cc/output/output_surface_client.h" |
| 10 #include "cc/output/overlay_candidate_validator.h" | 11 #include "cc/output/overlay_candidate_validator.h" |
| 11 #include "cc/output/overlay_processor.h" | 12 #include "cc/output/overlay_processor.h" |
| 12 #include "cc/output/overlay_strategy_sandwich.h" | 13 #include "cc/output/overlay_strategy_sandwich.h" |
| 13 #include "cc/output/overlay_strategy_single_on_top.h" | 14 #include "cc/output/overlay_strategy_single_on_top.h" |
| 14 #include "cc/output/overlay_strategy_underlay.h" | 15 #include "cc/output/overlay_strategy_underlay.h" |
| 15 #include "cc/quads/render_pass.h" | 16 #include "cc/quads/render_pass.h" |
| 16 #include "cc/quads/solid_color_draw_quad.h" | 17 #include "cc/quads/solid_color_draw_quad.h" |
| 17 #include "cc/quads/stream_video_draw_quad.h" | 18 #include "cc/quads/stream_video_draw_quad.h" |
| 18 #include "cc/quads/texture_draw_quad.h" | 19 #include "cc/quads/texture_draw_quad.h" |
| 19 #include "cc/resources/resource_provider.h" | 20 #include "cc/resources/resource_provider.h" |
| 20 #include "cc/resources/texture_mailbox.h" | 21 #include "cc/resources/texture_mailbox.h" |
| 21 #include "cc/test/fake_output_surface_client.h" | 22 #include "cc/test/fake_output_surface_client.h" |
| 22 #include "cc/test/fake_resource_provider.h" | 23 #include "cc/test/fake_resource_provider.h" |
| 23 #include "cc/test/geometry_test_utils.h" | 24 #include "cc/test/geometry_test_utils.h" |
| 24 #include "cc/test/test_context_provider.h" | 25 #include "cc/test/test_context_provider.h" |
| 25 #include "cc/test/test_shared_bitmap_manager.h" | 26 #include "cc/test/test_shared_bitmap_manager.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 #include "ui/gfx/geometry/rect_conversions.h" |
| 28 | 30 |
| 29 using testing::_; | 31 using testing::_; |
| 30 using testing::Mock; | 32 using testing::Mock; |
| 31 | 33 |
| 32 namespace cc { | 34 namespace cc { |
| 33 namespace { | 35 namespace { |
| 34 | 36 |
| 35 const gfx::Size kDisplaySize(256, 256); | 37 const gfx::Size kDisplaySize(256, 256); |
| 36 const gfx::Rect kOverlayRect(0, 0, 128, 128); | 38 const gfx::Rect kOverlayRect(0, 0, 128, 128); |
| 37 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); | 39 const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 RenderPassList pass_list; | 537 RenderPassList pass_list; |
| 536 pass_list.push_back(pass.Pass()); | 538 pass_list.push_back(pass.Pass()); |
| 537 | 539 |
| 538 OverlayCandidateList candidate_list; | 540 OverlayCandidateList candidate_list; |
| 539 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); | 541 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 540 | 542 |
| 541 ASSERT_EQ(1U, pass_list.size()); | 543 ASSERT_EQ(1U, pass_list.size()); |
| 542 ASSERT_EQ(0U, candidate_list.size()); | 544 ASSERT_EQ(0U, candidate_list.size()); |
| 543 } | 545 } |
| 544 | 546 |
| 547 TEST_F(SandwichTest, MultiQuadOverlay) { |
| 548 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 549 |
| 550 // Put two non-intersecting quads on top. |
| 551 const gfx::Rect rect1(gfx::Rect(0, 0, 32, 32)); |
| 552 const gfx::Rect rect2(gfx::Rect(32, 32, 32, 32)); |
| 553 Region covered_region; |
| 554 covered_region.Union(rect1); |
| 555 covered_region.Union(rect2); |
| 556 CreateOpaqueQuadAt(resource_provider_.get(), |
| 557 pass->shared_quad_state_list.back(), pass.get(), rect1); |
| 558 CreateOpaqueQuadAt(resource_provider_.get(), |
| 559 pass->shared_quad_state_list.back(), pass.get(), rect2); |
| 560 |
| 561 // Then a candidate that we'll turn into an overlay. |
| 562 unsigned candidate_id = |
| 563 CreateCandidateQuadAt(resource_provider_.get(), |
| 564 pass->shared_quad_state_list.back(), pass.get(), |
| 565 gfx::Rect(0, 0, 64, 64)) |
| 566 ->resource_id(); |
| 567 |
| 568 // Then some opaque background. |
| 569 CreateOpaqueQuadAt(resource_provider_.get(), |
| 570 pass->shared_quad_state_list.back(), pass.get(), |
| 571 gfx::Rect(kDisplaySize)); |
| 572 |
| 573 RenderPassList pass_list; |
| 574 pass_list.push_back(pass.Pass()); |
| 575 |
| 576 // Run the overlay strategy on that input. |
| 577 RenderPass* main_pass = pass_list.back(); |
| 578 OverlayCandidateList candidate_list; |
| 579 EXPECT_EQ(4U, main_pass->quad_list.size()); |
| 580 overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list); |
| 581 ASSERT_EQ(1U, pass_list.size()); |
| 582 ASSERT_EQ(4U, candidate_list.size()); |
| 583 |
| 584 // Check that the candidate quad is gone and that we now have two transparent |
| 585 // quads for the same region that was covered on the overlay. |
| 586 EXPECT_EQ(5U, main_pass->quad_list.size()); |
| 587 const QuadList& quad_list = main_pass->quad_list; |
| 588 Region transparent_quad_region; |
| 589 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); |
| 590 it != quad_list.BackToFrontEnd(); ++it) { |
| 591 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); |
| 592 if (it->material == DrawQuad::SOLID_COLOR) { |
| 593 const SolidColorDrawQuad* solid_color_quad = |
| 594 SolidColorDrawQuad::MaterialCast(*it); |
| 595 if (solid_color_quad->color == SK_ColorTRANSPARENT) |
| 596 transparent_quad_region.Union(solid_color_quad->rect); |
| 597 } |
| 598 } |
| 599 DCHECK(covered_region == transparent_quad_region); |
| 600 |
| 601 // Check that overlays cover the same region that the quads covered. |
| 602 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); |
| 603 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); |
| 604 EXPECT_EQ(gfx::Rect(0, 0, 64, 64), candidate_list[1].display_rect); |
| 605 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); |
| 606 EXPECT_TRUE(candidate_list[3].use_output_surface_for_resource); |
| 607 Region overlay_region; |
| 608 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[2].display_rect)); |
| 609 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[3].display_rect)); |
| 610 DCHECK(covered_region == overlay_region); |
| 611 } |
| 612 |
| 545 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { | 613 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { |
| 546 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 614 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 547 TextureDrawQuad* original_quad = | 615 TextureDrawQuad* original_quad = |
| 548 CreateFullscreenCandidateQuad(resource_provider_.get(), | 616 CreateFullscreenCandidateQuad(resource_provider_.get(), |
| 549 pass->shared_quad_state_list.back(), | 617 pass->shared_quad_state_list.back(), |
| 550 pass.get()); | 618 pass.get()); |
| 551 unsigned original_resource_id = original_quad->resource_id(); | 619 unsigned original_resource_id = original_quad->resource_id(); |
| 552 | 620 |
| 553 // Add something behind it. | 621 // Add something behind it. |
| 554 CreateFullscreenOpaqueQuad(resource_provider_.get(), | 622 CreateFullscreenOpaqueQuad(resource_provider_.get(), |
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 renderer_->BeginDrawingFrame(&frame3); | 1433 renderer_->BeginDrawingFrame(&frame3); |
| 1366 renderer_->FinishDrawingFrame(&frame3); | 1434 renderer_->FinishDrawingFrame(&frame3); |
| 1367 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 1435 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
| 1368 SwapBuffers(); | 1436 SwapBuffers(); |
| 1369 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 1437 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
| 1370 Mock::VerifyAndClearExpectations(&scheduler_); | 1438 Mock::VerifyAndClearExpectations(&scheduler_); |
| 1371 } | 1439 } |
| 1372 | 1440 |
| 1373 } // namespace | 1441 } // namespace |
| 1374 } // namespace cc | 1442 } // namespace cc |
| OLD | NEW |