diff options
author | kalyan.kondapally <kalyan.kondapally@intel.com> | 2015-11-12 09:04:08 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-12 17:04:49 +0000 |
commit | f162eed80458239a8153d968f33c2c3dc6b2766f (patch) | |
tree | d022da57b9fb02e503b67dff315eaea48c797955 /cc/output | |
parent | b4ee405ecbcb357724ddb5c535f26c714410d396 (diff) | |
download | chromium_src-f162eed80458239a8153d968f33c2c3dc6b2766f.zip chromium_src-f162eed80458239a8153d968f33c2c3dc6b2766f.tar.gz chromium_src-f162eed80458239a8153d968f33c2c3dc6b2766f.tar.bz2 |
Avoid rendering using GL in case damage rect is composited by overlay
We can avoid drawing using GL if the damage rect is entirely
composited by using overlays.
BUG=370522
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Committed: https://crrev.com/7c024b25d977484b627b63bff9f85e5b5e382b9e
Cr-Commit-Position: refs/heads/master@{#356844}
Review URL: https://codereview.chromium.org/1413763013
Cr-Commit-Position: refs/heads/master@{#359332}
Diffstat (limited to 'cc/output')
-rw-r--r-- | cc/output/direct_renderer.cc | 19 | ||||
-rw-r--r-- | cc/output/overlay_unittest.cc | 29 |
2 files changed, 48 insertions, 0 deletions
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc index 0a66eea..43e19c3 100644 --- a/cc/output/direct_renderer.cc +++ b/cc/output/direct_renderer.cc @@ -242,6 +242,25 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, 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 (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; + } + } } for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc index 8c9efc7..dd325bd 100644 --- a/cc/output/overlay_unittest.cc +++ b/cc/output/overlay_unittest.cc @@ -1613,6 +1613,35 @@ TEST_F(GLRendererWithOverlaysTest, NoValidatorNoOverlay) { Mock::VerifyAndClearExpectations(&scheduler_); } +TEST_F(GLRendererWithOverlaysTest, OccludedQuadNotDrawn) { + bool use_validator = true; + Init(use_validator); + renderer_->set_expect_overlays(true); + gfx::Rect viewport_rect(16, 16); + + scoped_ptr<RenderPass> pass = CreateRenderPass(); + + CreateFullscreenCandidateQuad(resource_provider_.get(), + pass->shared_quad_state_list.back(), + pass.get()); + + 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()); + + output_surface_->set_is_displayed_as_overlay_plane(true); + EXPECT_CALL(*renderer_, DoDrawQuad(_, _, _)).Times(0); + EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(2); + renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false); + SwapBuffers(); + Mock::VerifyAndClearExpectations(renderer_.get()); + Mock::VerifyAndClearExpectations(&scheduler_); +} + TEST_F(GLRendererWithOverlaysTest, ResourcesExportedAndReturnedWithDelay) { bool use_validator = true; Init(use_validator); |