| Index: cc/output/overlay_unittest.cc
|
| diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
|
| index dd325bd0c5a26b8ae5d2836542d8c2bceab5704c..29403eea99e009823a575fc53fd47afb9d536073 100644
|
| --- a/cc/output/overlay_unittest.cc
|
| +++ b/cc/output/overlay_unittest.cc
|
| @@ -10,7 +10,6 @@
|
| #include "cc/output/output_surface_client.h"
|
| #include "cc/output/overlay_candidate_validator.h"
|
| #include "cc/output/overlay_processor.h"
|
| -#include "cc/output/overlay_strategy_all_or_nothing.h"
|
| #include "cc/output/overlay_strategy_sandwich.h"
|
| #include "cc/output/overlay_strategy_single_on_top.h"
|
| #include "cc/output/overlay_strategy_underlay.h"
|
| @@ -64,6 +63,7 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
|
| make_scoped_ptr(new OverlayStrategySingleOnTop(this)));
|
| strategies->push_back(make_scoped_ptr(new OverlayStrategyUnderlay(this)));
|
| }
|
| + bool AllowCALayerOverlays() override { return false; }
|
| void CheckOverlaySupport(OverlayCandidateList* surfaces) override {
|
| // We may have 1 or 2 surfaces depending on whether this ran through the
|
| // full renderer and picked up the output surface, or not.
|
| @@ -91,6 +91,13 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
|
| }
|
| };
|
|
|
| +class CALayerValidator : public OverlayCandidateValidator {
|
| + public:
|
| + void GetStrategies(OverlayProcessor::StrategyList* strategies) override {}
|
| + bool AllowCALayerOverlays() override { return true; }
|
| + void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
|
| +};
|
| +
|
| class SingleOnTopOverlayValidator : public SingleOverlayValidator {
|
| public:
|
| void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
|
| @@ -111,18 +118,7 @@ class SandwichOverlayValidator : public OverlayCandidateValidator {
|
| void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
|
| strategies->push_back(make_scoped_ptr(new OverlayStrategySandwich(this)));
|
| }
|
| - void CheckOverlaySupport(OverlayCandidateList* surfaces) override {
|
| - for (OverlayCandidate& candidate : *surfaces)
|
| - candidate.overlay_handled = true;
|
| - }
|
| -};
|
| -
|
| -class AllOrNothingOverlayValidator : public OverlayCandidateValidator {
|
| - public:
|
| - void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
|
| - strategies->push_back(
|
| - make_scoped_ptr(new OverlayStrategyAllOrNothing(this)));
|
| - }
|
| + bool AllowCALayerOverlays() override { return false; }
|
| void CheckOverlaySupport(OverlayCandidateList* surfaces) override {
|
| for (OverlayCandidate& candidate : *surfaces)
|
| candidate.overlay_handled = true;
|
| @@ -370,7 +366,7 @@ class OverlayTest : public testing::Test {
|
| typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest;
|
| typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest;
|
| typedef OverlayTest<SandwichOverlayValidator> SandwichTest;
|
| -typedef OverlayTest<AllOrNothingOverlayValidator> AllOrNothingOverlayTest;
|
| +typedef OverlayTest<CALayerValidator> CALayerOverlayTest;
|
|
|
| TEST(OverlayTest, NoOverlaysByDefault) {
|
| scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
|
| @@ -1327,90 +1323,137 @@ TEST_F(UnderlayTest, DamageRect) {
|
| DCHECK(!damage_rect_.IsEmpty());
|
| }
|
|
|
| -TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) {
|
| - scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| +OverlayCandidateList BackbufferOverlayList(const RenderPass* root_render_pass) {
|
| + OverlayCandidateList list;
|
| + OverlayCandidate output_surface_plane;
|
| + output_surface_plane.display_rect = gfx::RectF(root_render_pass->output_rect);
|
| + output_surface_plane.quad_rect_in_target_space =
|
| + root_render_pass->output_rect;
|
| + output_surface_plane.use_output_surface_for_resource = true;
|
| + output_surface_plane.overlay_handled = true;
|
| + list.push_back(output_surface_plane);
|
| + return list;
|
| +}
|
|
|
| - // Add two overlapping candidates.
|
| - CreateCandidateQuadAt(resource_provider_.get(),
|
| - pass->shared_quad_state_list.back(), pass.get(),
|
| - kOverlayTopLeftRect);
|
| - CreateCandidateQuadAt(resource_provider_.get(),
|
| - pass->shared_quad_state_list.back(), pass.get(),
|
| - kOverlayRect);
|
| +TEST_F(CALayerOverlayTest, AllowNonAxisAlignedTransform) {
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| + pass->shared_quad_state_list.back()
|
| + ->quad_to_target_transform.RotateAboutZAxis(45.f);
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - OverlayCandidateList candidates;
|
| - overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
|
| - &candidates, &damage_rect_);
|
| -
|
| - // Both quads should become overlays.
|
| - EXPECT_EQ(2u, candidates.size());
|
| - EXPECT_EQ(-1, candidates[0].plane_z_order);
|
| - EXPECT_EQ(-2, candidates[1].plane_z_order);
|
| - EXPECT_EQ(gfx::RectF(kOverlayTopLeftRect), candidates[0].display_rect);
|
| - EXPECT_EQ(gfx::RectF(kOverlayRect), candidates[1].display_rect);
|
| -
|
| - // All quads should be gone.
|
| - EXPECT_TRUE(pass_list.back()->quad_list.empty());
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list(BackbufferOverlayList(pass_list.back()));
|
| + overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list,
|
| + &ca_layer_list, &overlay_list);
|
| + ASSERT_EQ(1U, pass_list.size());
|
| + EXPECT_EQ(0U, pass_list.back()->quad_list.size());
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.size());
|
| }
|
|
|
| -TEST_F(AllOrNothingOverlayTest, RejectQuadWithTransform) {
|
| +TEST_F(CALayerOverlayTest, Disallow3DTransform) {
|
| scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| + pass->shared_quad_state_list.back()
|
| + ->quad_to_target_transform.RotateAboutXAxis(45.f);
|
|
|
| - CreateCandidateQuadAt(resource_provider_.get(),
|
| - pass->shared_quad_state_list.back(), pass.get(),
|
| - kOverlayTopLeftRect);
|
| + RenderPassList pass_list;
|
| + pass_list.push_back(pass.Pass());
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list(BackbufferOverlayList(pass_list.back()));
|
| + overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list,
|
| + &ca_layer_list, &overlay_list);
|
| + ASSERT_EQ(1U, pass_list.size());
|
| + EXPECT_EQ(1U, pass_list.back()->quad_list.size());
|
| + EXPECT_EQ(1U, overlay_list.size());
|
| + EXPECT_EQ(0U, ca_layer_list.size());
|
| +}
|
|
|
| - // Add a rotated quad that can't be promoted into overlay.
|
| - SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
|
| - shared_state->opacity = 1.f;
|
| - shared_state->quad_to_target_transform.Rotate(90);
|
| - CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
|
| - kOverlayBottomRightRect);
|
| +TEST_F(CALayerOverlayTest, AllowContainingClip) {
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| + pass->shared_quad_state_list.back()->is_clipped = true;
|
| + pass->shared_quad_state_list.back()->clip_rect = kOverlayRect;
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - OverlayCandidateList candidates;
|
| - overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
|
| - &candidates, &damage_rect_);
|
| -
|
| - // No quads should become overlays.
|
| - EXPECT_EQ(0u, candidates.size());
|
| - EXPECT_EQ(2u, pass_list.back()->quad_list.size());
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list(BackbufferOverlayList(pass_list.back()));
|
| + overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list,
|
| + &ca_layer_list, &overlay_list);
|
| + ASSERT_EQ(1U, pass_list.size());
|
| + EXPECT_EQ(0U, pass_list.back()->quad_list.size());
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.size());
|
| }
|
|
|
| -TEST_F(AllOrNothingOverlayTest, DamageRect) {
|
| +TEST_F(CALayerOverlayTest, SkipDisjointClip) {
|
| scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| CreateFullscreenCandidateQuad(resource_provider_.get(),
|
| pass->shared_quad_state_list.back(),
|
| pass.get());
|
| + pass->shared_quad_state_list.back()->is_clipped = true;
|
| + pass->shared_quad_state_list.back()->clip_rect =
|
| + gfx::Rect(128, 128, 128, 128);
|
|
|
| - damage_rect_ = kOverlayRect;
|
| + RenderPassList pass_list;
|
| + pass_list.push_back(pass.Pass());
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list(BackbufferOverlayList(pass_list.back()));
|
| + overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list,
|
| + &ca_layer_list, &overlay_list);
|
| + ASSERT_EQ(1U, pass_list.size());
|
| + EXPECT_EQ(0U, pass_list.back()->quad_list.size());
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(0U, ca_layer_list.size());
|
| +}
|
|
|
| - // Add something behind it.
|
| - CreateFullscreenOpaqueQuad(resource_provider_.get(),
|
| - pass->shared_quad_state_list.back(), pass.get());
|
| - CreateFullscreenOpaqueQuad(resource_provider_.get(),
|
| - pass->shared_quad_state_list.back(), pass.get());
|
| +TEST_F(CALayerOverlayTest, DisallowNontrivialClip) {
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| + pass->shared_quad_state_list.back()->is_clipped = true;
|
| + pass->shared_quad_state_list.back()->clip_rect = gfx::Rect(64, 64, 128, 128);
|
|
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list(BackbufferOverlayList(pass_list.back()));
|
| + overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list,
|
| + &ca_layer_list, &overlay_list);
|
|
|
| - // Check for potential candidates.
|
| - OverlayCandidateList candidate_list;
|
| + ASSERT_EQ(1U, pass_list.size());
|
| + EXPECT_EQ(1U, pass_list.back()->quad_list.size());
|
| + EXPECT_EQ(1U, overlay_list.size());
|
| + EXPECT_EQ(0U, ca_layer_list.size());
|
| +}
|
|
|
| - // Primary plane.
|
| - OverlayCandidate output_surface_plane;
|
| - output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
|
| - output_surface_plane.quad_rect_in_target_space = kOverlayRect;
|
| - output_surface_plane.use_output_surface_for_resource = true;
|
| - output_surface_plane.overlay_handled = true;
|
| - candidate_list.push_back(output_surface_plane);
|
| +TEST_F(CALayerOverlayTest, SkipTransparent) {
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| + pass->shared_quad_state_list.back()->opacity = 0;
|
|
|
| - overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
|
| - &candidate_list, &damage_rect_);
|
| - DCHECK(!damage_rect_.IsEmpty());
|
| + RenderPassList pass_list;
|
| + pass_list.push_back(pass.Pass());
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list(BackbufferOverlayList(pass_list.back()));
|
| + overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list,
|
| + &ca_layer_list, &overlay_list);
|
| + ASSERT_EQ(1U, pass_list.size());
|
| + EXPECT_EQ(0U, pass_list.back()->quad_list.size());
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(0U, ca_layer_list.size());
|
| }
|
|
|
| class OverlayInfoRendererGL : public GLRenderer {
|
|
|