| 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(
|
|
|