| 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/region.h" |
| 6 #include "cc/base/scoped_ptr_vector.h" | 6 #include "cc/base/scoped_ptr_vector.h" |
| 7 #include "cc/output/compositor_frame_metadata.h" | 7 #include "cc/output/compositor_frame_metadata.h" |
| 8 #include "cc/output/gl_renderer.h" | 8 #include "cc/output/gl_renderer.h" |
| 9 #include "cc/output/output_surface.h" | 9 #include "cc/output/output_surface.h" |
| 10 #include "cc/output/output_surface_client.h" | 10 #include "cc/output/output_surface_client.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 strategies->push_back(scoped_ptr<OverlayProcessor::Strategy>( | 62 strategies->push_back(scoped_ptr<OverlayProcessor::Strategy>( |
| 63 new OverlayStrategyCommon(this, new OverlayStrategySingleOnTop))); | 63 new OverlayStrategyCommon(this, new OverlayStrategySingleOnTop))); |
| 64 strategies->push_back(scoped_ptr<OverlayProcessor::Strategy>( | 64 strategies->push_back(scoped_ptr<OverlayProcessor::Strategy>( |
| 65 new OverlayStrategyCommon(this, new OverlayStrategyUnderlay))); | 65 new OverlayStrategyCommon(this, new OverlayStrategyUnderlay))); |
| 66 } | 66 } |
| 67 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { | 67 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { |
| 68 ASSERT_EQ(2U, surfaces->size()); | 68 ASSERT_EQ(2U, surfaces->size()); |
| 69 | 69 |
| 70 OverlayCandidate& candidate = surfaces->back(); | 70 OverlayCandidate& candidate = surfaces->back(); |
| 71 if (candidate.display_rect.width() == 64) { | 71 if (candidate.display_rect.width() == 64) { |
| 72 EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect); | 72 EXPECT_EQ(gfx::RectF(kOverlayBottomRightRect), candidate.display_rect); |
| 73 } else { | 73 } else { |
| 74 EXPECT_NEAR(kOverlayRect.x(), candidate.display_rect.x(), 0.01f); | 74 EXPECT_NEAR(kOverlayRect.x(), candidate.display_rect.x(), 0.01f); |
| 75 EXPECT_NEAR(kOverlayRect.y(), candidate.display_rect.y(), 0.01f); | 75 EXPECT_NEAR(kOverlayRect.y(), candidate.display_rect.y(), 0.01f); |
| 76 EXPECT_NEAR(kOverlayRect.width(), candidate.display_rect.width(), 0.01f); | 76 EXPECT_NEAR(kOverlayRect.width(), candidate.display_rect.width(), 0.01f); |
| 77 EXPECT_NEAR(kOverlayRect.height(), candidate.display_rect.height(), | 77 EXPECT_NEAR(kOverlayRect.height(), candidate.display_rect.height(), |
| 78 0.01f); | 78 0.01f); |
| 79 } | 79 } |
| 80 EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(), | 80 EXPECT_FLOAT_RECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight), |
| 81 candidate.uv_rect.ToString()); | 81 candidate.uv_rect); |
| 82 candidate.overlay_handled = true; | 82 candidate.overlay_handled = true; |
| 83 } | 83 } |
| 84 }; | 84 }; |
| 85 | 85 |
| 86 class SandwichOverlayValidator : public OverlayCandidateValidator { | 86 class SandwichOverlayValidator : public OverlayCandidateValidator { |
| 87 public: | 87 public: |
| 88 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 88 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
| 89 strategies->push_back(scoped_ptr<OverlayProcessor::Strategy>( | 89 strategies->push_back(scoped_ptr<OverlayProcessor::Strategy>( |
| 90 new OverlayStrategyCommon(this, new OverlayStrategySandwich))); | 90 new OverlayStrategyCommon(this, new OverlayStrategySandwich))); |
| 91 } | 91 } |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 // Check that the quad is gone. | 462 // Check that the quad is gone. |
| 463 EXPECT_EQ(3U, main_pass->quad_list.size()); | 463 EXPECT_EQ(3U, main_pass->quad_list.size()); |
| 464 const QuadList& quad_list = main_pass->quad_list; | 464 const QuadList& quad_list = main_pass->quad_list; |
| 465 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); | 465 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); |
| 466 it != quad_list.BackToFrontEnd(); ++it) { | 466 it != quad_list.BackToFrontEnd(); ++it) { |
| 467 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); | 467 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); |
| 468 } | 468 } |
| 469 | 469 |
| 470 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); | 470 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); |
| 471 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); | 471 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); |
| 472 EXPECT_EQ(gfx::Rect(32, 32, 32, 32), candidate_list[1].display_rect); | 472 EXPECT_EQ(gfx::RectF(32.f, 32.f, 32.f, 32.f), candidate_list[1].display_rect); |
| 473 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); | 473 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); |
| 474 EXPECT_EQ(gfx::Rect(32, 32, 16, 16), candidate_list[2].display_rect); | 474 EXPECT_EQ(gfx::RectF(32.f, 32.f, 16.f, 16.f), candidate_list[2].display_rect); |
| 475 EXPECT_EQ(gfx::RectF(32. / 256, 32. / 256, 16. / 256, 16. / 256), | 475 EXPECT_EQ(gfx::RectF(32.f / 256.f, 32.f / 256.f, 16.f / 256.f, 16.f / 256.f), |
| 476 candidate_list[2].uv_rect); | 476 candidate_list[2].uv_rect); |
| 477 } | 477 } |
| 478 | 478 |
| 479 TEST_F(SandwichTest, GrowTopOverlayForToAlignWithDIP) { | 479 TEST_F(SandwichTest, GrowTopOverlayForToAlignWithDIP) { |
| 480 output_surface_->SetScaleFactor(2); | 480 output_surface_->SetScaleFactor(2); |
| 481 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 481 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 482 | 482 |
| 483 // The opaque quad on top is not DIP aligned, so it should be enlarged to | 483 // The opaque quad on top is not DIP aligned, so it should be enlarged to |
| 484 // include the surrounding DIP. | 484 // include the surrounding DIP. |
| 485 CreateOpaqueQuadAt(resource_provider_.get(), | 485 CreateOpaqueQuadAt(resource_provider_.get(), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 507 RenderPass* main_pass = pass_list.back(); | 507 RenderPass* main_pass = pass_list.back(); |
| 508 EXPECT_EQ(3U, main_pass->quad_list.size()); | 508 EXPECT_EQ(3U, main_pass->quad_list.size()); |
| 509 const QuadList& quad_list = main_pass->quad_list; | 509 const QuadList& quad_list = main_pass->quad_list; |
| 510 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); | 510 for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin(); |
| 511 it != quad_list.BackToFrontEnd(); ++it) { | 511 it != quad_list.BackToFrontEnd(); ++it) { |
| 512 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); | 512 EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material); |
| 513 } | 513 } |
| 514 | 514 |
| 515 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); | 515 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); |
| 516 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); | 516 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); |
| 517 EXPECT_EQ(gfx::Rect(32, 32, 32, 32), candidate_list[1].display_rect); | 517 EXPECT_EQ(gfx::RectF(32.f, 32.f, 32.f, 32.f), candidate_list[1].display_rect); |
| 518 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); | 518 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); |
| 519 EXPECT_EQ(gfx::Rect(32, 32, 18, 18), candidate_list[2].display_rect); | 519 EXPECT_EQ(gfx::RectF(32.f, 32.f, 18.f, 18.f), candidate_list[2].display_rect); |
| 520 EXPECT_EQ(gfx::RectF(32. / 256, 32. / 256, 18. / 256, 18. / 256), | 520 EXPECT_EQ(gfx::RectF(32.f / 256.f, 32.f / 256.f, 18.f / 256.f, 18.f / 256.f), |
| 521 candidate_list[2].uv_rect); | 521 candidate_list[2].uv_rect); |
| 522 } | 522 } |
| 523 | 523 |
| 524 TEST_F(SandwichTest, MisalignedOverlay) { | 524 TEST_F(SandwichTest, MisalignedOverlay) { |
| 525 output_surface_->SetScaleFactor(2); | 525 output_surface_->SetScaleFactor(2); |
| 526 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 526 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| 527 | 527 |
| 528 // We can't create an overlay for a candidate that is not DIP aligned. | 528 // We can't create an overlay for a candidate that is not DIP aligned. |
| 529 CreateCandidateQuadAt(resource_provider_.get(), | 529 CreateCandidateQuadAt(resource_provider_.get(), |
| 530 pass->shared_quad_state_list.back(), pass.get(), | 530 pass->shared_quad_state_list.back(), pass.get(), |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 SolidColorDrawQuad::MaterialCast(*it); | 594 SolidColorDrawQuad::MaterialCast(*it); |
| 595 if (solid_color_quad->color == SK_ColorTRANSPARENT) | 595 if (solid_color_quad->color == SK_ColorTRANSPARENT) |
| 596 transparent_quad_region.Union(solid_color_quad->rect); | 596 transparent_quad_region.Union(solid_color_quad->rect); |
| 597 } | 597 } |
| 598 } | 598 } |
| 599 DCHECK(covered_region == transparent_quad_region); | 599 DCHECK(covered_region == transparent_quad_region); |
| 600 | 600 |
| 601 // Check that overlays cover the same region that the quads covered. | 601 // Check that overlays cover the same region that the quads covered. |
| 602 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); | 602 EXPECT_FALSE(candidate_list[0].use_output_surface_for_resource); |
| 603 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); | 603 EXPECT_EQ(candidate_id, candidate_list[1].resource_id); |
| 604 EXPECT_EQ(gfx::Rect(0, 0, 64, 64), candidate_list[1].display_rect); | 604 EXPECT_EQ(gfx::RectF(64.f, 64.f), candidate_list[1].display_rect); |
| 605 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); | 605 EXPECT_TRUE(candidate_list[2].use_output_surface_for_resource); |
| 606 EXPECT_TRUE(candidate_list[3].use_output_surface_for_resource); | 606 EXPECT_TRUE(candidate_list[3].use_output_surface_for_resource); |
| 607 Region overlay_region; | 607 Region overlay_region; |
| 608 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[2].display_rect)); | 608 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[2].display_rect)); |
| 609 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[3].display_rect)); | 609 overlay_region.Union(gfx::ToEnclosingRect(candidate_list[3].display_rect)); |
| 610 DCHECK(covered_region == overlay_region); | 610 DCHECK(covered_region == overlay_region); |
| 611 } | 611 } |
| 612 | 612 |
| 613 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { | 613 TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { |
| 614 scoped_ptr<RenderPass> pass = CreateRenderPass(); | 614 scoped_ptr<RenderPass> pass = CreateRenderPass(); |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1550 renderer_->BeginDrawingFrame(&frame_no_overlays); | 1550 renderer_->BeginDrawingFrame(&frame_no_overlays); |
| 1551 renderer_->FinishDrawingFrame(&frame_no_overlays); | 1551 renderer_->FinishDrawingFrame(&frame_no_overlays); |
| 1552 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); | 1552 EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1)); |
| 1553 SwapBuffers(); | 1553 SwapBuffers(); |
| 1554 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); | 1554 EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1)); |
| 1555 Mock::VerifyAndClearExpectations(&scheduler_); | 1555 Mock::VerifyAndClearExpectations(&scheduler_); |
| 1556 } | 1556 } |
| 1557 | 1557 |
| 1558 } // namespace | 1558 } // namespace |
| 1559 } // namespace cc | 1559 } // namespace cc |
| OLD | NEW |