| 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 |