Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 14060015: cc: Async readback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/trees/layer_tree_host_common.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698