diff options
-rw-r--r-- | cc/output/direct_renderer.cc | 80 | ||||
-rw-r--r-- | cc/output/direct_renderer.h | 4 | ||||
-rw-r--r-- | cc/output/gl_renderer_unittest.cc | 11 | ||||
-rw-r--r-- | cc/output/overlay_processor.cc | 40 | ||||
-rw-r--r-- | cc/output/overlay_processor.h | 18 | ||||
-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 | 9 | ||||
-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 | 187 | ||||
-rw-r--r-- | content/browser/compositor/buffer_queue.cc | 2 |
13 files changed, 228 insertions, 141 deletions
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc index 534b97e..4acd9c1 100644 --- a/cc/output/direct_renderer.cc +++ b/cc/output/direct_renderer.cc @@ -208,8 +208,7 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, frame.root_damage_rect = Capabilities().using_partial_swap ? root_render_pass->damage_rect : root_render_pass->output_rect; - frame.root_damage_rect.Union(next_root_damage_rect_); - next_root_damage_rect_ = gfx::Rect(); + frame.root_damage_rect.Union(overlay_processor_->GetAndResetOverlayDamage()); frame.root_damage_rect.Intersect(gfx::Rect(device_viewport_rect.size())); frame.device_viewport_rect = device_viewport_rect; frame.device_clip_rect = device_clip_rect; @@ -239,59 +238,42 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, frame.overlay_list.push_back(output_surface_plane); } - // If we have any copy requests, we can't remove any quads for overlays, - // otherwise the framebuffer will be missing the overlay contents. - if (root_render_pass->copy_requests.empty()) { - if (overlay_processor_->ProcessForCALayers( - resource_provider_, render_passes_in_draw_order, - &frame.ca_layer_overlay_list, &frame.overlay_list)) { - // Ensure that the next frame to use the backbuffer will do a full redraw. - next_root_damage_rect_.Union(root_render_pass->output_rect); - } else { - overlay_processor_->ProcessForOverlays( - resource_provider_, render_passes_in_draw_order, &frame.overlay_list, - &frame.root_damage_rect); - - // No need to render in case the damage rect is completely composited - // using - // overlays and dont have any copy requests. - if (frame.root_damage_rect.IsEmpty()) { - bool handle_copy_requests = false; - for (const auto& pass : *render_passes_in_draw_order) { - if (!pass->copy_requests.empty()) { - handle_copy_requests = true; - break; - } - } - - if (!handle_copy_requests) { - BindFramebufferToOutputSurface(&frame); - FinishDrawingFrame(&frame); - render_passes_in_draw_order->clear(); - return; - } - overlay_processor_->ProcessForOverlays( - resource_provider_, render_passes_in_draw_order, - &frame.overlay_list, &frame.root_damage_rect); - } + // If we have any copy requests, we can't remove any quads for overlays or + // CALayers because the framebuffer would be missing the removed quads' + // contents. + bool has_copy_requests = false; + for (const auto& pass : *render_passes_in_draw_order) { + if (!pass->copy_requests.empty()) { + has_copy_requests = true; + break; } } + if (!has_copy_requests) { + overlay_processor_->ProcessForOverlays( + resource_provider_, render_passes_in_draw_order, &frame.overlay_list, + &frame.ca_layer_overlay_list, &frame.root_damage_rect); + } - for (const auto& pass : *render_passes_in_draw_order) { - DrawRenderPass(&frame, pass.get()); - - bool first_request = true; - for (auto& copy_request : pass->copy_requests) { - // Doing a readback is destructive of our state on Mac, so make sure - // we restore the state between readbacks. http://crbug.com/99393. - if (!first_request) - UseRenderPass(&frame, pass.get()); - CopyCurrentRenderPassToBitmap(&frame, std::move(copy_request)); - first_request = false; + // If all damage is being drawn with overlays or CALayers then skip drawing + // the render passes. + if (frame.root_damage_rect.IsEmpty() && !has_copy_requests) { + BindFramebufferToOutputSurface(&frame); + } else { + for (const auto& pass : *render_passes_in_draw_order) { + DrawRenderPass(&frame, pass.get()); + + bool first_request = true; + for (auto& copy_request : pass->copy_requests) { + // Doing a readback is destructive of our state on Mac, so make sure + // we restore the state between readbacks. http://crbug.com/99393. + if (!first_request) + UseRenderPass(&frame, pass.get()); + CopyCurrentRenderPassToBitmap(&frame, std::move(copy_request)); + first_request = false; + } } } FinishDrawingFrame(&frame); - render_passes_in_draw_order->clear(); } diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h index 6721e24..9c3db40 100644 --- a/cc/output/direct_renderer.h +++ b/cc/output/direct_renderer.h @@ -160,10 +160,6 @@ class CC_EXPORT DirectRenderer : public Renderer { private: gfx::Vector2d enlarge_pass_texture_amount_; - // Regions that must be drawn in the next frame because they were represented - // as CALayers in the current frame. - gfx::Rect next_root_damage_rect_; - DISALLOW_COPY_AND_ASSIGN(DirectRenderer); }; diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc index 10095e9..d90e3e8 100644 --- a/cc/output/gl_renderer_unittest.cc +++ b/cc/output/gl_renderer_unittest.cc @@ -2024,11 +2024,10 @@ class TestOverlayProcessor : public OverlayProcessor { public: Strategy() {} ~Strategy() override {} - MOCK_METHOD4(Attempt, + MOCK_METHOD3(Attempt, bool(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates, - gfx::Rect* damage_rect)); + OverlayCandidateList* candidates)); }; class Validator : public OverlayCandidateValidator { @@ -2125,7 +2124,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); EXPECT_CALL(*validator, AllowCALayerOverlays()).Times(0); renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, viewport_rect, false); @@ -2146,7 +2145,7 @@ TEST_F(GLRendererTest, DontOverlayWithCopyRequests) { EXPECT_CALL(*validator, AllowCALayerOverlays()) .Times(1) .WillOnce(::testing::Return(false)); - 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); @@ -2165,7 +2164,7 @@ TEST_F(GLRendererTest, DontOverlayWithCopyRequests) { EXPECT_CALL(*validator, AllowCALayerOverlays()) .Times(1) .WillOnce(::testing::Return(true)); - 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); } diff --git a/cc/output/overlay_processor.cc b/cc/output/overlay_processor.cc index 43a064f..40d6da6 100644 --- a/cc/output/overlay_processor.cc +++ b/cc/output/overlay_processor.cc @@ -26,11 +26,18 @@ void OverlayProcessor::Initialize() { OverlayProcessor::~OverlayProcessor() {} +gfx::Rect OverlayProcessor::GetAndResetOverlayDamage() { + gfx::Rect result = overlay_damage_rect_; + overlay_damage_rect_ = gfx::Rect(); + return result; +} + bool OverlayProcessor::ProcessForCALayers( ResourceProvider* resource_provider, RenderPassList* render_passes, + OverlayCandidateList* overlay_candidates, CALayerOverlayList* ca_layer_overlays, - OverlayCandidateList* overlay_candidates) { + gfx::Rect* damage_rect) { RenderPass* root_render_pass = render_passes->back().get(); OverlayCandidateValidator* overlay_validator = @@ -48,18 +55,43 @@ bool OverlayProcessor::ProcessForCALayers( // list. overlay_candidates->clear(); render_passes->back()->quad_list.clear(); + overlay_damage_rect_ = root_render_pass->output_rect; + *damage_rect = gfx::Rect(); return true; } void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider, RenderPassList* render_passes, OverlayCandidateList* candidates, + CALayerOverlayList* ca_layer_overlays, gfx::Rect* damage_rect) { + // First attempt to process for CALayers. + if (ProcessForCALayers(resource_provider, render_passes, candidates, + ca_layer_overlays, damage_rect)) { + return; + } + + // Only if that fails, attempt hardware overlay strategies. for (const auto& strategy : strategies_) { - if (strategy->Attempt(resource_provider, render_passes, candidates, - damage_rect)) { - return; + if (!strategy->Attempt(resource_provider, render_passes, candidates)) + continue; + + // Subtract on-top overlays from the damage rect, unless the overlays use + // the backbuffer as their content (in which case, add their combined rect + // back to the damage at the end). + gfx::Rect output_surface_overlay_damage_rect; + for (const OverlayCandidate& overlay : *candidates) { + if (overlay.plane_z_order > 0) { + const gfx::Rect overlay_display_rect = + ToEnclosedRect(overlay.display_rect); + overlay_damage_rect_.Union(overlay_display_rect); + damage_rect->Subtract(overlay_display_rect); + if (overlay.use_output_surface_for_resource) + output_surface_overlay_damage_rect.Union(overlay_display_rect); + } } + damage_rect->Union(output_surface_overlay_damage_rect); + return; } } diff --git a/cc/output/overlay_processor.h b/cc/output/overlay_processor.h index 020c3c7..f348fb8 100644 --- a/cc/output/overlay_processor.h +++ b/cc/output/overlay_processor.h @@ -29,8 +29,7 @@ class CC_EXPORT OverlayProcessor { // overlays. virtual bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates, - gfx::Rect* damage_rect) = 0; + OverlayCandidateList* candidates) = 0; }; using StrategyList = std::vector<scoped_ptr<Strategy>>; @@ -39,21 +38,26 @@ class CC_EXPORT OverlayProcessor { // Virtual to allow testing different strategies. virtual void Initialize(); - bool ProcessForCALayers(ResourceProvider* resource_provider, - RenderPassList* render_passes, - CALayerOverlayList* ca_layer_overlays, - OverlayCandidateList* overlay_candidates); + gfx::Rect GetAndResetOverlayDamage(); void ProcessForOverlays(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidates, + OverlayCandidateList* overlay_candidates, + CALayerOverlayList* ca_layer_overlays, gfx::Rect* damage_rect); protected: StrategyList strategies_; OutputSurface* surface_; + gfx::Rect overlay_damage_rect_; private: + bool ProcessForCALayers(ResourceProvider* resource_provider, + RenderPassList* render_passes, + OverlayCandidateList* overlay_candidates, + CALayerOverlayList* ca_layer_overlays, + gfx::Rect* damage_rect); + DISALLOW_COPY_AND_ASSIGN(OverlayProcessor); }; diff --git a/cc/output/overlay_strategy_sandwich.cc b/cc/output/overlay_strategy_sandwich.cc index 6aef45d..ce590b9 100644 --- a/cc/output/overlay_strategy_sandwich.cc +++ b/cc/output/overlay_strategy_sandwich.cc @@ -42,8 +42,7 @@ OverlayStrategySandwich::~OverlayStrategySandwich() {} bool OverlayStrategySandwich::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list, - gfx::Rect* damage_rect) { + OverlayCandidateList* candidate_list) { 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 0bdd2d2..076ea9d 100644 --- a/cc/output/overlay_strategy_sandwich.h +++ b/cc/output/overlay_strategy_sandwich.h @@ -23,8 +23,7 @@ class CC_EXPORT OverlayStrategySandwich : public OverlayProcessor::Strategy { bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list, - gfx::Rect* damage_rect) override; + OverlayCandidateList* candidate_list) 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 7a35d1d..78e5bf9 100644 --- a/cc/output/overlay_strategy_single_on_top.cc +++ b/cc/output/overlay_strategy_single_on_top.cc @@ -21,13 +21,12 @@ OverlayStrategySingleOnTop::~OverlayStrategySingleOnTop() {} bool OverlayStrategySingleOnTop::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list, - gfx::Rect* damage_rect) { + OverlayCandidateList* candidate_list) { 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, damage_rect)) { + TryOverlay(quad_list, candidate_list, candidate, it)) { return true; } } @@ -39,8 +38,7 @@ bool OverlayStrategySingleOnTop::TryOverlay( QuadList* quad_list, OverlayCandidateList* candidate_list, const OverlayCandidate& candidate, - QuadList::Iterator candidate_iterator, - gfx::Rect* damage_rect) { + QuadList::Iterator candidate_iterator) { // Check that no prior quads overlap it. for (auto overlap_iter = quad_list->cbegin(); overlap_iter != candidate_iterator; ++overlap_iter) { @@ -65,7 +63,6 @@ bool OverlayStrategySingleOnTop::TryOverlay( 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 29d98de..bdf2cc2 100644 --- a/cc/output/overlay_strategy_single_on_top.h +++ b/cc/output/overlay_strategy_single_on_top.h @@ -19,15 +19,13 @@ class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy { bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list, - gfx::Rect* damage_rect) override; + OverlayCandidateList* candidate_list) override; private: bool TryOverlay(QuadList* quad_list, OverlayCandidateList* candidate_list, const OverlayCandidate& candidate, - QuadList::Iterator candidate_iterator, - gfx::Rect* damage_rect); + QuadList::Iterator candidate_iterator); OverlayCandidateValidator* capability_checker_; // Weak. diff --git a/cc/output/overlay_strategy_underlay.cc b/cc/output/overlay_strategy_underlay.cc index 5f3f907..9a8a362 100644 --- a/cc/output/overlay_strategy_underlay.cc +++ b/cc/output/overlay_strategy_underlay.cc @@ -20,8 +20,7 @@ OverlayStrategyUnderlay::~OverlayStrategyUnderlay() {} bool OverlayStrategyUnderlay::Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list, - gfx::Rect* damage_rect) { + OverlayCandidateList* candidate_list) { 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 ac20051..f276c1c 100644 --- a/cc/output/overlay_strategy_underlay.h +++ b/cc/output/overlay_strategy_underlay.h @@ -24,8 +24,7 @@ class CC_EXPORT OverlayStrategyUnderlay : public OverlayProcessor::Strategy { bool Attempt(ResourceProvider* resource_provider, RenderPassList* render_passes, - OverlayCandidateList* candidate_list, - gfx::Rect* damage_rect) override; + OverlayCandidateList* candidate_list) override; private: OverlayCandidateValidator* capability_checker_; // Weak. diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc index a170cf9..1fbcff0 100644 --- a/cc/output/overlay_unittest.cc +++ b/cc/output/overlay_unittest.cc @@ -413,7 +413,8 @@ TEST_F(SandwichTest, SuccessfulSingleOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); @@ -455,7 +456,8 @@ TEST_F(SandwichTest, CroppedSingleOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); // Ensure that the display and uv rects have cropping applied to them. ASSERT_EQ(1U, pass_list.size()); @@ -484,7 +486,8 @@ TEST_F(SandwichTest, SuccessfulTwoOverlays) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); // Both candidates should become overlays. EXPECT_EQ(1u, pass_list.size()); @@ -518,7 +521,8 @@ TEST_F(SandwichTest, OverlappingOverlays) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); // Only one of the candidates should become an overlay. EXPECT_EQ(1u, pass_list.size()); @@ -553,7 +557,8 @@ TEST_F(SandwichTest, SuccessfulSandwichOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(2U, candidate_list.size()); @@ -608,7 +613,8 @@ 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, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(3U, candidate_list.size()); @@ -669,11 +675,45 @@ TEST_F(SandwichTest, DamageRect) { candidate_list.push_back(output_surface_plane); overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); - DCHECK(!damage_rect_.IsEmpty()); + &candidate_list, nullptr, + &damage_rect_); + EXPECT_EQ(2u, candidate_list.size()); + EXPECT_TRUE(damage_rect_.IsEmpty()); +} + +TEST_F(SandwichTest, DamageRectNonEmpty) { + scoped_ptr<RenderPass> pass = CreateRenderPass(); + CreateFullscreenOpaqueQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), pass.get()); + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + CreateFullscreenOpaqueQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), pass.get()); + damage_rect_ = kOverlayRect; + + 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, nullptr, + &damage_rect_); + EXPECT_EQ(3u, candidate_list.size()); + EXPECT_EQ(damage_rect_, kOverlayRect); } -TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { +TEST_F(SingleOverlayOnTopTest, SuccessfulOverlay) { scoped_ptr<RenderPass> pass = CreateRenderPass(); TextureDrawQuad* original_quad = CreateFullscreenCandidateQuad(resource_provider_.get(), @@ -693,7 +733,8 @@ TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); @@ -740,7 +781,8 @@ TEST_F(SingleOverlayOnTopTest, DamageRect) { candidate_list.push_back(output_surface_plane); overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); DCHECK(damage_rect_.IsEmpty()); } @@ -759,7 +801,8 @@ TEST_F(SingleOverlayOnTopTest, NoCandidates) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(0U, candidate_list.size()); // There should be nothing new here. CompareRenderPassLists(pass_list, original_pass_list); @@ -784,7 +827,8 @@ TEST_F(SingleOverlayOnTopTest, OccludedCandidates) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(0U, candidate_list.size()); // There should be nothing new here. CompareRenderPassLists(pass_list, original_pass_list); @@ -814,7 +858,8 @@ TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) { // Check for potential candidates. OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, candidate_list.size()); // This should be the same. @@ -833,7 +878,8 @@ TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -850,7 +896,8 @@ TEST_F(SingleOverlayOnTopTest, RejectBlending) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -867,7 +914,8 @@ TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -883,7 +931,8 @@ TEST_F(SingleOverlayOnTopTest, RejectBlendMode) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -899,7 +948,8 @@ TEST_F(SingleOverlayOnTopTest, RejectOpacity) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -916,7 +966,8 @@ TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -933,7 +984,8 @@ TEST_F(SingleOverlayOnTopTest, AllowClipped) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -952,7 +1004,8 @@ TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, @@ -973,7 +1026,8 @@ TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, @@ -993,7 +1047,8 @@ TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1011,7 +1066,8 @@ TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &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); @@ -1030,7 +1086,8 @@ TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &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); @@ -1049,7 +1106,8 @@ TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &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); @@ -1073,7 +1131,8 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1097,7 +1156,8 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1119,7 +1179,8 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1143,7 +1204,8 @@ TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -1165,7 +1227,8 @@ TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -1180,7 +1243,8 @@ TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, candidate_list.size()); } @@ -1195,7 +1259,8 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1210,7 +1275,8 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1225,7 +1291,8 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1240,7 +1307,8 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) { pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, candidate_list.size()); } @@ -1258,7 +1326,8 @@ TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(-1, candidate_list[0].plane_z_order); @@ -1281,7 +1350,8 @@ TEST_F(UnderlayTest, AllowOnTop) { OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); EXPECT_EQ(1U, pass_list.size()); ASSERT_EQ(1U, candidate_list.size()); EXPECT_EQ(-1, candidate_list[0].plane_z_order); @@ -1318,7 +1388,8 @@ TEST_F(UnderlayTest, DamageRect) { candidate_list.push_back(output_surface_plane); overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, - &candidate_list, &damage_rect_); + &candidate_list, nullptr, + &damage_rect_); DCHECK(!damage_rect_.IsEmpty()); } @@ -1342,13 +1413,15 @@ TEST_F(CALayerOverlayTest, AllowNonAxisAlignedTransform) { pass->shared_quad_state_list.back() ->quad_to_target_transform.RotateAboutZAxis(45.f); + gfx::Rect damage_rect; RenderPassList pass_list; pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); - overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list, - &ca_layer_list, &overlay_list); + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &overlay_list, &ca_layer_list, + &damage_rect); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, pass_list.back()->quad_list.size()); EXPECT_EQ(0U, overlay_list.size()); @@ -1363,13 +1436,15 @@ TEST_F(CALayerOverlayTest, Disallow3DTransform) { pass->shared_quad_state_list.back() ->quad_to_target_transform.RotateAboutXAxis(45.f); + gfx::Rect damage_rect; RenderPassList pass_list; pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); - overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list, - &ca_layer_list, &overlay_list); + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &overlay_list, &ca_layer_list, + &damage_rect); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, pass_list.back()->quad_list.size()); EXPECT_EQ(1U, overlay_list.size()); @@ -1384,13 +1459,15 @@ TEST_F(CALayerOverlayTest, AllowContainingClip) { pass->shared_quad_state_list.back()->is_clipped = true; pass->shared_quad_state_list.back()->clip_rect = kOverlayRect; + gfx::Rect damage_rect; RenderPassList pass_list; pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); - overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list, - &ca_layer_list, &overlay_list); + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &overlay_list, &ca_layer_list, + &damage_rect); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, pass_list.back()->quad_list.size()); EXPECT_EQ(0U, overlay_list.size()); @@ -1406,13 +1483,15 @@ TEST_F(CALayerOverlayTest, SkipDisjointClip) { pass->shared_quad_state_list.back()->clip_rect = gfx::Rect(128, 128, 128, 128); + gfx::Rect damage_rect; RenderPassList pass_list; pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); - overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list, - &ca_layer_list, &overlay_list); + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &overlay_list, &ca_layer_list, + &damage_rect); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, pass_list.back()->quad_list.size()); EXPECT_EQ(0U, overlay_list.size()); @@ -1427,13 +1506,15 @@ TEST_F(CALayerOverlayTest, DisallowNontrivialClip) { pass->shared_quad_state_list.back()->is_clipped = true; pass->shared_quad_state_list.back()->clip_rect = gfx::Rect(64, 64, 128, 128); + gfx::Rect damage_rect; RenderPassList pass_list; pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); - overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list, - &ca_layer_list, &overlay_list); + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &overlay_list, &ca_layer_list, + &damage_rect); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(1U, pass_list.back()->quad_list.size()); @@ -1448,13 +1529,15 @@ TEST_F(CALayerOverlayTest, SkipTransparent) { pass.get()); pass->shared_quad_state_list.back()->opacity = 0; + gfx::Rect damage_rect; RenderPassList pass_list; pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); - overlay_processor_->ProcessForCALayers(resource_provider_.get(), &pass_list, - &ca_layer_list, &overlay_list); + overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, + &overlay_list, &ca_layer_list, + &damage_rect); ASSERT_EQ(1U, pass_list.size()); EXPECT_EQ(0U, pass_list.back()->quad_list.size()); EXPECT_EQ(0U, overlay_list.size()); diff --git a/content/browser/compositor/buffer_queue.cc b/content/browser/compositor/buffer_queue.cc index b9b750a..c827416 100644 --- a/content/browser/compositor/buffer_queue.cc +++ b/content/browser/compositor/buffer_queue.cc @@ -81,7 +81,7 @@ void BufferQueue::UpdateBufferDamage(const gfx::Rect& damage) { } void BufferQueue::SwapBuffers(const gfx::Rect& damage) { - if (damage != gfx::Rect(size_)) { + if (!damage.IsEmpty() && damage != gfx::Rect(size_)) { // We must have a frame available to copy from. DCHECK(!in_flight_surfaces_.empty() || displayed_surface_.texture); unsigned int texture_id = !in_flight_surfaces_.empty() |