| Index: cc/output/direct_renderer.cc
|
| diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
|
| index 0ae4179deaef141473f276f50eb503cba852f5cb..9937ab18695b3a4b08fdf93e0977c359ea6e9a06 100644
|
| --- a/cc/output/direct_renderer.cc
|
| +++ b/cc/output/direct_renderer.cc
|
| @@ -209,6 +209,13 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
| DrawingFrame frame;
|
| frame.render_passes_in_draw_order = render_passes_in_draw_order;
|
| frame.root_render_pass = root_render_pass;
|
| +
|
| + overlay_processor_->ProcessForOverlays(render_passes_in_draw_order,
|
| + &frame.overlay_list);
|
| +
|
| + // Merge quad damage for the root pass.
|
| + render_passes_in_draw_order->back()->UnionOverlayDamage();
|
| +
|
| frame.root_damage_rect = Capabilities().using_partial_swap
|
| ? root_render_pass->damage_rect
|
| : root_render_pass->output_rect;
|
| @@ -218,8 +225,20 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
| frame.disable_picture_quad_image_filtering =
|
| disable_picture_quad_image_filtering;
|
|
|
| - overlay_processor_->ProcessForOverlays(render_passes_in_draw_order,
|
| - &frame.overlay_list);
|
| + if (root_render_pass->damage_rect.IsEmpty()) {
|
| + // If we have a scene that is composed of only overlays then we can
|
| + // potentially avoid drawing anything. However, if there are any copy
|
| + // requests we must do the drawing.
|
| + auto copy_pass = std::find_if(
|
| + render_passes_in_draw_order->begin(),
|
| + render_passes_in_draw_order->end(),
|
| + [](const RenderPass* pass) { return !pass->copy_requests.empty(); });
|
| + if (copy_pass == render_passes_in_draw_order->end()) {
|
| + ScheduleOverlays(&frame);
|
| + render_passes_in_draw_order->clear();
|
| + return;
|
| + }
|
| + }
|
|
|
| EnsureBackbuffer();
|
|
|
| @@ -246,6 +265,7 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
| }
|
| }
|
| FinishDrawingFrame(&frame);
|
| + ScheduleOverlays(&frame);
|
|
|
| render_passes_in_draw_order->clear();
|
| }
|
|
|