OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/compositor_frame_sink_support.h" | 5 #include "cc/surfaces/compositor_frame_sink_support.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 needs_begin_frame_ = needs_begin_frame; | 69 needs_begin_frame_ = needs_begin_frame; |
70 UpdateNeedsBeginFramesInternal(); | 70 UpdateNeedsBeginFramesInternal(); |
71 } | 71 } |
72 | 72 |
73 void CompositorFrameSinkSupport::SubmitCompositorFrame( | 73 void CompositorFrameSinkSupport::SubmitCompositorFrame( |
74 const LocalSurfaceId& local_surface_id, | 74 const LocalSurfaceId& local_surface_id, |
75 CompositorFrame frame) { | 75 CompositorFrame frame) { |
76 ++ack_pending_count_; | 76 ++ack_pending_count_; |
77 float device_scale_factor = frame.metadata.device_scale_factor; | 77 float device_scale_factor = frame.metadata.device_scale_factor; |
78 | 78 |
| 79 surface_factory_.SubmitCompositorFrame( |
| 80 local_surface_id, std::move(frame), |
| 81 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck, |
| 82 weak_factory_.GetWeakPtr())); |
| 83 |
79 if (surface_manager_->using_surface_references()) { | 84 if (surface_manager_->using_surface_references()) { |
80 SurfaceId last_surface_id = reference_tracker_.current_surface_id(); | 85 SurfaceId last_surface_id = reference_tracker_.current_surface_id(); |
81 | 86 |
82 // Populate list of surface references to add and remove based on reference | 87 // Populate list of surface references to add and remove based on reference |
83 // surfaces in current frame compared with the last frame. | 88 // surfaces in current frame compared with the last frame. The list of |
84 reference_tracker_.UpdateReferences(local_surface_id, | 89 // surface references includes references from both the pending and active |
85 frame.metadata.referenced_surfaces); | 90 // frame if any. |
| 91 SurfaceId current_surface_id(frame_sink_id_, local_surface_id); |
| 92 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id); |
| 93 // TODO(fsamuel): This is pretty inefficent. We copy over referenced |
| 94 // surfaces. Then we pass them into the ReferencedSurfaceTracker to copy |
| 95 // them again into a set. ReferencedSurfaceTracker should just take in two |
| 96 // vectors, one for pending referenced surfaces and one for active |
| 97 // referenced surfaces. |
| 98 std::vector<SurfaceId> referenced_surfaces = |
| 99 surface->active_referenced_surfaces(); |
86 | 100 |
87 surface_factory_.SubmitCompositorFrame( | 101 referenced_surfaces.insert(referenced_surfaces.end(), |
88 local_surface_id, std::move(frame), | 102 surface->pending_referenced_surfaces().begin(), |
89 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck, | 103 surface->pending_referenced_surfaces().end()); |
90 weak_factory_.GetWeakPtr())); | 104 reference_tracker_.UpdateReferences(local_surface_id, referenced_surfaces); |
91 | 105 |
92 UpdateSurfaceReferences(last_surface_id, local_surface_id); | 106 UpdateSurfaceReferences(last_surface_id, local_surface_id); |
93 } else { | |
94 surface_factory_.SubmitCompositorFrame( | |
95 local_surface_id, std::move(frame), | |
96 base::Bind(&CompositorFrameSinkSupport::DidReceiveCompositorFrameAck, | |
97 weak_factory_.GetWeakPtr())); | |
98 } | 107 } |
99 | 108 |
100 if (display_) | 109 if (display_) |
101 display_->SetLocalSurfaceId(local_surface_id, device_scale_factor); | 110 display_->SetLocalSurfaceId(local_surface_id, device_scale_factor); |
102 } | 111 } |
103 | 112 |
104 void CompositorFrameSinkSupport::Require(const LocalSurfaceId& local_surface_id, | 113 void CompositorFrameSinkSupport::Require(const LocalSurfaceId& local_surface_id, |
105 const SurfaceSequence& sequence) { | 114 const SurfaceSequence& sequence) { |
106 surface_manager_->RequireSequence(SurfaceId(frame_sink_id_, local_surface_id), | 115 surface_manager_->RequireSequence(SurfaceId(frame_sink_id_, local_surface_id), |
107 sequence); | 116 sequence); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 return; | 256 return; |
248 | 257 |
249 added_frame_observer_ = needs_begin_frame_; | 258 added_frame_observer_ = needs_begin_frame_; |
250 if (needs_begin_frame_) | 259 if (needs_begin_frame_) |
251 begin_frame_source_->AddObserver(this); | 260 begin_frame_source_->AddObserver(this); |
252 else | 261 else |
253 begin_frame_source_->RemoveObserver(this); | 262 begin_frame_source_->RemoveObserver(this); |
254 } | 263 } |
255 | 264 |
256 } // namespace cc | 265 } // namespace cc |
OLD | NEW |