Index: cc/output/direct_renderer.cc |
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc |
index 4acd9c142ad5b3ef95638a574270d774b3d0a935..2a1a8b95dd8d0530cac4e5f9e06e83ebb824dd04 100644 |
--- a/cc/output/direct_renderer.cc |
+++ b/cc/output/direct_renderer.cc |
@@ -188,11 +188,12 @@ void DirectRenderer::DecideRenderPassAllocationsForFrame( |
} |
} |
-void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, |
- float device_scale_factor, |
- const gfx::Rect& device_viewport_rect, |
- const gfx::Rect& device_clip_rect, |
- bool disable_picture_quad_image_filtering) { |
+DrawFrameResult DirectRenderer::DrawFrame( |
+ RenderPassList* render_passes_in_draw_order, |
+ float device_scale_factor, |
+ const gfx::Rect& device_viewport_rect, |
+ const gfx::Rect& device_clip_rect, |
+ bool disable_picture_quad_image_filtering) { |
TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); |
UMA_HISTOGRAM_COUNTS( |
"Renderer4.renderPassCount", |
@@ -205,9 +206,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; |
@@ -248,16 +247,22 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, |
break; |
} |
} |
+ gfx::Rect damage_rect_minus_overlays = frame.root_damage_rect; |
if (!has_copy_requests) { |
overlay_processor_->ProcessForOverlays( |
resource_provider_, render_passes_in_draw_order, &frame.overlay_list, |
- &frame.ca_layer_overlay_list, &frame.root_damage_rect); |
+ &frame.ca_layer_overlay_list, &damage_rect_minus_overlays); |
+ frame.root_damage_rect = Capabilities().using_partial_swap |
+ ? damage_rect_minus_overlays |
+ : 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) { |
+ DrawFrameResult draw_result = DrawFrameResult::DID_DRAW; |
+ if (damage_rect_minus_overlays.IsEmpty() && !has_copy_requests) { |
BindFramebufferToOutputSurface(&frame); |
+ draw_result = DrawFrameResult::DAMAGE_DRAWN_BY_OVERLAYS; |
} else { |
for (const auto& pass : *render_passes_in_draw_order) { |
DrawRenderPass(&frame, pass.get()); |
@@ -275,6 +280,7 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, |
} |
FinishDrawingFrame(&frame); |
render_passes_in_draw_order->clear(); |
+ return draw_result; |
} |
gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass( |