summaryrefslogtreecommitdiffstats
path: root/cc/output
diff options
context:
space:
mode:
authorkalyan.kondapally <kalyan.kondapally@intel.com>2015-11-12 09:04:08 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-12 17:04:49 +0000
commitf162eed80458239a8153d968f33c2c3dc6b2766f (patch)
treed022da57b9fb02e503b67dff315eaea48c797955 /cc/output
parentb4ee405ecbcb357724ddb5c535f26c714410d396 (diff)
downloadchromium_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.cc19
-rw-r--r--cc/output/overlay_unittest.cc29
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);