| 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 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 if (it == render_pass_dependencies_.end()) | 763 if (it == render_pass_dependencies_.end()) |
| 764 continue; | 764 continue; |
| 765 for (auto pass : it->second) { | 765 for (auto pass : it->second) { |
| 766 if (copy_request_passes_.insert(pass).second) { | 766 if (copy_request_passes_.insert(pass).second) { |
| 767 copy_requests_to_iterate.push_back(pass); | 767 copy_requests_to_iterate.push_back(pass); |
| 768 } | 768 } |
| 769 } | 769 } |
| 770 } | 770 } |
| 771 } | 771 } |
| 772 | 772 |
| 773 std::unique_ptr<CompositorFrame> SurfaceAggregator::Aggregate( | 773 CompositorFrame SurfaceAggregator::Aggregate(SurfaceId surface_id) { |
| 774 SurfaceId surface_id) { | |
| 775 Surface* surface = manager_->GetSurfaceForId(surface_id); | 774 Surface* surface = manager_->GetSurfaceForId(surface_id); |
| 776 DCHECK(surface); | 775 DCHECK(surface); |
| 777 contained_surfaces_[surface_id] = surface->frame_index(); | 776 contained_surfaces_[surface_id] = surface->frame_index(); |
| 778 const CompositorFrame* root_surface_frame = surface->GetEligibleFrame(); | 777 const CompositorFrame* root_surface_frame = surface->GetEligibleFrame(); |
| 779 if (!root_surface_frame) | 778 if (!root_surface_frame->delegated_frame_data) |
| 780 return nullptr; | 779 return CompositorFrame(); |
| 781 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); | 780 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); |
| 782 | 781 |
| 783 std::unique_ptr<CompositorFrame> frame(new CompositorFrame); | 782 CompositorFrame frame; |
| 784 frame->delegated_frame_data = base::WrapUnique(new DelegatedFrameData); | 783 frame.delegated_frame_data = base::WrapUnique(new DelegatedFrameData); |
| 785 | 784 |
| 786 DCHECK(root_surface_frame->delegated_frame_data); | 785 dest_resource_list_ = &frame.delegated_frame_data->resource_list; |
| 787 | 786 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 | 787 |
| 791 valid_surfaces_.clear(); | 788 valid_surfaces_.clear(); |
| 792 PrewalkResult prewalk_result; | 789 PrewalkResult prewalk_result; |
| 793 root_damage_rect_ = | 790 root_damage_rect_ = |
| 794 PrewalkTree(surface_id, false, RenderPassId(), &prewalk_result); | 791 PrewalkTree(surface_id, false, RenderPassId(), &prewalk_result); |
| 795 PropagateCopyRequestPasses(); | 792 PropagateCopyRequestPasses(); |
| 796 has_copy_requests_ = !copy_request_passes_.empty(); | 793 has_copy_requests_ = !copy_request_passes_.empty(); |
| 797 | 794 |
| 798 CopyUndrawnSurfaces(&prewalk_result); | 795 CopyUndrawnSurfaces(&prewalk_result); |
| 799 SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; | 796 SurfaceSet::iterator it = referenced_surfaces_.insert(surface_id).first; |
| 800 CopyPasses(root_surface_frame->delegated_frame_data.get(), surface); | 797 CopyPasses(root_surface_frame->delegated_frame_data.get(), surface); |
| 801 referenced_surfaces_.erase(it); | 798 referenced_surfaces_.erase(it); |
| 802 | 799 |
| 803 moved_pixel_passes_.clear(); | 800 moved_pixel_passes_.clear(); |
| 804 copy_request_passes_.clear(); | 801 copy_request_passes_.clear(); |
| 805 render_pass_dependencies_.clear(); | 802 render_pass_dependencies_.clear(); |
| 806 | 803 |
| 807 DCHECK(referenced_surfaces_.empty()); | 804 DCHECK(referenced_surfaces_.empty()); |
| 808 | 805 |
| 809 if (dest_pass_list_->empty()) | 806 if (dest_pass_list_->empty()) |
| 810 return nullptr; | 807 return CompositorFrame(); |
| 811 | 808 |
| 812 dest_pass_list_ = NULL; | 809 dest_pass_list_ = NULL; |
| 813 ProcessAddedAndRemovedSurfaces(); | 810 ProcessAddedAndRemovedSurfaces(); |
| 814 contained_surfaces_.swap(previous_contained_surfaces_); | 811 contained_surfaces_.swap(previous_contained_surfaces_); |
| 815 contained_surfaces_.clear(); | 812 contained_surfaces_.clear(); |
| 816 | 813 |
| 817 for (SurfaceIndexMap::iterator it = previous_contained_surfaces_.begin(); | 814 for (SurfaceIndexMap::iterator it = previous_contained_surfaces_.begin(); |
| 818 it != previous_contained_surfaces_.end(); | 815 it != previous_contained_surfaces_.end(); |
| 819 ++it) { | 816 ++it) { |
| 820 Surface* surface = manager_->GetSurfaceForId(it->first); | 817 Surface* surface = manager_->GetSurfaceForId(it->first); |
| 821 if (surface) | 818 if (surface) |
| 822 surface->TakeLatencyInfo(&frame->metadata.latency_info); | 819 surface->TakeLatencyInfo(&frame.metadata.latency_info); |
| 823 } | 820 } |
| 824 | 821 |
| 825 // TODO(jamesr): Aggregate all resource references into the returned frame's | 822 // TODO(jamesr): Aggregate all resource references into the returned frame's |
| 826 // resource list. | 823 // resource list. |
| 827 | 824 |
| 828 return frame; | 825 return frame; |
| 829 } | 826 } |
| 830 | 827 |
| 831 void SurfaceAggregator::ReleaseResources(SurfaceId surface_id) { | 828 void SurfaceAggregator::ReleaseResources(SurfaceId surface_id) { |
| 832 SurfaceToResourceChildIdMap::iterator it = | 829 SurfaceToResourceChildIdMap::iterator it = |
| 833 surface_id_to_resource_child_id_.find(surface_id); | 830 surface_id_to_resource_child_id_.find(surface_id); |
| 834 if (it != surface_id_to_resource_child_id_.end()) { | 831 if (it != surface_id_to_resource_child_id_.end()) { |
| 835 provider_->DestroyChild(it->second); | 832 provider_->DestroyChild(it->second); |
| 836 surface_id_to_resource_child_id_.erase(it); | 833 surface_id_to_resource_child_id_.erase(it); |
| 837 } | 834 } |
| 838 } | 835 } |
| 839 | 836 |
| 840 void SurfaceAggregator::SetFullDamageForSurface(SurfaceId surface_id) { | 837 void SurfaceAggregator::SetFullDamageForSurface(SurfaceId surface_id) { |
| 841 auto it = previous_contained_surfaces_.find(surface_id); | 838 auto it = previous_contained_surfaces_.find(surface_id); |
| 842 if (it == previous_contained_surfaces_.end()) | 839 if (it == previous_contained_surfaces_.end()) |
| 843 return; | 840 return; |
| 844 // Set the last drawn index as 0 to ensure full damage next time it's drawn. | 841 // Set the last drawn index as 0 to ensure full damage next time it's drawn. |
| 845 it->second = 0; | 842 it->second = 0; |
| 846 } | 843 } |
| 847 | 844 |
| 848 } // namespace cc | 845 } // namespace cc |
| OLD | NEW |