| Index: cc/output/direct_renderer.cc
|
| diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
|
| index a1d3a65a8a11b6b1eb17f7e7edb0d52442f3e90e..7009789d66a5f517717f2a57dec2ebf8365831a9 100644
|
| --- a/cc/output/direct_renderer.cc
|
| +++ b/cc/output/direct_renderer.cc
|
| @@ -207,8 +207,7 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
| frame.root_damage_rect = Capabilities().using_partial_swap
|
| ? root_render_pass->damage_rect
|
| : root_render_pass->output_rect;
|
| - frame.root_damage_rect.Union(next_root_damage_rect_);
|
| - next_root_damage_rect_ = gfx::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;
|
| frame.device_clip_rect = device_clip_rect;
|
| @@ -238,62 +237,44 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
|
| frame.overlay_list.push_back(output_surface_plane);
|
| }
|
|
|
| - // If we have any copy requests, we can't remove any quads for overlays,
|
| - // otherwise the framebuffer will be missing the overlay contents.
|
| - if (root_render_pass->copy_requests.empty()) {
|
| - if (overlay_processor_->ProcessForCALayers(
|
| - resource_provider_, render_passes_in_draw_order,
|
| - &frame.ca_layer_overlay_list, &frame.overlay_list)) {
|
| - // Ensure that the next frame to use the backbuffer will do a full redraw.
|
| - next_root_damage_rect_.Union(root_render_pass->output_rect);
|
| - } else {
|
| - overlay_processor_->ProcessForOverlays(
|
| - resource_provider_, render_passes_in_draw_order, &frame.overlay_list,
|
| - &frame.root_damage_rect);
|
| -
|
| - // No need to render in case the damage rect is completely composited
|
| - // using
|
| - // overlays and dont have any copy requests.
|
| - if (frame.root_damage_rect.IsEmpty()) {
|
| - bool handle_copy_requests = false;
|
| - for (auto* pass : *render_passes_in_draw_order) {
|
| - if (!pass->copy_requests.empty()) {
|
| - handle_copy_requests = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (!handle_copy_requests) {
|
| - BindFramebufferToOutputSurface(&frame);
|
| - FinishDrawingFrame(&frame);
|
| - render_passes_in_draw_order->clear();
|
| - return;
|
| - }
|
| - overlay_processor_->ProcessForOverlays(
|
| - resource_provider_, render_passes_in_draw_order,
|
| - &frame.overlay_list, &frame.root_damage_rect);
|
| - }
|
| + // If we have any copy requests, we can't remove any quads for overlays or
|
| + // CALayers because the framebuffer would be missing the removed quads'
|
| + // contents.
|
| + bool has_copy_requests = false;
|
| + for (auto* pass : *render_passes_in_draw_order) {
|
| + if (!pass->copy_requests.empty()) {
|
| + has_copy_requests = true;
|
| + break;
|
| }
|
| }
|
| + 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);
|
| + }
|
|
|
| - for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
|
| - RenderPass* pass = render_passes_in_draw_order->at(i);
|
| - DrawRenderPass(&frame, pass);
|
| -
|
| - for (ScopedPtrVector<CopyOutputRequest>::iterator it =
|
| - pass->copy_requests.begin();
|
| - it != pass->copy_requests.end();
|
| - ++it) {
|
| - if (it != pass->copy_requests.begin()) {
|
| - // Doing a readback is destructive of our state on Mac, so make sure
|
| - // we restore the state between readbacks. http://crbug.com/99393.
|
| - UseRenderPass(&frame, pass);
|
| + // 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) {
|
| + BindFramebufferToOutputSurface(&frame);
|
| + } else {
|
| + for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
|
| + RenderPass* pass = render_passes_in_draw_order->at(i);
|
| + DrawRenderPass(&frame, pass);
|
| +
|
| + for (ScopedPtrVector<CopyOutputRequest>::iterator it =
|
| + pass->copy_requests.begin();
|
| + it != pass->copy_requests.end(); ++it) {
|
| + if (it != pass->copy_requests.begin()) {
|
| + // Doing a readback is destructive of our state on Mac, so make sure
|
| + // we restore the state between readbacks. http://crbug.com/99393.
|
| + UseRenderPass(&frame, pass);
|
| + }
|
| + CopyCurrentRenderPassToBitmap(&frame, pass->copy_requests.take(it));
|
| }
|
| - CopyCurrentRenderPassToBitmap(&frame, pass->copy_requests.take(it));
|
| }
|
| }
|
| FinishDrawingFrame(&frame);
|
| -
|
| render_passes_in_draw_order->clear();
|
| }
|
|
|
|
|