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, |