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