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 "content/browser/compositor/delegated_frame_host.h" | 5 #include "content/browser/compositor/delegated_frame_host.h" |
6 | 6 |
7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
10 #include "cc/output/compositor_frame_ack.h" | 10 #include "cc/output/compositor_frame_ack.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 | 57 |
58 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) | 58 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) |
59 : client_(client), | 59 : client_(client), |
60 compositor_(nullptr), | 60 compositor_(nullptr), |
61 use_surfaces_(UseSurfacesEnabled()), | 61 use_surfaces_(UseSurfacesEnabled()), |
62 last_output_surface_id_(0), | 62 last_output_surface_id_(0), |
63 pending_delegated_ack_count_(0), | 63 pending_delegated_ack_count_(0), |
64 skipped_frames_(false), | 64 skipped_frames_(false), |
65 current_scale_factor_(1.f), | 65 current_scale_factor_(1.f), |
66 can_lock_compositor_(YES_CAN_LOCK), | 66 can_lock_compositor_(YES_CAN_LOCK), |
67 frame_subscriber_copy_request_pending_(false), | |
68 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { | 67 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { |
69 ImageTransportFactory::GetInstance()->AddObserver(this); | 68 ImageTransportFactory::GetInstance()->AddObserver(this); |
70 } | 69 } |
71 | 70 |
72 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { | 71 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
73 delegated_frame_evictor_->SetVisible(true); | 72 delegated_frame_evictor_->SetVisible(true); |
74 | 73 |
75 if (surface_id_.is_null() && !frame_provider_.get() && | 74 if (surface_id_.is_null() && !frame_provider_.get() && |
76 !released_front_lock_.get()) { | 75 !released_front_lock_.get()) { |
77 if (compositor_) | 76 if (compositor_) |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 base::TimeTicks present_time; | 260 base::TimeTicks present_time; |
262 if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) { | 261 if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) { |
263 present_time = now; | 262 present_time = now; |
264 } else { | 263 } else { |
265 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; | 264 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; |
266 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; | 265 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; |
267 } | 266 } |
268 | 267 |
269 scoped_refptr<media::VideoFrame> frame; | 268 scoped_refptr<media::VideoFrame> frame; |
270 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 269 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
271 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, | 270 if (frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, |
272 &frame, &callback)) | 271 &frame, &callback)) { |
273 return; | 272 CopyFromCompositingSurfaceToVideoFrame( |
274 | 273 gfx::Rect(current_frame_size_in_dip_), |
275 if (frame_subscriber_copy_request_pending_) { | 274 frame, |
276 // A copy request was made for the previous frame from the renderer, but | 275 base::Bind(callback, present_time)); |
277 // drawing never started (which executes the request). Therefore, the | |
278 // prior frame subscriber delivery callback is to be aborted and the current | |
279 // one will be run when the existing copy request completes. This de-duping | |
280 // check must be done after the call to ShouldCaptureFrame() above, since | |
281 // the frame subscriber makes decisions based on the renderer's intentions, | |
282 // and not the performance of the browser compositor. | |
283 DCHECK(!frame_subscriber_callbacks_.empty()); | |
284 frame_subscriber_callbacks_.back().Run(false); | |
285 frame_subscriber_callbacks_.back() = base::Bind(callback, present_time); | |
286 return; | |
287 } | 276 } |
288 | |
289 // Start a new copy request. | |
290 frame_subscriber_copy_request_pending_ = true; | |
291 frame_subscriber_callbacks_.push_back(base::Bind(callback, present_time)); | |
292 CopyFromCompositingSurfaceToVideoFrame( | |
293 gfx::Rect(current_frame_size_in_dip_), | |
294 frame, | |
295 base::Bind(&DelegatedFrameHost::DeliverResultForFrameSubscriber, | |
296 AsWeakPtr())); | |
297 } | |
298 | |
299 void DelegatedFrameHost::DeliverResultForFrameSubscriber(bool success) { | |
300 DCHECK(!frame_subscriber_callbacks_.empty()); | |
301 frame_subscriber_callbacks_.front().Run(success); | |
302 frame_subscriber_callbacks_.pop_front(); | |
303 } | 277 } |
304 | 278 |
305 void DelegatedFrameHost::SwapDelegatedFrame( | 279 void DelegatedFrameHost::SwapDelegatedFrame( |
306 uint32 output_surface_id, | 280 uint32 output_surface_id, |
307 scoped_ptr<cc::DelegatedFrameData> frame_data, | 281 scoped_ptr<cc::DelegatedFrameData> frame_data, |
308 float frame_device_scale_factor, | 282 float frame_device_scale_factor, |
309 const std::vector<ui::LatencyInfo>& latency_info) { | 283 const std::vector<ui::LatencyInfo>& latency_info) { |
310 DCHECK(!frame_data->render_pass_list.empty()); | 284 DCHECK(!frame_data->render_pass_list.empty()); |
311 | 285 |
312 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); | 286 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 // We may have had a resize while we had the lock (e.g. if the lock expired, | 847 // We may have had a resize while we had the lock (e.g. if the lock expired, |
874 // or if the UI still gave us some resizes), so make sure we grab a new lock | 848 // or if the UI still gave us some resizes), so make sure we grab a new lock |
875 // if necessary. | 849 // if necessary. |
876 MaybeCreateResizeLock(); | 850 MaybeCreateResizeLock(); |
877 } | 851 } |
878 } | 852 } |
879 | 853 |
880 void DelegatedFrameHost::OnCompositingStarted( | 854 void DelegatedFrameHost::OnCompositingStarted( |
881 ui::Compositor* compositor, base::TimeTicks start_time) { | 855 ui::Compositor* compositor, base::TimeTicks start_time) { |
882 last_draw_ended_ = start_time; | 856 last_draw_ended_ = start_time; |
883 frame_subscriber_copy_request_pending_ = false; | |
884 } | 857 } |
885 | 858 |
886 void DelegatedFrameHost::OnCompositingEnded( | 859 void DelegatedFrameHost::OnCompositingEnded( |
887 ui::Compositor* compositor) { | 860 ui::Compositor* compositor) { |
888 } | 861 } |
889 | 862 |
890 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { | 863 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { |
891 } | 864 } |
892 | 865 |
893 void DelegatedFrameHost::OnCompositingLockStateChanged( | 866 void DelegatedFrameHost::OnCompositingLockStateChanged( |
(...skipping 29 matching lines...) Expand all Loading... |
923 idle_frame_subscriber_textures_.clear(); | 896 idle_frame_subscriber_textures_.clear(); |
924 yuv_readback_pipeline_.reset(); | 897 yuv_readback_pipeline_.reset(); |
925 | 898 |
926 client_->DelegatedFrameHostOnLostCompositorResources(); | 899 client_->DelegatedFrameHostOnLostCompositorResources(); |
927 } | 900 } |
928 | 901 |
929 //////////////////////////////////////////////////////////////////////////////// | 902 //////////////////////////////////////////////////////////////////////////////// |
930 // DelegatedFrameHost, private: | 903 // DelegatedFrameHost, private: |
931 | 904 |
932 DelegatedFrameHost::~DelegatedFrameHost() { | 905 DelegatedFrameHost::~DelegatedFrameHost() { |
933 while (!frame_subscriber_callbacks_.empty()) { | |
934 frame_subscriber_callbacks_.front().Run(false); | |
935 frame_subscriber_callbacks_.pop_front(); | |
936 } | |
937 | |
938 DCHECK(!compositor_); | 906 DCHECK(!compositor_); |
939 ImageTransportFactory::GetInstance()->RemoveObserver(this); | 907 ImageTransportFactory::GetInstance()->RemoveObserver(this); |
940 | 908 |
941 if (!surface_id_.is_null()) | 909 if (!surface_id_.is_null()) |
942 surface_factory_->Destroy(surface_id_); | 910 surface_factory_->Destroy(surface_id_); |
943 if (resource_collection_.get()) | 911 if (resource_collection_.get()) |
944 resource_collection_->SetClient(NULL); | 912 resource_collection_->SetClient(NULL); |
945 | 913 |
946 DCHECK(!vsync_manager_.get()); | 914 DCHECK(!vsync_manager_.get()); |
947 } | 915 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 995 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
1028 new_layer->SetShowSurface( | 996 new_layer->SetShowSurface( |
1029 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 997 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
1030 base::Bind(&RequireCallback, base::Unretained(manager)), | 998 base::Bind(&RequireCallback, base::Unretained(manager)), |
1031 current_surface_size_, current_scale_factor_, | 999 current_surface_size_, current_scale_factor_, |
1032 current_frame_size_in_dip_); | 1000 current_frame_size_in_dip_); |
1033 } | 1001 } |
1034 } | 1002 } |
1035 | 1003 |
1036 } // namespace content | 1004 } // namespace content |
OLD | NEW |