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/renderer_host/delegated_frame_host.h" | 5 #include "content/browser/renderer_host/delegated_frame_host.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
52 skipped_frames_(false), | 52 skipped_frames_(false), |
53 background_color_(SK_ColorRED), | 53 background_color_(SK_ColorRED), |
54 current_scale_factor_(1.f), | 54 current_scale_factor_(1.f), |
55 can_lock_compositor_(YES_CAN_LOCK), | 55 can_lock_compositor_(YES_CAN_LOCK), |
56 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { | 56 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { |
57 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 57 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
58 factory->GetContextFactory()->AddObserver(this); | 58 factory->GetContextFactory()->AddObserver(this); |
59 factory->GetContextFactoryPrivate()->GetSurfaceManager()->RegisterFrameSinkId( | 59 factory->GetContextFactoryPrivate()->GetSurfaceManager()->RegisterFrameSinkId( |
60 frame_sink_id_); | 60 frame_sink_id_); |
61 CreateCompositorFrameSinkSupport(); | 61 CreateCompositorFrameSinkSupport(); |
62 begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this); | |
63 client_->SetBeginFrameSource(begin_frame_source_.get()); | |
64 } | 62 } |
65 | 63 |
66 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { | 64 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
67 delegated_frame_evictor_->SetVisible(true); | 65 delegated_frame_evictor_->SetVisible(true); |
68 | 66 |
69 if (!has_frame_ && !released_front_lock_.get()) { | 67 if (!has_frame_ && !released_front_lock_.get()) { |
70 if (compositor_) | 68 if (compositor_) |
71 released_front_lock_ = compositor_->GetCompositorLock(); | 69 released_front_lock_ = compositor_->GetCompositorLock(); |
72 } | 70 } |
73 | 71 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
224 RenderWidgetHostViewBase* target_view, | 222 RenderWidgetHostViewBase* target_view, |
225 gfx::Point* transformed_point) { | 223 gfx::Point* transformed_point) { |
226 if (!has_frame_) | 224 if (!has_frame_) |
227 return false; | 225 return false; |
228 | 226 |
229 return target_view->TransformPointToLocalCoordSpace( | 227 return target_view->TransformPointToLocalCoordSpace( |
230 point, cc::SurfaceId(frame_sink_id_, local_surface_id_), | 228 point, cc::SurfaceId(frame_sink_id_, local_surface_id_), |
231 transformed_point); | 229 transformed_point); |
232 } | 230 } |
233 | 231 |
232 void DelegatedFrameHost::SetNeedsBeginFrames(bool needs_begin_frames) { | |
233 needs_begin_frame_ = needs_begin_frames; | |
234 support_->SetNeedsBeginFrame(needs_begin_frames); | |
235 } | |
236 | |
237 void DelegatedFrameHost::BeginFrameDidNotSwap(const cc::BeginFrameAck& ack) { | |
238 if (ack.source_id != latest_confirmed_begin_frame_source_id_) { | |
Eric Seckler
2017/03/27 13:05:03
The code that was previously OnDidFinishFrame() st
Saman Sami
2017/03/27 17:10:23
Done.
| |
239 // Source changed, we don't know our freshness anymore. | |
240 latest_confirmed_begin_frame_sequence_number_ = | |
241 cc::BeginFrameArgs::kInvalidFrameNumber; | |
242 } | |
243 | |
244 cc::BeginFrameAck modified_ack = ack; | |
245 if (skipped_frames_) { | |
246 // If we skipped the last frame(s), we didn't incorporate the last | |
247 // CompositorFrame's damage, so need to wait for the next one before | |
248 // confirming newer sequence numbers. | |
249 modified_ack.has_damage = false; | |
250 modified_ack.latest_confirmed_sequence_number = | |
251 latest_confirmed_begin_frame_sequence_number_; | |
252 } else { | |
253 latest_confirmed_begin_frame_source_id_ = modified_ack.source_id; | |
254 latest_confirmed_begin_frame_sequence_number_ = | |
255 modified_ack.latest_confirmed_sequence_number; | |
256 } | |
257 | |
258 // If there was damage, the unmodified ack was sent with the CompositorFrame. | |
259 DCHECK(!modified_ack.has_damage); | |
260 support_->BeginFrameDidNotSwap(modified_ack); | |
261 } | |
262 | |
234 bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { | 263 bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { |
235 // Should skip a frame only when another frame from the renderer is guaranteed | 264 // Should skip a frame only when another frame from the renderer is guaranteed |
236 // to replace it. Otherwise may cause hangs when the renderer is waiting for | 265 // to replace it. Otherwise may cause hangs when the renderer is waiting for |
237 // the completion of latency infos (such as when taking a Snapshot.) | 266 // the completion of latency infos (such as when taking a Snapshot.) |
238 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || | 267 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || |
239 can_lock_compositor_ == NO_PENDING_COMMIT || !resize_lock_.get()) | 268 can_lock_compositor_ == NO_PENDING_COMMIT || !resize_lock_.get()) |
240 return false; | 269 return false; |
241 | 270 |
242 return size_in_dip != resize_lock_->expected_size(); | 271 return size_in_dip != resize_lock_->expected_size(); |
243 } | 272 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
397 cc::ReturnedResourceArray resources; | 426 cc::ReturnedResourceArray resources; |
398 cc::TransferableResource::ReturnResources(frame.resource_list, &resources); | 427 cc::TransferableResource::ReturnResources(frame.resource_list, &resources); |
399 | 428 |
400 skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), | 429 skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), |
401 frame.metadata.latency_info.begin(), | 430 frame.metadata.latency_info.begin(), |
402 frame.metadata.latency_info.end()); | 431 frame.metadata.latency_info.end()); |
403 | 432 |
404 client_->DelegatedFrameHostSendReclaimCompositorResources( | 433 client_->DelegatedFrameHostSendReclaimCompositorResources( |
405 compositor_frame_sink_id, true /* is_swap_ack*/, resources); | 434 compositor_frame_sink_id, true /* is_swap_ack*/, resources); |
406 skipped_frames_ = true; | 435 skipped_frames_ = true; |
436 BeginFrameDidNotSwap(frame.metadata.begin_frame_ack); | |
407 return; | 437 return; |
408 } | 438 } |
409 | 439 |
410 if (skipped_frames_) { | 440 if (skipped_frames_) { |
411 skipped_frames_ = false; | 441 skipped_frames_ = false; |
412 damage_rect = gfx::Rect(frame_size); | 442 damage_rect = gfx::Rect(frame_size); |
413 damage_rect_in_dip = gfx::Rect(frame_size_in_dip); | 443 damage_rect_in_dip = gfx::Rect(frame_size_in_dip); |
414 | 444 |
415 // Give the same damage rect to the compositor. | 445 // Give the same damage rect to the compositor. |
416 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); | 446 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
505 // Frame subscribers are only interested in changes to the target surface, so | 535 // Frame subscribers are only interested in changes to the target surface, so |
506 // do not attempt capture if |damage_rect| is empty. This prevents the draws | 536 // do not attempt capture if |damage_rect| is empty. This prevents the draws |
507 // of parent surfaces from triggering extra frame captures, which can affect | 537 // of parent surfaces from triggering extra frame captures, which can affect |
508 // smoothness. | 538 // smoothness. |
509 if (id != local_surface_id_ || damage_rect.IsEmpty()) | 539 if (id != local_surface_id_ || damage_rect.IsEmpty()) |
510 return; | 540 return; |
511 AttemptFrameSubscriberCapture(damage_rect); | 541 AttemptFrameSubscriberCapture(damage_rect); |
512 } | 542 } |
513 | 543 |
514 void DelegatedFrameHost::OnBeginFrame(const cc::BeginFrameArgs& args) { | 544 void DelegatedFrameHost::OnBeginFrame(const cc::BeginFrameArgs& args) { |
515 begin_frame_source_->OnBeginFrame(args); | 545 client_->OnBeginFrame(args); |
516 } | 546 } |
517 | 547 |
518 void DelegatedFrameHost::EvictDelegatedFrame() { | 548 void DelegatedFrameHost::EvictDelegatedFrame() { |
519 if (!has_frame_) | 549 if (!has_frame_) |
520 return; | 550 return; |
521 client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent(); | 551 client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent(); |
522 support_->EvictFrame(); | 552 support_->EvictFrame(); |
523 has_frame_ = false; | 553 has_frame_ = false; |
524 delegated_frame_evictor_->DiscardedFrame(); | 554 delegated_frame_evictor_->DiscardedFrame(); |
525 UpdateGutters(); | 555 UpdateGutters(); |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
749 } | 779 } |
750 | 780 |
751 //////////////////////////////////////////////////////////////////////////////// | 781 //////////////////////////////////////////////////////////////////////////////// |
752 // DelegatedFrameHost, private: | 782 // DelegatedFrameHost, private: |
753 | 783 |
754 DelegatedFrameHost::~DelegatedFrameHost() { | 784 DelegatedFrameHost::~DelegatedFrameHost() { |
755 DCHECK(!compositor_); | 785 DCHECK(!compositor_); |
756 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 786 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
757 factory->GetContextFactory()->RemoveObserver(this); | 787 factory->GetContextFactory()->RemoveObserver(this); |
758 | 788 |
759 begin_frame_source_.reset(); | |
760 ResetCompositorFrameSinkSupport(); | 789 ResetCompositorFrameSinkSupport(); |
761 | 790 |
762 factory->GetContextFactoryPrivate() | 791 factory->GetContextFactoryPrivate() |
763 ->GetSurfaceManager() | 792 ->GetSurfaceManager() |
764 ->InvalidateFrameSinkId(frame_sink_id_); | 793 ->InvalidateFrameSinkId(frame_sink_id_); |
765 | 794 |
766 DCHECK(!vsync_manager_.get()); | 795 DCHECK(!vsync_manager_.get()); |
767 } | 796 } |
768 | 797 |
769 void DelegatedFrameHost::SetCompositor(ui::Compositor* compositor) { | 798 void DelegatedFrameHost::SetCompositor(ui::Compositor* compositor) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
815 } else { | 844 } else { |
816 request_copy_of_output_callback_for_testing_.Run(std::move(request)); | 845 request_copy_of_output_callback_for_testing_.Run(std::move(request)); |
817 } | 846 } |
818 } | 847 } |
819 | 848 |
820 void DelegatedFrameHost::UnlockResources() { | 849 void DelegatedFrameHost::UnlockResources() { |
821 DCHECK(local_surface_id_.is_valid()); | 850 DCHECK(local_surface_id_.is_valid()); |
822 delegated_frame_evictor_->UnlockFrame(); | 851 delegated_frame_evictor_->UnlockFrame(); |
823 } | 852 } |
824 | 853 |
825 void DelegatedFrameHost::OnNeedsBeginFrames(bool needs_begin_frames) { | |
826 needs_begin_frame_ = needs_begin_frames; | |
827 support_->SetNeedsBeginFrame(needs_begin_frames); | |
828 } | |
829 | |
830 void DelegatedFrameHost::OnDidFinishFrame(const cc::BeginFrameAck& ack) { | |
831 if (ack.source_id != latest_confirmed_begin_frame_source_id_) { | |
832 // Source changed, we don't know our freshness anymore. | |
833 latest_confirmed_begin_frame_sequence_number_ = | |
834 cc::BeginFrameArgs::kInvalidFrameNumber; | |
835 } | |
836 | |
837 cc::BeginFrameAck modified_ack = ack; | |
838 if (skipped_frames_) { | |
839 // If we skipped the last frame(s), we didn't incorporate the last | |
840 // CompositorFrame's damage, so need to wait for the next one before | |
841 // confirming newer sequence numbers. | |
842 modified_ack.has_damage = false; | |
843 modified_ack.latest_confirmed_sequence_number = | |
844 latest_confirmed_begin_frame_sequence_number_; | |
845 } else { | |
846 latest_confirmed_begin_frame_source_id_ = modified_ack.source_id; | |
847 latest_confirmed_begin_frame_sequence_number_ = | |
848 modified_ack.latest_confirmed_sequence_number; | |
849 } | |
850 | |
851 // If there was damage, the unmodified ack was sent with the CompositorFrame. | |
852 if (!modified_ack.has_damage) | |
853 support_->BeginFrameDidNotSwap(modified_ack); | |
854 } | |
855 | |
856 void DelegatedFrameHost::CreateCompositorFrameSinkSupport() { | 854 void DelegatedFrameHost::CreateCompositorFrameSinkSupport() { |
857 DCHECK(!support_); | 855 DCHECK(!support_); |
858 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 856 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
859 support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>( | 857 support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>( |
860 this, factory->GetContextFactoryPrivate()->GetSurfaceManager(), | 858 this, factory->GetContextFactoryPrivate()->GetSurfaceManager(), |
861 frame_sink_id_, false /* is_root */, | 859 frame_sink_id_, false /* is_root */, |
862 false /* handles_frame_sink_id_invalidation */, | 860 false /* handles_frame_sink_id_invalidation */, |
863 true /* needs_sync_points */); | 861 true /* needs_sync_points */); |
864 if (compositor_) | 862 if (compositor_) |
865 compositor_->AddFrameSink(frame_sink_id_); | 863 compositor_->AddFrameSink(frame_sink_id_); |
866 if (needs_begin_frame_) | 864 if (needs_begin_frame_) |
867 support_->SetNeedsBeginFrame(true); | 865 support_->SetNeedsBeginFrame(true); |
868 } | 866 } |
869 | 867 |
870 void DelegatedFrameHost::ResetCompositorFrameSinkSupport() { | 868 void DelegatedFrameHost::ResetCompositorFrameSinkSupport() { |
871 if (!support_) | 869 if (!support_) |
872 return; | 870 return; |
873 if (compositor_) | 871 if (compositor_) |
874 compositor_->RemoveFrameSink(frame_sink_id_); | 872 compositor_->RemoveFrameSink(frame_sink_id_); |
875 support_.reset(); | 873 support_.reset(); |
876 } | 874 } |
877 | 875 |
878 } // namespace content | 876 } // namespace content |
OLD | NEW |