diff options
author | kalyan.kondapally <kalyan.kondapally@intel.com> | 2015-11-06 14:51:35 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-06 22:52:27 +0000 |
commit | 050e8dff0fd427ab33d8adb9e9b1d12cd2682067 (patch) | |
tree | aa41eaf78b4937d5a98bbbfda5afec16fb696462 | |
parent | 85a785c39f884c6c1134dbff211681eef2863079 (diff) | |
download | chromium_src-050e8dff0fd427ab33d8adb9e9b1d12cd2682067.zip chromium_src-050e8dff0fd427ab33d8adb9e9b1d12cd2682067.tar.gz chromium_src-050e8dff0fd427ab33d8adb9e9b1d12cd2682067.tar.bz2 |
Avoid Copying damage rect when using Overlays
When using Overlays, the damage rect can be completely covered by
the layer being composited by Overlay. We still copy damage rect
on to the current surface(Primary frame buffer) in BufferQueue. This
should be un-necessary.
BUG=370522,548452
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Committed: https://crrev.com/2904998edff0cfcaab43eeb3b1db013d6169bd17
Cr-Commit-Position: refs/heads/master@{#356352}
Committed: https://crrev.com/5ee13b006abdf74d0f6b3fbdde2d936c00ad97e7
Cr-Commit-Position: refs/heads/master@{#356570}
Review URL: https://codereview.chromium.org/1330563004
Cr-Commit-Position: refs/heads/master@{#358434}
-rw-r--r-- | cc/output/direct_renderer.cc | 3 | ||||
-rw-r--r-- | cc/output/gl_renderer_unittest.cc | 9 | ||||
-rw-r--r-- | cc/output/overlay_processor.cc | 7 | ||||
-rw-r--r-- | cc/output/overlay_processor.h | 10 | ||||
-rw-r--r-- | cc/output/overlay_strategy_all_or_nothing.cc | 3 | ||||
-rw-r--r-- | cc/output/overlay_strategy_all_or_nothing.h | 3 | ||||
-rw-r--r-- | cc/output/overlay_strategy_sandwich.cc | 3 | ||||
-rw-r--r-- | cc/output/overlay_strategy_sandwich.h | 3 | ||||
-rw-r--r-- | cc/output/overlay_strategy_single_on_top.cc | 13 | ||||
-rw-r--r-- | cc/output/overlay_strategy_single_on_top.h | 6 | ||||
-rw-r--r-- | cc/output/overlay_strategy_underlay.cc | 3 | ||||
-rw-r--r-- | cc/output/overlay_strategy_underlay.h | 3 | ||||
-rw-r--r-- | cc/output/overlay_unittest.cc | 222 |
13 files changed, 220 insertions, 68 deletions
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc index 03425cf..0a66eea 100644 --- a/cc/output/direct_renderer.cc +++ b/cc/output/direct_renderer.cc @@ -240,7 +240,8 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, // otherwise the framebuffer will be missing the overlay contents. if (root_render_pass->copy_requests.empty()) { overlay_processor_->ProcessForOverlays( - resource_provider_, render_passes_in_draw_order, &frame.overlay_list); + resource_provider_, render_passes_in_draw_order, &frame.overlay_list, + &frame.root_damage_rect); } for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc index 6af531c..92fcd3c 100644 --- a/cc/output/gl_renderer_unittest.cc +++ b/cc/output/gl_renderer_unittest.cc @@ -2014,10 +2014,11 @@ class TestOverlayProcessor : public OverlayProcessor { public: Strategy() {} ~Strategy() override {} - MOCK_METHOD3(Attempt, + MOCK_METHOD4(Attempt, bool(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates)); + OverlayCandidateList* candidates, + gfx::Rect* damage_rect)); }; explicit TestOverlayProcessor(OutputSurface* surface) @@ -2095,7 +2096,7 @@ TEST_F(GLRendererTest, DontOverlayWithCopyRequests) { // added a fake strategy, so checking for Attempt calls checks if there was // any attempt to overlay, which there shouldn't be. We can't use the quad // list because the render pass is cleaned up by DrawFrame. - EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(0); + EXPECT_CALL(*processor->strategy_, Attempt(_, _, _, _)).Times(0); renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, viewport_rect, false); Mock::VerifyAndClearExpectations(processor->strategy_); @@ -2112,7 +2113,7 @@ TEST_F(GLRendererTest, DontOverlayWithCopyRequests) { gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, flipped, nearest_neighbor); - EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(1); + EXPECT_CALL(*processor->strategy_, Attempt(_, _, _, _)).Times(1); renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, viewport_rect, false); } diff --git a/cc/output/overlay_processor.cc b/cc/output/overlay_processor.cc index 69368a1..a97623a 100644 --- a/cc/output/overlay_processor.cc +++ b/cc/output/overlay_processor.cc @@ -27,10 +27,13 @@ OverlayProcessor::~OverlayProcessor() {} void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates) { + OverlayCandidateList* candidates, + gfx::Rect* damage_rect) { for (auto strategy : strategies_) { - if (strategy->Attempt(resource_provider, render_passes, candidates)) + if (strategy->Attempt(resource_provider, render_passes, candidates, + damage_rect)) { return; + } } } diff --git a/cc/output/overlay_processor.h b/cc/output/overlay_processor.h index 48ffe6b..26bfe16 100644 --- a/cc/output/overlay_processor.h +++ b/cc/output/overlay_processor.h @@ -23,10 +23,13 @@ class CC_EXPORT OverlayProcessor { // Returns false if the strategy cannot be made to work with the // current set of render passes. Returns true if the strategy was successful // and adds any additional passes necessary to represent overlays to - // |render_passes|. + // |render_passes|. Strategy can also optimize |damage_rect| as it seems + // fit to reduce GL composition, in case |damage_rect| is obscured by + // overlays. virtual bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates) = 0; + OverlayCandidateList* candidates, + gfx::Rect* damage_rect) = 0; }; typedef ScopedPtrVector<Strategy> StrategyList; @@ -37,7 +40,8 @@ class CC_EXPORT OverlayProcessor { void ProcessForOverlays(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates); + OverlayCandidateList* candidates, + gfx::Rect* damage_rect); protected: StrategyList strategies_; diff --git a/cc/output/overlay_strategy_all_or_nothing.cc b/cc/output/overlay_strategy_all_or_nothing.cc index 40c58cd..8181e29 100644 --- a/cc/output/overlay_strategy_all_or_nothing.cc +++ b/cc/output/overlay_strategy_all_or_nothing.cc @@ -19,7 +19,8 @@ OverlayStrategyAllOrNothing::~OverlayStrategyAllOrNothing() {} bool OverlayStrategyAllOrNothing::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates) { + OverlayCandidateList* candidates, + gfx::Rect* damage_rect) { QuadList& quad_list = render_passes->back()->quad_list; OverlayCandidateList new_candidates; int next_z_order = -1; diff --git a/cc/output/overlay_strategy_all_or_nothing.h b/cc/output/overlay_strategy_all_or_nothing.h index 94d88f0..23d2aa3 100644 --- a/cc/output/overlay_strategy_all_or_nothing.h +++ b/cc/output/overlay_strategy_all_or_nothing.h @@ -22,7 +22,8 @@ class CC_EXPORT OverlayStrategyAllOrNothing bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) override; + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) override; private: OverlayCandidateValidator* capability_checker_; // Weak. diff --git a/cc/output/overlay_strategy_sandwich.cc b/cc/output/overlay_strategy_sandwich.cc index 79279ad..cacb696 100644 --- a/cc/output/overlay_strategy_sandwich.cc +++ b/cc/output/overlay_strategy_sandwich.cc @@ -42,7 +42,8 @@ OverlayStrategySandwich::~OverlayStrategySandwich() {} bool OverlayStrategySandwich::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) { + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) { QuadList& quad_list = render_passes->back()->quad_list; for (auto it = quad_list.begin(); it != quad_list.end();) { OverlayCandidate candidate; diff --git a/cc/output/overlay_strategy_sandwich.h b/cc/output/overlay_strategy_sandwich.h index 076ea9d..0bdd2d2 100644 --- a/cc/output/overlay_strategy_sandwich.h +++ b/cc/output/overlay_strategy_sandwich.h @@ -23,7 +23,8 @@ class CC_EXPORT OverlayStrategySandwich : public OverlayProcessor::Strategy { bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) override; + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) override; private: QuadList::Iterator TryOverlay(RenderPass* render_pass, diff --git a/cc/output/overlay_strategy_single_on_top.cc b/cc/output/overlay_strategy_single_on_top.cc index ca254b2..7a35d1d 100644 --- a/cc/output/overlay_strategy_single_on_top.cc +++ b/cc/output/overlay_strategy_single_on_top.cc @@ -7,6 +7,7 @@ #include "cc/base/math_util.h" #include "cc/output/overlay_candidate_validator.h" #include "cc/quads/draw_quad.h" +#include "ui/gfx/geometry/rect_conversions.h" namespace cc { @@ -20,12 +21,13 @@ OverlayStrategySingleOnTop::~OverlayStrategySingleOnTop() {} bool OverlayStrategySingleOnTop::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) { + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) { QuadList* quad_list = &render_passes->back()->quad_list; for (auto it = quad_list->begin(); it != quad_list->end(); ++it) { OverlayCandidate candidate; if (OverlayCandidate::FromDrawQuad(resource_provider, *it, &candidate) && - TryOverlay(quad_list, candidate_list, candidate, it)) { + TryOverlay(quad_list, candidate_list, candidate, it, damage_rect)) { return true; } } @@ -37,7 +39,8 @@ bool OverlayStrategySingleOnTop::TryOverlay( QuadList* quad_list, OverlayCandidateList* candidate_list, const OverlayCandidate& candidate, - QuadList::Iterator candidate_iterator) { + QuadList::Iterator candidate_iterator, + gfx::Rect* damage_rect) { // Check that no prior quads overlap it. for (auto overlap_iter = quad_list->cbegin(); overlap_iter != candidate_iterator; ++overlap_iter) { @@ -57,10 +60,12 @@ bool OverlayStrategySingleOnTop::TryOverlay( // Check for support. capability_checker_->CheckOverlaySupport(&new_candidate_list); + const OverlayCandidate& overlay_candidate = new_candidate_list.back(); // If the candidate can be handled by an overlay, create a pass for it. - if (new_candidate_list.back().overlay_handled) { + if (overlay_candidate.overlay_handled) { quad_list->EraseAndInvalidateAllPointers(candidate_iterator); candidate_list->swap(new_candidate_list); + damage_rect->Subtract(ToEnclosedRect(overlay_candidate.display_rect)); return true; } diff --git a/cc/output/overlay_strategy_single_on_top.h b/cc/output/overlay_strategy_single_on_top.h index bdf2cc2..29d98de 100644 --- a/cc/output/overlay_strategy_single_on_top.h +++ b/cc/output/overlay_strategy_single_on_top.h @@ -19,13 +19,15 @@ class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy { bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) override; + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) override; private: bool TryOverlay(QuadList* quad_list, OverlayCandidateList* candidate_list, const OverlayCandidate& candidate, - QuadList::Iterator candidate_iterator); + QuadList::Iterator candidate_iterator, + gfx::Rect* damage_rect); OverlayCandidateValidator* capability_checker_; // Weak. diff --git a/cc/output/overlay_strategy_underlay.cc b/cc/output/overlay_strategy_underlay.cc index 9a8a362..5f3f907 100644 --- a/cc/output/overlay_strategy_underlay.cc +++ b/cc/output/overlay_strategy_underlay.cc @@ -20,7 +20,8 @@ OverlayStrategyUnderlay::~OverlayStrategyUnderlay() {} bool OverlayStrategyUnderlay::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) { + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) { QuadList& quad_list = render_passes->back()->quad_list; for (auto it = quad_list.begin(); it != quad_list.end(); ++it) { OverlayCandidate candidate; diff --git a/cc/output/overlay_strategy_underlay.h b/cc/output/overlay_strategy_underlay.h index f276c1c..ac20051 100644 --- a/cc/output/overlay_strategy_underlay.h +++ b/cc/output/overlay_strategy_underlay.h @@ -24,7 +24,8 @@ class CC_EXPORT OverlayStrategyUnderlay : public OverlayProcessor::Strategy { bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list) override; + OverlayCandidateList* candidate_list, + gfx::Rect* damage_rect) override; private: OverlayCandidateValidator* capability_checker_; // Weak. diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc index 824b7fe..8c9efc7 100644 --- a/cc/output/overlay_unittest.cc +++ b/cc/output/overlay_unittest.cc @@ -364,6 +364,7 @@ class OverlayTest : public testing::Test { scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; scoped_ptr<ResourceProvider> resource_provider_; scoped_ptr<OverlayProcessor> overlay_processor_; + gfx::Rect damage_rect_; }; typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest; @@ -417,7 +418,7 @@ TEST_F(SandwichTest, SuccessfulSingleOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); @@ -459,7 +460,7 @@ TEST_F(SandwichTest, CroppedSingleOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); // Ensure that the display and uv rects have cropping applied to them. ASSERT_EQ(1U, pass_list.size()); @@ -488,7 +489,7 @@ TEST_F(SandwichTest, SuccessfulTwoOverlays) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); // Both candidates should become overlays. EXPECT_EQ(1u, pass_list.size()); @@ -522,7 +523,7 @@ TEST_F(SandwichTest, OverlappingOverlays) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); // Only one of the candidates should become an overlay. EXPECT_EQ(1u, pass_list.size()); @@ -557,8 +558,7 @@ TEST_F(SandwichTest, SuccessfulSandwichOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); - + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(2U, candidate_list.size()); @@ -613,7 +613,7 @@ TEST_F(SandwichTest, MultiQuadOverlay) { OverlayCandidateList candidate_list; EXPECT_EQ(4U, main_pass->quad_list.size()); overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(3U, candidate_list.size()); @@ -645,6 +645,39 @@ TEST_F(SandwichTest, MultiQuadOverlay) { DCHECK(covered_region == overlay_region); } +TEST_F(SandwichTest, DamageRect) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + + damage_rect_ = kOverlayRect; + + // 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()); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + + // Check for potential candidates. + OverlayCandidateList candidate_list; + + // 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); + + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &candidate_list, &damage_rect_); + DCHECK(!damage_rect_.IsEmpty()); +} + TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { scoped_ptr<RenderPass> pass = CreateRenderPass(); TextureDrawQuad* original_quad = @@ -665,7 +698,7 @@ TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); @@ -684,6 +717,38 @@ TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { EXPECT_EQ(original_resource_id, candidate_list.back().resource_id); } +TEST_F(SingleOverlayOnTopTest, DamageRect) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + damage_rect_ = kOverlayRect; + + // 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()); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + + // Check for potential candidates. + OverlayCandidateList candidate_list; + + // 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); + + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &candidate_list, &damage_rect_); + DCHECK(damage_rect_.IsEmpty()); +} + TEST_F(SingleOverlayOnTopTest, NoCandidates) { scoped_ptr<RenderPass> pass = CreateRenderPass(); CreateFullscreenOpaqueQuad(resource_provider_.get(), @@ -699,7 +764,7 @@ TEST_F(SingleOverlayOnTopTest, NoCandidates) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(0U, candidate_list.size()); // There should be nothing new here. CompareRenderPassLists(pass_list, original_pass_list); @@ -724,7 +789,7 @@ TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(0U, candidate_list.size()); // There should be nothing new here. CompareRenderPassLists(pass_list, original_pass_list); @@ -754,7 +819,7 @@ TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, candidate_list.size()); // This should be the same. @@ -773,7 +838,7 @@ TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -790,7 +855,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBlending) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -807,7 +872,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -823,7 +888,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -839,7 +904,7 @@ TEST_F(SingleOverlayOnTopTest, RejectOpacity) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -856,7 +921,7 @@ TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -873,7 +938,7 @@ TEST_F(SingleOverlayOnTopTest, AllowClipped) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -892,7 +957,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, @@ -913,7 +978,7 @@ TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, @@ -933,7 +998,7 @@ TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -951,7 +1016,7 @@ TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform); @@ -970,7 +1035,7 @@ TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform); @@ -989,7 +1054,7 @@ TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform); @@ -1013,7 +1078,7 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1037,7 +1102,7 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1059,7 +1124,7 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1083,7 +1148,7 @@ TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -1105,7 +1170,7 @@ TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -1120,7 +1185,7 @@ TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -1135,7 +1200,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1150,7 +1215,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1165,7 +1230,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1180,7 +1245,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1198,7 +1263,7 @@ TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(-1, candidate_list[0].plane_z_order); @@ -1221,7 +1286,7 @@ TEST_F(UnderlayTest, AllowOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list); + &candidate_list, &damage_rect_); EXPECT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(-1, candidate_list[0].plane_z_order); @@ -1229,6 +1294,39 @@ TEST_F(UnderlayTest, AllowOnTop) { EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR); } +TEST_F(UnderlayTest, DamageRect) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + + damage_rect_ = kOverlayRect; + + // 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()); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + + // Check for potential candidates. + OverlayCandidateList candidate_list; + + // 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); + + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &candidate_list, &damage_rect_); + DCHECK(!damage_rect_.IsEmpty()); +} + TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) { scoped_ptr<RenderPass> pass = CreateRenderPass(); @@ -1244,7 +1342,7 @@ TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidates; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidates); + &candidates, &damage_rect_); // Both quads should become overlays. EXPECT_EQ(2u, candidates.size()); @@ -1275,13 +1373,46 @@ TEST_F(AllOrNothingOverlayTest, RejectQuadWithTransform) { pass_list.push_back(pass.Pass()); OverlayCandidateList candidates; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidates); + &candidates, &damage_rect_); // No quads should become overlays. EXPECT_EQ(0u, candidates.size()); EXPECT_EQ(2u, pass_list.back()->quad_list.size()); } +TEST_F(AllOrNothingOverlayTest, DamageRect) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + + damage_rect_ = kOverlayRect; + + // 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()); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + + // Check for potential candidates. + OverlayCandidateList candidate_list; + + // 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); + + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &candidate_list, &damage_rect_); + DCHECK(!damage_rect_.IsEmpty()); +} + class OverlayInfoRendererGL : public GLRenderer { public: OverlayInfoRendererGL(RendererClient* client, @@ -1312,7 +1443,7 @@ class OverlayInfoRendererGL : public GLRenderer { } ASSERT_EQ(2U, frame->overlay_list.size()); - EXPECT_NE(0U, frame->overlay_list.back().resource_id); + EXPECT_GE(frame->overlay_list.back().resource_id, 0U); } void set_expect_overlays(bool expect_overlays) { @@ -1383,10 +1514,9 @@ TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) { scoped_ptr<RenderPass> pass = CreateRenderPass(); - CreateFullscreenCandidateQuad(resource_provider_.get(), - pass->shared_quad_state_list.back(), - pass.get()); - + CreateCandidateQuadAt(resource_provider_.get(), + pass->shared_quad_state_list.back(), pass.get(), + kOverlayBottomRightRect); CreateFullscreenOpaqueQuad(resource_provider_.get(), pass->shared_quad_state_list.back(), pass.get()); CreateFullscreenOpaqueQuad(resource_provider_.get(), @@ -1402,9 +1532,9 @@ TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) { Schedule(0, gfx::OVERLAY_TRANSFORM_NONE, _, gfx::Rect(kDisplaySize), gfx::RectF(0, 0, 1, 1))) .Times(1); - EXPECT_CALL(scheduler_, - Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, kOverlayRect, - BoundingRect(kUVTopLeft, kUVBottomRight))) + EXPECT_CALL(scheduler_, Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, + kOverlayBottomRightRect, + BoundingRect(kUVTopLeft, kUVBottomRight))) .Times(1); renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); |