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.h" | 5 #include "cc/surfaces/surface.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
10 #include "cc/output/copy_output_request.h" | 10 #include "cc/output/copy_output_request.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 Surface::~Surface() { | 27 Surface::~Surface() { |
28 ClearCopyRequests(); | 28 ClearCopyRequests(); |
29 if (current_frame_ && factory_) { | 29 if (current_frame_ && factory_) { |
30 ReturnedResourceArray current_resources; | 30 ReturnedResourceArray current_resources; |
31 TransferableResource::ReturnResources( | 31 TransferableResource::ReturnResources( |
32 current_frame_->delegated_frame_data->resource_list, | 32 current_frame_->delegated_frame_data->resource_list, |
33 ¤t_resources); | 33 ¤t_resources); |
34 factory_->UnrefResources(current_resources); | 34 factory_->UnrefResources(current_resources); |
35 } | 35 } |
36 if (!draw_callback_.is_null()) | 36 if (!draw_callback_.is_null()) |
37 draw_callback_.Run(false); | 37 draw_callback_.Run(SurfaceDrawStatus::DRAW_SKIPPED); |
38 } | 38 } |
39 | 39 |
40 void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, | 40 void Surface::QueueFrame(scoped_ptr<CompositorFrame> frame, |
41 const DrawCallback& callback) { | 41 const DrawCallback& callback) { |
42 DCHECK(factory_); | 42 DCHECK(factory_); |
43 ClearCopyRequests(); | 43 ClearCopyRequests(); |
44 TakeLatencyInfo(&frame->metadata.latency_info); | 44 TakeLatencyInfo(&frame->metadata.latency_info); |
45 scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); | 45 scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); |
46 current_frame_ = frame.Pass(); | 46 current_frame_ = frame.Pass(); |
47 factory_->ReceiveFromChild( | 47 factory_->ReceiveFromChild( |
48 current_frame_->delegated_frame_data->resource_list); | 48 current_frame_->delegated_frame_data->resource_list); |
49 ++frame_index_; | 49 ++frame_index_; |
50 | 50 |
51 if (previous_frame) { | 51 if (previous_frame) { |
52 ReturnedResourceArray previous_resources; | 52 ReturnedResourceArray previous_resources; |
53 TransferableResource::ReturnResources( | 53 TransferableResource::ReturnResources( |
54 previous_frame->delegated_frame_data->resource_list, | 54 previous_frame->delegated_frame_data->resource_list, |
55 &previous_resources); | 55 &previous_resources); |
56 factory_->UnrefResources(previous_resources); | 56 factory_->UnrefResources(previous_resources); |
57 } | 57 } |
58 if (!draw_callback_.is_null()) | 58 if (!draw_callback_.is_null()) |
59 draw_callback_.Run(false); | 59 draw_callback_.Run(SurfaceDrawStatus::DRAW_SKIPPED); |
60 draw_callback_ = callback; | 60 draw_callback_ = callback; |
61 factory_->manager()->DidSatisfySequences( | 61 factory_->manager()->DidSatisfySequences( |
62 SurfaceIdAllocator::NamespaceForId(surface_id_), | 62 SurfaceIdAllocator::NamespaceForId(surface_id_), |
63 ¤t_frame_->metadata.satisfies_sequences); | 63 ¤t_frame_->metadata.satisfies_sequences); |
64 } | 64 } |
65 | 65 |
66 void Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { | 66 void Surface::RequestCopyOfOutput(scoped_ptr<CopyOutputRequest> copy_request) { |
67 if (current_frame_ && | 67 if (current_frame_ && |
68 !current_frame_->delegated_frame_data->render_pass_list.empty()) | 68 !current_frame_->delegated_frame_data->render_pass_list.empty()) |
69 current_frame_->delegated_frame_data->render_pass_list.back() | 69 current_frame_->delegated_frame_data->render_pass_list.back() |
(...skipping 29 matching lines...) Expand all Loading... |
99 if (latency_info->empty()) { | 99 if (latency_info->empty()) { |
100 current_frame_->metadata.latency_info.swap(*latency_info); | 100 current_frame_->metadata.latency_info.swap(*latency_info); |
101 return; | 101 return; |
102 } | 102 } |
103 std::copy(current_frame_->metadata.latency_info.begin(), | 103 std::copy(current_frame_->metadata.latency_info.begin(), |
104 current_frame_->metadata.latency_info.end(), | 104 current_frame_->metadata.latency_info.end(), |
105 std::back_inserter(*latency_info)); | 105 std::back_inserter(*latency_info)); |
106 current_frame_->metadata.latency_info.clear(); | 106 current_frame_->metadata.latency_info.clear(); |
107 } | 107 } |
108 | 108 |
109 void Surface::RunDrawCallbacks() { | 109 void Surface::RunDrawCallbacks(SurfaceDrawStatus drawn) { |
110 if (!draw_callback_.is_null()) { | 110 if (!draw_callback_.is_null()) { |
111 DrawCallback callback = draw_callback_; | 111 DrawCallback callback = draw_callback_; |
112 draw_callback_ = DrawCallback(); | 112 draw_callback_ = DrawCallback(); |
113 callback.Run(true); | 113 callback.Run(drawn); |
114 } | 114 } |
115 } | 115 } |
116 | 116 |
117 void Surface::AddDestructionDependency(SurfaceSequence sequence) { | 117 void Surface::AddDestructionDependency(SurfaceSequence sequence) { |
118 destruction_dependencies_.push_back(sequence); | 118 destruction_dependencies_.push_back(sequence); |
119 } | 119 } |
120 | 120 |
121 void Surface::SatisfyDestructionDependencies( | 121 void Surface::SatisfyDestructionDependencies( |
122 base::hash_set<SurfaceSequence>* sequences) { | 122 base::hash_set<SurfaceSequence>* sequences) { |
123 destruction_dependencies_.erase( | 123 destruction_dependencies_.erase( |
124 std::remove_if( | 124 std::remove_if( |
125 destruction_dependencies_.begin(), destruction_dependencies_.end(), | 125 destruction_dependencies_.begin(), destruction_dependencies_.end(), |
126 [sequences](SurfaceSequence seq) { return !!sequences->erase(seq); }), | 126 [sequences](SurfaceSequence seq) { return !!sequences->erase(seq); }), |
127 destruction_dependencies_.end()); | 127 destruction_dependencies_.end()); |
128 } | 128 } |
129 | 129 |
130 void Surface::ClearCopyRequests() { | 130 void Surface::ClearCopyRequests() { |
131 if (current_frame_) { | 131 if (current_frame_) { |
132 for (const auto& render_pass : | 132 for (const auto& render_pass : |
133 current_frame_->delegated_frame_data->render_pass_list) { | 133 current_frame_->delegated_frame_data->render_pass_list) { |
134 for (const auto& copy_request : render_pass->copy_requests) | 134 for (const auto& copy_request : render_pass->copy_requests) |
135 copy_request->SendEmptyResult(); | 135 copy_request->SendEmptyResult(); |
136 } | 136 } |
137 } | 137 } |
138 } | 138 } |
139 | 139 |
140 } // namespace cc | 140 } // namespace cc |
OLD | NEW |