| 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), |
| 67 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { | 68 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { |
| 68 ImageTransportFactory::GetInstance()->AddObserver(this); | 69 ImageTransportFactory::GetInstance()->AddObserver(this); |
| 69 } | 70 } |
| 70 | 71 |
| 71 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { | 72 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
| 72 delegated_frame_evictor_->SetVisible(true); | 73 delegated_frame_evictor_->SetVisible(true); |
| 73 | 74 |
| 74 if (surface_id_.is_null() && !frame_provider_.get() && | 75 if (surface_id_.is_null() && !frame_provider_.get() && |
| 75 !released_front_lock_.get()) { | 76 !released_front_lock_.get()) { |
| 76 if (compositor_) | 77 if (compositor_) |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 base::TimeTicks present_time; | 261 base::TimeTicks present_time; |
| 261 if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) { | 262 if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) { |
| 262 present_time = now; | 263 present_time = now; |
| 263 } else { | 264 } else { |
| 264 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; | 265 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; |
| 265 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; | 266 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; |
| 266 } | 267 } |
| 267 | 268 |
| 268 scoped_refptr<media::VideoFrame> frame; | 269 scoped_refptr<media::VideoFrame> frame; |
| 269 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 270 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
| 270 if (frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, | 271 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, |
| 271 &frame, &callback)) { | 272 &frame, &callback)) |
| 272 CopyFromCompositingSurfaceToVideoFrame( | 273 return; |
| 273 gfx::Rect(current_frame_size_in_dip_), | 274 |
| 274 frame, | 275 if (frame_subscriber_copy_request_pending_) { |
| 275 base::Bind(callback, present_time)); | 276 // A copy request was made for the previous frame from the renderer, but |
| 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; |
| 276 } | 287 } |
| 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(); |
| 277 } | 303 } |
| 278 | 304 |
| 279 void DelegatedFrameHost::SwapDelegatedFrame( | 305 void DelegatedFrameHost::SwapDelegatedFrame( |
| 280 uint32 output_surface_id, | 306 uint32 output_surface_id, |
| 281 scoped_ptr<cc::DelegatedFrameData> frame_data, | 307 scoped_ptr<cc::DelegatedFrameData> frame_data, |
| 282 float frame_device_scale_factor, | 308 float frame_device_scale_factor, |
| 283 const std::vector<ui::LatencyInfo>& latency_info) { | 309 const std::vector<ui::LatencyInfo>& latency_info) { |
| 284 DCHECK(!frame_data->render_pass_list.empty()); | 310 DCHECK(!frame_data->render_pass_list.empty()); |
| 285 | 311 |
| 286 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); | 312 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 // We may have had a resize while we had the lock (e.g. if the lock expired, | 873 // We may have had a resize while we had the lock (e.g. if the lock expired, |
| 848 // or if the UI still gave us some resizes), so make sure we grab a new lock | 874 // or if the UI still gave us some resizes), so make sure we grab a new lock |
| 849 // if necessary. | 875 // if necessary. |
| 850 MaybeCreateResizeLock(); | 876 MaybeCreateResizeLock(); |
| 851 } | 877 } |
| 852 } | 878 } |
| 853 | 879 |
| 854 void DelegatedFrameHost::OnCompositingStarted( | 880 void DelegatedFrameHost::OnCompositingStarted( |
| 855 ui::Compositor* compositor, base::TimeTicks start_time) { | 881 ui::Compositor* compositor, base::TimeTicks start_time) { |
| 856 last_draw_ended_ = start_time; | 882 last_draw_ended_ = start_time; |
| 883 frame_subscriber_copy_request_pending_ = false; |
| 857 } | 884 } |
| 858 | 885 |
| 859 void DelegatedFrameHost::OnCompositingEnded( | 886 void DelegatedFrameHost::OnCompositingEnded( |
| 860 ui::Compositor* compositor) { | 887 ui::Compositor* compositor) { |
| 861 } | 888 } |
| 862 | 889 |
| 863 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { | 890 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { |
| 864 } | 891 } |
| 865 | 892 |
| 866 void DelegatedFrameHost::OnCompositingLockStateChanged( | 893 void DelegatedFrameHost::OnCompositingLockStateChanged( |
| (...skipping 29 matching lines...) Expand all Loading... |
| 896 idle_frame_subscriber_textures_.clear(); | 923 idle_frame_subscriber_textures_.clear(); |
| 897 yuv_readback_pipeline_.reset(); | 924 yuv_readback_pipeline_.reset(); |
| 898 | 925 |
| 899 client_->DelegatedFrameHostOnLostCompositorResources(); | 926 client_->DelegatedFrameHostOnLostCompositorResources(); |
| 900 } | 927 } |
| 901 | 928 |
| 902 //////////////////////////////////////////////////////////////////////////////// | 929 //////////////////////////////////////////////////////////////////////////////// |
| 903 // DelegatedFrameHost, private: | 930 // DelegatedFrameHost, private: |
| 904 | 931 |
| 905 DelegatedFrameHost::~DelegatedFrameHost() { | 932 DelegatedFrameHost::~DelegatedFrameHost() { |
| 933 while (!frame_subscriber_callbacks_.empty()) { |
| 934 frame_subscriber_callbacks_.front().Run(false); |
| 935 frame_subscriber_callbacks_.pop_front(); |
| 936 } |
| 937 |
| 906 DCHECK(!compositor_); | 938 DCHECK(!compositor_); |
| 907 ImageTransportFactory::GetInstance()->RemoveObserver(this); | 939 ImageTransportFactory::GetInstance()->RemoveObserver(this); |
| 908 | 940 |
| 909 if (!surface_id_.is_null()) | 941 if (!surface_id_.is_null()) |
| 910 surface_factory_->Destroy(surface_id_); | 942 surface_factory_->Destroy(surface_id_); |
| 911 if (resource_collection_.get()) | 943 if (resource_collection_.get()) |
| 912 resource_collection_->SetClient(NULL); | 944 resource_collection_->SetClient(NULL); |
| 913 | 945 |
| 914 DCHECK(!vsync_manager_.get()); | 946 DCHECK(!vsync_manager_.get()); |
| 915 } | 947 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 1027 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
| 996 new_layer->SetShowSurface( | 1028 new_layer->SetShowSurface( |
| 997 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 1029 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
| 998 base::Bind(&RequireCallback, base::Unretained(manager)), | 1030 base::Bind(&RequireCallback, base::Unretained(manager)), |
| 999 current_surface_size_, current_scale_factor_, | 1031 current_surface_size_, current_scale_factor_, |
| 1000 current_frame_size_in_dip_); | 1032 current_frame_size_in_dip_); |
| 1001 } | 1033 } |
| 1002 } | 1034 } |
| 1003 | 1035 |
| 1004 } // namespace content | 1036 } // namespace content |
| OLD | NEW |