Index: cc/surfaces/display.cc |
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc |
index 2cdcfcd1937e8455c55be9dfd01ae973209ddbb2..81ae2009be21beadc07dd752613b823283583012 100644 |
--- a/cc/surfaces/display.cc |
+++ b/cc/surfaces/display.cc |
@@ -239,6 +239,7 @@ bool Display::DrawAndSwap() { |
should_draw = false; |
} |
+ DrawFrameResult draw_result = DrawFrameResult::DID_DRAW; |
if (should_draw) { |
gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_); |
gfx::Rect device_clip_rect = |
@@ -247,14 +248,20 @@ bool Display::DrawAndSwap() { |
renderer_->DecideRenderPassAllocationsForFrame( |
frame_data->render_pass_list); |
- renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_, |
- device_viewport_rect, device_clip_rect, |
- disable_picture_quad_image_filtering); |
+ draw_result = renderer_->DrawFrame(&frame_data->render_pass_list, |
+ device_scale_factor_, |
+ device_viewport_rect, device_clip_rect, |
+ disable_picture_quad_image_filtering); |
} else { |
TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); |
} |
- bool should_swap = should_draw && size_matches; |
+ // If drawing was skipped because overlays removed the damage, swapping should |
+ // be skipped too. |
+ bool should_skip_swap = |
+ have_damage && draw_result == DrawFrameResult::DAMAGE_DRAWN_BY_OVERLAYS && |
+ output_surface_->capabilities().schedules_overlays_without_swap; |
+ bool should_swap = should_draw && size_matches && !should_skip_swap; |
if (should_swap) { |
swapped_since_resize_ = true; |
for (auto& latency : frame->metadata.latency_info) { |