Chromium Code Reviews| 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 |