| Index: cc/output/overlay_unittest.cc
|
| diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
|
| index d36d1db3ab95e42094fe61cdde3ab68f1e7b7e0e..433f36470ab9731f3b0fd8c7480f5126122b12bd 100644
|
| --- a/cc/output/overlay_unittest.cc
|
| +++ b/cc/output/overlay_unittest.cc
|
| @@ -73,6 +73,7 @@ class FullscreenOverlayValidator : public OverlayCandidateValidator {
|
| strategies->push_back(base::MakeUnique<OverlayStrategyFullscreen>(this));
|
| }
|
| bool AllowCALayerOverlays() override { return false; }
|
| + bool AllowDCLayerOverlays() override { return false; }
|
| void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
|
| };
|
|
|
| @@ -85,6 +86,7 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
|
| strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
|
| }
|
| bool AllowCALayerOverlays() override { return false; }
|
| + bool AllowDCLayerOverlays() 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.
|
| @@ -118,6 +120,15 @@ class CALayerValidator : public OverlayCandidateValidator {
|
| public:
|
| void GetStrategies(OverlayProcessor::StrategyList* strategies) override {}
|
| bool AllowCALayerOverlays() override { return true; }
|
| + bool AllowDCLayerOverlays() override { return false; }
|
| + void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
|
| +};
|
| +
|
| +class DCLayerValidator : public OverlayCandidateValidator {
|
| + public:
|
| + void GetStrategies(OverlayProcessor::StrategyList* strategies) override {}
|
| + bool AllowCALayerOverlays() override { return false; }
|
| + bool AllowDCLayerOverlays() override { return true; }
|
| void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
|
| };
|
|
|
| @@ -321,6 +332,28 @@ StreamVideoDrawQuad* CreateFullscreenCandidateVideoQuad(
|
| transform);
|
| }
|
|
|
| +YUVVideoDrawQuad* CreateFullscreenCandidateYUVVideoQuad(
|
| + ResourceProvider* resource_provider,
|
| + const SharedQuadState* shared_quad_state,
|
| + RenderPass* render_pass) {
|
| + gfx::RectF tex_coord_rect(0, 0, 1, 1);
|
| + gfx::Rect rect = render_pass->output_rect;
|
| + gfx::Size resource_size_in_pixels = rect.size();
|
| + bool is_overlay_candidate = true;
|
| + ResourceId resource_id = CreateResource(
|
| + resource_provider, resource_size_in_pixels, is_overlay_candidate);
|
| +
|
| + YUVVideoDrawQuad* overlay_quad =
|
| + render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
|
| + overlay_quad->SetNew(shared_quad_state, rect, rect, rect, tex_coord_rect,
|
| + tex_coord_rect, resource_size_in_pixels,
|
| + resource_size_in_pixels, resource_id, resource_id,
|
| + resource_id, resource_id, YUVVideoDrawQuad::REC_601,
|
| + gfx::ColorSpace(), 0, 1.0, 8);
|
| +
|
| + return overlay_quad;
|
| +}
|
| +
|
| void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
|
| const SharedQuadState* shared_quad_state,
|
| RenderPass* render_pass,
|
| @@ -414,6 +447,7 @@ using SingleOverlayOnTopTest = OverlayTest<SingleOnTopOverlayValidator>;
|
| using UnderlayTest = OverlayTest<UnderlayOverlayValidator>;
|
| using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>;
|
| using CALayerOverlayTest = OverlayTest<CALayerValidator>;
|
| +using DCLayerOverlayTest = OverlayTest<DCLayerValidator>;
|
|
|
| TEST(OverlayTest, NoOverlaysByDefault) {
|
| scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
|
| @@ -1639,6 +1673,116 @@ TEST_F(CALayerOverlayTest, SkipTransparent) {
|
| EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
|
| }
|
|
|
| +TEST_F(DCLayerOverlayTest, AllowNonAxisAlignedTransform) {
|
| + std::unique_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| + pass->shared_quad_state_list.back()
|
| + ->quad_to_target_transform.RotateAboutZAxis(45.f);
|
| +
|
| + gfx::Rect damage_rect;
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list;
|
| + RenderPassFilterList render_pass_filters;
|
| + RenderPassFilterList render_pass_background_filters;
|
| + damage_rect_ = gfx::Rect(1, 1, 10, 10);
|
| + overlay_processor_->ProcessForOverlays(
|
| + resource_provider_.get(), pass.get(), render_pass_filters,
|
| + render_pass_background_filters, &overlay_list, &ca_layer_list,
|
| + &damage_rect_, &content_bounds_);
|
| + EXPECT_EQ(gfx::Rect(), damage_rect);
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.back().shared_state->sorting_context_id);
|
| + EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
|
| + EXPECT_EQ(gfx::Rect(1, 1, 10, 10), damage_rect_);
|
| +}
|
| +
|
| +TEST_F(DCLayerOverlayTest, Occluded) {
|
| + {
|
| + std::unique_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateOpaqueQuadAt(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(), pass.get(),
|
| + gfx::Rect(0, 2, 100, 100), SK_ColorWHITE);
|
| + CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| +
|
| + gfx::Rect damage_rect;
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list;
|
| + RenderPassFilterList render_pass_filters;
|
| + RenderPassFilterList render_pass_background_filters;
|
| + damage_rect_ = gfx::Rect(1, 1, 10, 10);
|
| + overlay_processor_->ProcessForOverlays(
|
| + resource_provider_.get(), pass.get(), render_pass_filters,
|
| + render_pass_background_filters, &overlay_list, &ca_layer_list,
|
| + &damage_rect_, &content_bounds_);
|
| + EXPECT_EQ(gfx::Rect(), damage_rect);
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.size());
|
| + EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
|
| + EXPECT_EQ(static_cast<unsigned>(-1),
|
| + ca_layer_list.back().shared_state->sorting_context_id);
|
| + // Entire underlay rect must be redrawn.
|
| + EXPECT_EQ(gfx::Rect(0, 0, 256, 256), damage_rect_);
|
| + }
|
| + {
|
| + std::unique_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateOpaqueQuadAt(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(), pass.get(),
|
| + gfx::Rect(2, 2, 100, 100), SK_ColorWHITE);
|
| + CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| +
|
| + gfx::Rect damage_rect;
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list;
|
| + RenderPassFilterList render_pass_filters;
|
| + RenderPassFilterList render_pass_background_filters;
|
| + damage_rect_ = gfx::Rect(1, 1, 10, 10);
|
| + overlay_processor_->ProcessForOverlays(
|
| + resource_provider_.get(), pass.get(), render_pass_filters,
|
| + render_pass_background_filters, &overlay_list, &ca_layer_list,
|
| + &damage_rect_, &content_bounds_);
|
| + EXPECT_EQ(gfx::Rect(), damage_rect);
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.size());
|
| + EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
|
| + EXPECT_EQ(static_cast<unsigned>(-1),
|
| + ca_layer_list.back().shared_state->sorting_context_id);
|
| + // The underlay rectangle is the same, so the damage is contained within
|
| + // the combined occluding rects for this and the last frame.
|
| + EXPECT_EQ(gfx::Rect(1, 2, 10, 9), damage_rect_);
|
| + }
|
| +}
|
| +
|
| +TEST_F(DCLayerOverlayTest, DamageRect) {
|
| + std::unique_ptr<RenderPass> pass = CreateRenderPass();
|
| + CreateFullscreenCandidateYUVVideoQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back(),
|
| + pass.get());
|
| +
|
| + gfx::Rect damage_rect;
|
| + CALayerOverlayList ca_layer_list;
|
| + OverlayCandidateList overlay_list;
|
| + RenderPassFilterList render_pass_filters;
|
| + RenderPassFilterList render_pass_background_filters;
|
| + damage_rect_ = gfx::Rect(1, 1, 10, 10);
|
| + overlay_processor_->ProcessForOverlays(
|
| + resource_provider_.get(), pass.get(), render_pass_filters,
|
| + render_pass_background_filters, &overlay_list, &ca_layer_list,
|
| + &damage_rect_, &content_bounds_);
|
| + EXPECT_EQ(gfx::Rect(), damage_rect);
|
| + EXPECT_EQ(0U, overlay_list.size());
|
| + EXPECT_EQ(1U, ca_layer_list.size());
|
| + EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
|
| + EXPECT_EQ(1U, ca_layer_list.back().shared_state->sorting_context_id);
|
| + EXPECT_TRUE(damage_rect_.IsEmpty());
|
| +}
|
| +
|
| class OverlayInfoRendererGL : public GLRenderer {
|
| public:
|
| OverlayInfoRendererGL(const RendererSettings* settings,
|
|
|