OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/surfaces/surface_aggregator.h" | 5 #include "cc/surfaces/surface_aggregator.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 | 10 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 const ClipData& clip_rect, | 181 const ClipData& clip_rect, |
182 RenderPass* dest_pass) { | 182 RenderPass* dest_pass) { |
183 SurfaceId surface_id = surface_quad->surface_id; | 183 SurfaceId surface_id = surface_quad->surface_id; |
184 // If this surface's id is already in our referenced set then it creates | 184 // If this surface's id is already in our referenced set then it creates |
185 // a cycle in the graph and should be dropped. | 185 // a cycle in the graph and should be dropped. |
186 if (referenced_surfaces_.count(surface_id)) | 186 if (referenced_surfaces_.count(surface_id)) |
187 return; | 187 return; |
188 Surface* surface = manager_->GetSurfaceForId(surface_id); | 188 Surface* surface = manager_->GetSurfaceForId(surface_id); |
189 if (!surface) | 189 if (!surface) |
190 return; | 190 return; |
191 const CompositorFrame* frame = surface->GetEligibleFrame(); | 191 const CompositorFrame& frame = surface->GetEligibleFrame(); |
192 if (!frame) | 192 const DelegatedFrameData* frame_data = frame.delegated_frame_data.get(); |
193 return; | |
194 const DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); | |
195 if (!frame_data) | 193 if (!frame_data) |
196 return; | 194 return; |
197 | 195 |
198 std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>> copy_requests; | 196 std::multimap<RenderPassId, std::unique_ptr<CopyOutputRequest>> copy_requests; |
199 surface->TakeCopyOutputRequests(©_requests); | 197 surface->TakeCopyOutputRequests(©_requests); |
200 | 198 |
201 const RenderPassList& render_pass_list = frame_data->render_pass_list; | 199 const RenderPassList& render_pass_list = frame_data->render_pass_list; |
202 if (!valid_surfaces_.count(surface->surface_id())) { | 200 if (!valid_surfaces_.count(surface->surface_id())) { |
203 for (auto& request : copy_requests) | 201 for (auto& request : copy_requests) |
204 request.second->SendEmptyResult(); | 202 request.second->SendEmptyResult(); |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 base::WeakPtr<SurfaceAggregator> debug_weak_this = weak_factory_.GetWeakPtr(); | 554 base::WeakPtr<SurfaceAggregator> debug_weak_this = weak_factory_.GetWeakPtr(); |
557 | 555 |
558 if (referenced_surfaces_.count(surface_id)) | 556 if (referenced_surfaces_.count(surface_id)) |
559 return gfx::Rect(); | 557 return gfx::Rect(); |
560 Surface* surface = manager_->GetSurfaceForId(surface_id); | 558 Surface* surface = manager_->GetSurfaceForId(surface_id); |
561 if (!surface) { | 559 if (!surface) { |
562 contained_surfaces_[surface_id] = 0; | 560 contained_surfaces_[surface_id] = 0; |
563 return gfx::Rect(); | 561 return gfx::Rect(); |
564 } | 562 } |
565 contained_surfaces_[surface_id] = surface->frame_index(); | 563 contained_surfaces_[surface_id] = surface->frame_index(); |
566 const CompositorFrame* surface_frame = surface->GetEligibleFrame(); | 564 const CompositorFrame& surface_frame = surface->GetEligibleFrame(); |
567 if (!surface_frame) | |
568 return gfx::Rect(); | |
569 const DelegatedFrameData* frame_data = | 565 const DelegatedFrameData* frame_data = |
570 surface_frame->delegated_frame_data.get(); | 566 surface_frame.delegated_frame_data.get(); |
571 if (!frame_data) | 567 if (!frame_data) |
572 return gfx::Rect(); | 568 return gfx::Rect(); |
573 int child_id = 0; | 569 int child_id = 0; |
574 // TODO(jbauman): hack for unit tests that don't set up rp | 570 // TODO(jbauman): hack for unit tests that don't set up rp |
575 if (provider_) { | 571 if (provider_) { |
576 child_id = ChildIdForSurface(surface); | 572 child_id = ChildIdForSurface(surface); |
577 if (surface->factory()) | 573 if (surface->factory()) |
578 surface->factory()->RefResources(frame_data->resource_list); | 574 surface->factory()->RefResources(frame_data->resource_list); |
579 provider_->ReceiveFromChild(child_id, frame_data->resource_list); | 575 provider_->ReceiveFromChild(child_id, frame_data->resource_list); |
580 } | 576 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 // modified if there is a filter that moves pixels. | 676 // modified if there is a filter that moves pixels. |
681 damage_rect = full_damage; | 677 damage_rect = full_damage; |
682 continue; | 678 continue; |
683 } | 679 } |
684 | 680 |
685 damage_rect.Union(MathUtil::MapEnclosingClippedRect( | 681 damage_rect.Union(MathUtil::MapEnclosingClippedRect( |
686 surface_info.target_to_surface_transform, surface_damage)); | 682 surface_info.target_to_surface_transform, surface_damage)); |
687 } | 683 } |
688 | 684 |
689 CHECK(debug_weak_this.get()); | 685 CHECK(debug_weak_this.get()); |
690 for (const auto& surface_id : surface_frame->metadata.referenced_surfaces) { | 686 for (const auto& surface_id : surface_frame.metadata.referenced_surfaces) { |
691 if (!contained_surfaces_.count(surface_id)) { | 687 if (!contained_surfaces_.count(surface_id)) { |
692 result->undrawn_surfaces.insert(surface_id); | 688 result->undrawn_surfaces.insert(surface_id); |
693 PrewalkTree(surface_id, false, RenderPassId(), result); | 689 PrewalkTree(surface_id, false, RenderPassId(), result); |
694 } | 690 } |
695 } | 691 } |
696 | 692 |
697 CHECK(debug_weak_this.get()); | 693 CHECK(debug_weak_this.get()); |
698 if (surface->factory()) | 694 if (surface->factory()) |
699 surface->factory()->WillDrawSurface(surface->surface_id(), damage_rect); | 695 surface->factory()->WillDrawSurface(surface->surface_id(), damage_rect); |
700 | 696 |
(...skipping 16 matching lines...) Expand all Loading... |
717 // (or on Surfaces they reference) are executed. | 713 // (or on Surfaces they reference) are executed. |
718 std::vector<SurfaceId> surfaces_to_copy( | 714 std::vector<SurfaceId> surfaces_to_copy( |
719 prewalk_result->undrawn_surfaces.begin(), | 715 prewalk_result->undrawn_surfaces.begin(), |
720 prewalk_result->undrawn_surfaces.end()); | 716 prewalk_result->undrawn_surfaces.end()); |
721 | 717 |
722 for (size_t i = 0; i < surfaces_to_copy.size(); i++) { | 718 for (size_t i = 0; i < surfaces_to_copy.size(); i++) { |
723 SurfaceId surface_id = surfaces_to_copy[i]; | 719 SurfaceId surface_id = surfaces_to_copy[i]; |
724 Surface* surface = manager_->GetSurfaceForId(surface_id); | 720 Surface* surface = manager_->GetSurfaceForId(surface_id); |
725 if (!surface) | 721 if (!surface) |
726 continue; | 722 continue; |
727 const CompositorFrame* surface_frame = surface->GetEligibleFrame(); | 723 const CompositorFrame& surface_frame = surface->GetEligibleFrame(); |
728 if (!surface_frame) | 724 if (!surface_frame.delegated_frame_data) |
729 continue; | 725 continue; |
730 bool surface_has_copy_requests = false; | 726 bool surface_has_copy_requests = false; |
731 for (const auto& render_pass : | 727 for (const auto& render_pass : |
732 surface_frame->delegated_frame_data->render_pass_list) { | 728 surface_frame.delegated_frame_data->render_pass_list) { |
733 surface_has_copy_requests |= !render_pass->copy_requests.empty(); | 729 surface_has_copy_requests |= !render_pass->copy_requests.empty(); |
734 } | 730 } |
735 if (!surface_has_copy_requests) { | 731 if (!surface_has_copy_requests) { |
736 // Children are not necessarily included in undrawn_surfaces (because | 732 // Children are not necessarily included in undrawn_surfaces (because |
737 // they weren't referenced directly from a drawn surface), but may have | 733 // they weren't referenced directly from a drawn surface), but may have |
738 // copy requests, so make sure to check them as well. | 734 // copy requests, so make sure to check them as well. |
739 for (const auto& child_id : surface_frame->metadata.referenced_surfaces) { | 735 for (const auto& child_id : surface_frame.metadata.referenced_surfaces) { |
740 // Don't iterate over the child Surface if it was already listed as a | 736 // Don't iterate over the child Surface if it was already listed as a |
741 // child of a different Surface, or in the case where there's infinite | 737 // child of a different Surface, or in the case where there's infinite |
742 // recursion. | 738 // recursion. |
743 if (!prewalk_result->undrawn_surfaces.count(child_id)) { | 739 if (!prewalk_result->undrawn_surfaces.count(child_id)) { |
744 surfaces_to_copy.push_back(child_id); | 740 surfaces_to_copy.push_back(child_id); |
745 prewalk_result->undrawn_surfaces.insert(child_id); | 741 prewalk_result->undrawn_surfaces.insert(child_id); |
746 } | 742 } |
747 } | 743 } |
748 } else { | 744 } else { |
749 SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; | 745 SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; |
750 CopyPasses(surface_frame->delegated_frame_data.get(), surface); | 746 CopyPasses(surface_frame.delegated_frame_data.get(), surface); |
751 referenced_surfaces_.erase(it); | 747 referenced_surfaces_.erase(it); |
752 } | 748 } |
753 } | 749 } |
754 } | 750 } |
755 | 751 |
756 void SurfaceAggregator::PropagateCopyRequestPasses() { | 752 void SurfaceAggregator::PropagateCopyRequestPasses() { |
757 std::vector<RenderPassId> copy_requests_to_iterate( | 753 std::vector<RenderPassId> copy_requests_to_iterate( |
758 copy_request_passes_.begin(), copy_request_passes_.end()); | 754 copy_request_passes_.begin(), copy_request_passes_.end()); |
759 while (!copy_requests_to_iterate.empty()) { | 755 while (!copy_requests_to_iterate.empty()) { |
760 RenderPassId first = copy_requests_to_iterate.back(); | 756 RenderPassId first = copy_requests_to_iterate.back(); |
761 copy_requests_to_iterate.pop_back(); | 757 copy_requests_to_iterate.pop_back(); |
762 auto it = render_pass_dependencies_.find(first); | 758 auto it = render_pass_dependencies_.find(first); |
763 if (it == render_pass_dependencies_.end()) | 759 if (it == render_pass_dependencies_.end()) |
764 continue; | 760 continue; |
765 for (auto pass : it->second) { | 761 for (auto pass : it->second) { |
766 if (copy_request_passes_.insert(pass).second) { | 762 if (copy_request_passes_.insert(pass).second) { |
767 copy_requests_to_iterate.push_back(pass); | 763 copy_requests_to_iterate.push_back(pass); |
768 } | 764 } |
769 } | 765 } |
770 } | 766 } |
771 } | 767 } |
772 | 768 |
773 std::unique_ptr<CompositorFrame> SurfaceAggregator::Aggregate( | 769 CompositorFrame SurfaceAggregator::Aggregate(SurfaceId surface_id) { |
774 SurfaceId surface_id) { | |
775 Surface* surface = manager_->GetSurfaceForId(surface_id); | 770 Surface* surface = manager_->GetSurfaceForId(surface_id); |
776 DCHECK(surface); | 771 DCHECK(surface); |
777 contained_surfaces_[surface_id] = surface->frame_index(); | 772 contained_surfaces_[surface_id] = surface->frame_index(); |
778 const CompositorFrame* root_surface_frame = surface->GetEligibleFrame(); | 773 const CompositorFrame& root_surface_frame = surface->GetEligibleFrame(); |
779 if (!root_surface_frame) | 774 if (!root_surface_frame.delegated_frame_data) |
780 return nullptr; | 775 return CompositorFrame(); |
781 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); | 776 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); |
782 | 777 |
783 std::unique_ptr<CompositorFrame> frame(new CompositorFrame); | 778 CompositorFrame frame; |
784 frame->delegated_frame_data = base::WrapUnique(new DelegatedFrameData); | 779 frame.delegated_frame_data = base::WrapUnique(new DelegatedFrameData); |
785 | 780 |
786 DCHECK(root_surface_frame->delegated_frame_data); | 781 dest_resource_list_ = &frame.delegated_frame_data->resource_list; |
787 | 782 dest_pass_list_ = &frame.delegated_frame_data->render_pass_list; |
788 dest_resource_list_ = &frame->delegated_frame_data->resource_list; | |
789 dest_pass_list_ = &frame->delegated_frame_data->render_pass_list; | |
790 | 783 |
791 valid_surfaces_.clear(); | 784 valid_surfaces_.clear(); |
792 PrewalkResult prewalk_result; | 785 PrewalkResult prewalk_result; |
793 root_damage_rect_ = | 786 root_damage_rect_ = |
794 PrewalkTree(surface_id, false, RenderPassId(), &prewalk_result); | 787 PrewalkTree(surface_id, false, RenderPassId(), &prewalk_result); |
795 PropagateCopyRequestPasses(); | 788 PropagateCopyRequestPasses(); |
796 has_copy_requests_ = !copy_request_passes_.empty(); | 789 has_copy_requests_ = !copy_request_passes_.empty(); |
797 | 790 |
798 CopyUndrawnSurfaces(&prewalk_result); | 791 CopyUndrawnSurfaces(&prewalk_result); |
799 SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; | 792 SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; |
800 CopyPasses(root_surface_frame->delegated_frame_data.get(), surface); | 793 CopyPasses(root_surface_frame.delegated_frame_data.get(), surface); |
801 referenced_surfaces_.erase(it); | 794 referenced_surfaces_.erase(it); |
802 | 795 |
803 moved_pixel_passes_.clear(); | 796 moved_pixel_passes_.clear(); |
804 copy_request_passes_.clear(); | 797 copy_request_passes_.clear(); |
805 render_pass_dependencies_.clear(); | 798 render_pass_dependencies_.clear(); |
806 | 799 |
807 DCHECK(referenced_surfaces_.empty()); | 800 DCHECK(referenced_surfaces_.empty()); |
808 | 801 |
809 if (dest_pass_list_->empty()) | 802 if (dest_pass_list_->empty()) |
810 return nullptr; | 803 return CompositorFrame(); |
811 | 804 |
812 dest_pass_list_ = NULL; | 805 dest_pass_list_ = NULL; |
813 ProcessAddedAndRemovedSurfaces(); | 806 ProcessAddedAndRemovedSurfaces(); |
814 contained_surfaces_.swap(previous_contained_surfaces_); | 807 contained_surfaces_.swap(previous_contained_surfaces_); |
815 contained_surfaces_.clear(); | 808 contained_surfaces_.clear(); |
816 | 809 |
817 for (SurfaceIndexMap::iterator it = previous_contained_surfaces_.begin(); | 810 for (SurfaceIndexMap::iterator it = previous_contained_surfaces_.begin(); |
818 it != previous_contained_surfaces_.end(); | 811 it != previous_contained_surfaces_.end(); |
819 ++it) { | 812 ++it) { |
820 Surface* surface = manager_->GetSurfaceForId(it->first); | 813 Surface* surface = manager_->GetSurfaceForId(it->first); |
821 if (surface) | 814 if (surface) |
822 surface->TakeLatencyInfo(&frame->metadata.latency_info); | 815 surface->TakeLatencyInfo(&frame.metadata.latency_info); |
823 } | 816 } |
824 | 817 |
825 // TODO(jamesr): Aggregate all resource references into the returned frame's | 818 // TODO(jamesr): Aggregate all resource references into the returned frame's |
826 // resource list. | 819 // resource list. |
827 | 820 |
828 return frame; | 821 return frame; |
829 } | 822 } |
830 | 823 |
831 void SurfaceAggregator::ReleaseResources(SurfaceId surface_id) { | 824 void SurfaceAggregator::ReleaseResources(SurfaceId surface_id) { |
832 SurfaceToResourceChildIdMap::iterator it = | 825 SurfaceToResourceChildIdMap::iterator it = |
833 surface_id_to_resource_child_id_.find(surface_id); | 826 surface_id_to_resource_child_id_.find(surface_id); |
834 if (it != surface_id_to_resource_child_id_.end()) { | 827 if (it != surface_id_to_resource_child_id_.end()) { |
835 provider_->DestroyChild(it->second); | 828 provider_->DestroyChild(it->second); |
836 surface_id_to_resource_child_id_.erase(it); | 829 surface_id_to_resource_child_id_.erase(it); |
837 } | 830 } |
838 } | 831 } |
839 | 832 |
840 void SurfaceAggregator::SetFullDamageForSurface(SurfaceId surface_id) { | 833 void SurfaceAggregator::SetFullDamageForSurface(SurfaceId surface_id) { |
841 auto it = previous_contained_surfaces_.find(surface_id); | 834 auto it = previous_contained_surfaces_.find(surface_id); |
842 if (it == previous_contained_surfaces_.end()) | 835 if (it == previous_contained_surfaces_.end()) |
843 return; | 836 return; |
844 // Set the last drawn index as 0 to ensure full damage next time it's drawn. | 837 // Set the last drawn index as 0 to ensure full damage next time it's drawn. |
845 it->second = 0; | 838 it->second = 0; |
846 } | 839 } |
847 | 840 |
848 } // namespace cc | 841 } // namespace cc |
OLD | NEW |