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_callbacks_.empty() && |
hubbe
2015/03/10 17:06:53
The empty() call should not be required, as it sho
miu
2015/03/10 20:54:07
Done.
| |
275 base::Bind(callback, present_time)); | 276 frame_subscriber_copy_request_pending_) { |
277 // A copy request was made for the previous frame from the renderer, but | |
278 // drawing never started (which executes the request). Therefore, the | |
279 // prior request is to be aborted. This de-duping check must be done after | |
280 // the call to ShouldCaptureFrame() above, since the frame subscriber makes | |
281 // decisions based on the renderer's intentions, and not the performance of | |
282 // the browser compositor. | |
283 frame_subscriber_callbacks_.back().Run(false); | |
284 frame_subscriber_callbacks_.back() = base::Bind(callback, present_time); | |
285 return; | |
276 } | 286 } |
287 | |
288 // Start a new copy request. | |
289 frame_subscriber_copy_request_pending_ = true; | |
290 frame_subscriber_callbacks_.push_back(base::Bind(callback, present_time)); | |
291 CopyFromCompositingSurfaceToVideoFrame( | |
292 gfx::Rect(current_frame_size_in_dip_), | |
293 frame, | |
294 base::Bind(&DelegatedFrameHost::DeliverResultForFrameSubscriber, | |
295 AsWeakPtr())); | |
296 } | |
297 | |
298 void DelegatedFrameHost::DeliverResultForFrameSubscriber(bool success) { | |
299 if (frame_subscriber_callbacks_.empty()) { | |
300 NOTREACHED(); | |
danakj
2015/03/10 17:17:17
Don't do "NOTREACHED(); return;" please. Either DC
miu
2015/03/10 20:54:07
Done.
| |
301 return; | |
302 } | |
303 frame_subscriber_callbacks_.front().Run(success); | |
304 frame_subscriber_callbacks_.pop_front(); | |
277 } | 305 } |
278 | 306 |
279 void DelegatedFrameHost::SwapDelegatedFrame( | 307 void DelegatedFrameHost::SwapDelegatedFrame( |
280 uint32 output_surface_id, | 308 uint32 output_surface_id, |
281 scoped_ptr<cc::DelegatedFrameData> frame_data, | 309 scoped_ptr<cc::DelegatedFrameData> frame_data, |
282 float frame_device_scale_factor, | 310 float frame_device_scale_factor, |
283 const std::vector<ui::LatencyInfo>& latency_info) { | 311 const std::vector<ui::LatencyInfo>& latency_info) { |
284 DCHECK(!frame_data->render_pass_list.empty()); | 312 DCHECK(!frame_data->render_pass_list.empty()); |
285 | 313 |
286 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); | 314 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, | 875 // 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 | 876 // or if the UI still gave us some resizes), so make sure we grab a new lock |
849 // if necessary. | 877 // if necessary. |
850 MaybeCreateResizeLock(); | 878 MaybeCreateResizeLock(); |
851 } | 879 } |
852 } | 880 } |
853 | 881 |
854 void DelegatedFrameHost::OnCompositingStarted( | 882 void DelegatedFrameHost::OnCompositingStarted( |
855 ui::Compositor* compositor, base::TimeTicks start_time) { | 883 ui::Compositor* compositor, base::TimeTicks start_time) { |
856 last_draw_ended_ = start_time; | 884 last_draw_ended_ = start_time; |
885 frame_subscriber_copy_request_pending_ = false; | |
857 } | 886 } |
858 | 887 |
859 void DelegatedFrameHost::OnCompositingEnded( | 888 void DelegatedFrameHost::OnCompositingEnded( |
860 ui::Compositor* compositor) { | 889 ui::Compositor* compositor) { |
861 } | 890 } |
862 | 891 |
863 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { | 892 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { |
864 } | 893 } |
865 | 894 |
866 void DelegatedFrameHost::OnCompositingLockStateChanged( | 895 void DelegatedFrameHost::OnCompositingLockStateChanged( |
(...skipping 29 matching lines...) Expand all Loading... | |
896 idle_frame_subscriber_textures_.clear(); | 925 idle_frame_subscriber_textures_.clear(); |
897 yuv_readback_pipeline_.reset(); | 926 yuv_readback_pipeline_.reset(); |
898 | 927 |
899 client_->DelegatedFrameHostOnLostCompositorResources(); | 928 client_->DelegatedFrameHostOnLostCompositorResources(); |
900 } | 929 } |
901 | 930 |
902 //////////////////////////////////////////////////////////////////////////////// | 931 //////////////////////////////////////////////////////////////////////////////// |
903 // DelegatedFrameHost, private: | 932 // DelegatedFrameHost, private: |
904 | 933 |
905 DelegatedFrameHost::~DelegatedFrameHost() { | 934 DelegatedFrameHost::~DelegatedFrameHost() { |
935 while (!frame_subscriber_callbacks_.empty()) { | |
936 frame_subscriber_callbacks_.front().Run(false); | |
937 frame_subscriber_callbacks_.pop_front(); | |
938 } | |
939 | |
906 DCHECK(!compositor_); | 940 DCHECK(!compositor_); |
907 ImageTransportFactory::GetInstance()->RemoveObserver(this); | 941 ImageTransportFactory::GetInstance()->RemoveObserver(this); |
908 | 942 |
909 if (!surface_id_.is_null()) | 943 if (!surface_id_.is_null()) |
910 surface_factory_->Destroy(surface_id_); | 944 surface_factory_->Destroy(surface_id_); |
911 if (resource_collection_.get()) | 945 if (resource_collection_.get()) |
912 resource_collection_->SetClient(NULL); | 946 resource_collection_->SetClient(NULL); |
913 | 947 |
914 DCHECK(!vsync_manager_.get()); | 948 DCHECK(!vsync_manager_.get()); |
915 } | 949 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
995 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 1029 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
996 new_layer->SetShowSurface( | 1030 new_layer->SetShowSurface( |
997 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 1031 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
998 base::Bind(&RequireCallback, base::Unretained(manager)), | 1032 base::Bind(&RequireCallback, base::Unretained(manager)), |
999 current_surface_size_, current_scale_factor_, | 1033 current_surface_size_, current_scale_factor_, |
1000 current_frame_size_in_dip_); | 1034 current_frame_size_in_dip_); |
1001 } | 1035 } |
1002 } | 1036 } |
1003 | 1037 |
1004 } // namespace content | 1038 } // namespace content |
OLD | NEW |