| Index: cc/output/direct_renderer.cc
|
| diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
|
| index 4acd9c142ad5b3ef95638a574270d774b3d0a935..600805ad8c71cbb386c2f40de5c9e4757e197b92 100644
|
| --- a/cc/output/direct_renderer.cc
|
| +++ b/cc/output/direct_renderer.cc
|
| @@ -205,9 +205,7 @@ 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;
|
| - frame.root_damage_rect = Capabilities().using_partial_swap
|
| - ? root_render_pass->damage_rect
|
| - : root_render_pass->output_rect;
|
| + frame.root_damage_rect = root_render_pass->damage_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;
|
| @@ -226,8 +224,7 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
|
|
| if (output_surface_->IsDisplayedAsOverlayPlane()) {
|
| // Create the overlay candidate for the output surface, and mark it as
|
| - // always
|
| - // handled.
|
| + // always handled.
|
| OverlayCandidate output_surface_plane;
|
| output_surface_plane.display_rect =
|
| gfx::RectF(root_render_pass->output_rect);
|
| @@ -254,9 +251,18 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
| &frame.ca_layer_overlay_list, &frame.root_damage_rect);
|
| }
|
|
|
| + // The damage rect might be empty now, but if empty swap isn't allowed we
|
| + // still have to draw.
|
| + bool should_draw = has_copy_requests || !frame.root_damage_rect.IsEmpty() ||
|
| + !Capabilities().allow_empty_swap;
|
| + // If we have to draw but don't support partial swap the whole output should
|
| + // be considered damaged.
|
| + if (should_draw && !Capabilities().using_partial_swap)
|
| + frame.root_damage_rect = root_render_pass->output_rect;
|
| +
|
| // 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) {
|
| + if (!should_draw) {
|
| BindFramebufferToOutputSurface(&frame);
|
| } else {
|
| for (const auto& pass : *render_passes_in_draw_order) {
|
|
|