OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 typedef LayerIterator<LayerImpl, | 570 typedef LayerIterator<LayerImpl, |
571 LayerImplList, | 571 LayerImplList, |
572 RenderSurfaceImpl, | 572 RenderSurfaceImpl, |
573 LayerIteratorActions::FrontToBack> LayerIteratorType; | 573 LayerIteratorActions::FrontToBack> LayerIteratorType; |
574 | 574 |
575 // Typically when we are missing a texture and use a checkerboard quad, we | 575 // Typically when we are missing a texture and use a checkerboard quad, we |
576 // still draw the frame. However when the layer being checkerboarded is moving | 576 // still draw the frame. However when the layer being checkerboarded is moving |
577 // due to an impl-animation, we drop the frame to avoid flashing due to the | 577 // due to an impl-animation, we drop the frame to avoid flashing due to the |
578 // texture suddenly appearing in the future. | 578 // texture suddenly appearing in the future. |
579 bool draw_frame = true; | 579 bool draw_frame = true; |
| 580 // When we have a copy request for a layer, we need to draw no matter |
| 581 // what, as the layer may disappear after this frame. |
| 582 bool have_copy_request = false; |
580 | 583 |
581 int layers_drawn = 0; | 584 int layers_drawn = 0; |
582 | 585 |
583 LayerIteratorType end = | 586 LayerIteratorType end = |
584 LayerIteratorType::End(frame->render_surface_layer_list); | 587 LayerIteratorType::End(frame->render_surface_layer_list); |
585 for (LayerIteratorType it = | 588 for (LayerIteratorType it = |
586 LayerIteratorType::Begin(frame->render_surface_layer_list); | 589 LayerIteratorType::Begin(frame->render_surface_layer_list); |
587 it != end; | 590 it != end; |
588 ++it) { | 591 ++it) { |
589 RenderPass::Id target_render_pass_id = | 592 RenderPass::Id target_render_pass_id = |
590 it.target_render_surface_layer()->render_surface()->RenderPassId(); | 593 it.target_render_surface_layer()->render_surface()->RenderPassId(); |
591 RenderPass* target_render_pass = | 594 RenderPass* target_render_pass = |
592 frame->render_passes_by_id[target_render_pass_id]; | 595 frame->render_passes_by_id[target_render_pass_id]; |
593 | 596 |
594 occlusion_tracker.EnterLayer(it); | 597 occlusion_tracker.EnterLayer(it); |
595 | 598 |
596 AppendQuadsData append_quads_data(target_render_pass->id); | 599 AppendQuadsData append_quads_data(target_render_pass->id); |
597 | 600 |
598 if (it.represents_contributing_render_surface()) { | 601 if (it.represents_target_render_surface()) { |
| 602 if (it->HasRequestCopyCallback()) { |
| 603 have_copy_request = true; |
| 604 it->TakeRequestCopyCallbacks(&target_render_pass->copy_callbacks); |
| 605 } |
| 606 } else if (it.represents_contributing_render_surface()) { |
599 RenderPass::Id contributing_render_pass_id = | 607 RenderPass::Id contributing_render_pass_id = |
600 it->render_surface()->RenderPassId(); | 608 it->render_surface()->RenderPassId(); |
601 RenderPass* contributing_render_pass = | 609 RenderPass* contributing_render_pass = |
602 frame->render_passes_by_id[contributing_render_pass_id]; | 610 frame->render_passes_by_id[contributing_render_pass_id]; |
603 AppendQuadsForRenderSurfaceLayer(target_render_pass, | 611 AppendQuadsForRenderSurfaceLayer(target_render_pass, |
604 *it, | 612 *it, |
605 contributing_render_pass, | 613 contributing_render_pass, |
606 occlusion_tracker, | 614 occlusion_tracker, |
607 &append_quads_data); | 615 &append_quads_data); |
608 } else if (it.represents_itself() && | 616 } else if (it.represents_itself() && |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 if (layer_has_animating_transform) | 672 if (layer_has_animating_transform) |
665 draw_frame = false; | 673 draw_frame = false; |
666 } | 674 } |
667 | 675 |
668 if (append_quads_data.had_incomplete_tile) | 676 if (append_quads_data.had_incomplete_tile) |
669 frame->contains_incomplete_tile = true; | 677 frame->contains_incomplete_tile = true; |
670 | 678 |
671 occlusion_tracker.LeaveLayer(it); | 679 occlusion_tracker.LeaveLayer(it); |
672 } | 680 } |
673 | 681 |
| 682 if (have_copy_request) |
| 683 draw_frame = true; |
| 684 |
674 rendering_stats_instrumentation_->AddLayersDrawn(layers_drawn); | 685 rendering_stats_instrumentation_->AddLayersDrawn(layers_drawn); |
675 | 686 |
676 #ifndef NDEBUG | 687 #ifndef NDEBUG |
677 for (size_t i = 0; i < frame->render_passes.size(); ++i) { | 688 for (size_t i = 0; i < frame->render_passes.size(); ++i) { |
678 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) | 689 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) |
679 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); | 690 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
680 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 691 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
681 != frame->render_passes_by_id.end()); | 692 != frame->render_passes_by_id.end()); |
682 } | 693 } |
683 #endif | 694 #endif |
684 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 695 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
685 | 696 |
686 if (!active_tree_->has_transparent_background()) { | 697 if (!active_tree_->has_transparent_background()) { |
687 frame->render_passes.back()->has_transparent_background = false; | 698 frame->render_passes.back()->has_transparent_background = false; |
688 AppendQuadsToFillScreen(frame->render_passes.back(), | 699 AppendQuadsToFillScreen(frame->render_passes.back(), |
689 active_tree_->root_layer(), | 700 active_tree_->root_layer(), |
690 active_tree_->background_color(), | 701 active_tree_->background_color(), |
691 occlusion_tracker); | 702 occlusion_tracker); |
692 } | 703 } |
693 | 704 |
694 if (draw_frame) | 705 if (draw_frame) |
695 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 706 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
| 707 else |
| 708 DCHECK(!have_copy_request); |
696 | 709 |
697 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); | 710 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |
698 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); | 711 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |
699 RemoveRenderPasses(CullRenderPassesWithCachedTextures(renderer_.get()), | 712 RemoveRenderPasses(CullRenderPassesWithCachedTextures(renderer_.get()), |
700 frame); | 713 frame); |
701 | 714 |
702 // If we're making a frame to draw, it better have at least one render pass. | 715 // If we're making a frame to draw, it better have at least one render pass. |
703 DCHECK(!frame->render_passes.empty()); | 716 DCHECK(!frame->render_passes.empty()); |
704 return draw_frame; | 717 return draw_frame; |
705 } | 718 } |
(...skipping 1409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 } | 2128 } |
2116 | 2129 |
2117 void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) { | 2130 void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) { |
2118 if (debug_state_.continuous_painting != debug_state.continuous_painting) | 2131 if (debug_state_.continuous_painting != debug_state.continuous_painting) |
2119 paint_time_counter_->ClearHistory(); | 2132 paint_time_counter_->ClearHistory(); |
2120 | 2133 |
2121 debug_state_ = debug_state; | 2134 debug_state_ = debug_state; |
2122 } | 2135 } |
2123 | 2136 |
2124 } // namespace cc | 2137 } // namespace cc |
OLD | NEW |