Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: content/browser/renderer_host/delegated_frame_host.cc

Issue 2776973002: DelegatedFrameHost should not create an ExternalBeginFrameSource (Closed)
Patch Set: c Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698