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

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

Issue 1000503002: Add BeginFrameObserverProxy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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/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/begin_frame_args.h"
9 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h" 11 #include "cc/output/compositor_frame_ack.h"
11 #include "cc/output/copy_output_request.h" 12 #include "cc/output/copy_output_request.h"
12 #include "cc/resources/single_release_callback.h" 13 #include "cc/resources/single_release_callback.h"
13 #include "cc/resources/texture_mailbox.h" 14 #include "cc/resources/texture_mailbox.h"
14 #include "cc/surfaces/surface.h" 15 #include "cc/surfaces/surface.h"
15 #include "cc/surfaces/surface_factory.h" 16 #include "cc/surfaces/surface_factory.h"
16 #include "cc/surfaces/surface_manager.h" 17 #include "cc/surfaces/surface_manager.h"
17 #include "content/browser/compositor/resize_lock.h" 18 #include "content/browser/compositor/resize_lock.h"
18 #include "content/browser/gpu/compositor_util.h" 19 #include "content/browser/gpu/compositor_util.h"
19 #include "content/common/gpu/client/gl_helper.h" 20 #include "content/common/gpu/client/gl_helper.h"
21 #include "content/common/view_messages.h"
20 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" 22 #include "content/public/browser/render_widget_host_view_frame_subscriber.h"
21 #include "content/public/common/content_switches.h" 23 #include "content/public/common/content_switches.h"
22 #include "media/base/video_frame.h" 24 #include "media/base/video_frame.h"
23 #include "media/base/video_util.h" 25 #include "media/base/video_util.h"
24 #include "skia/ext/image_operations.h" 26 #include "skia/ext/image_operations.h"
25 #include "third_party/skia/include/core/SkCanvas.h" 27 #include "third_party/skia/include/core/SkCanvas.h"
26 #include "third_party/skia/include/core/SkPaint.h" 28 #include "third_party/skia/include/core/SkPaint.h"
27 #include "third_party/skia/include/effects/SkLumaColorFilter.h" 29 #include "third_party/skia/include/effects/SkLumaColorFilter.h"
28 #include "ui/gfx/frame_time.h" 30 #include "ui/gfx/frame_time.h"
29 #include "ui/gfx/geometry/dip_util.h" 31 #include "ui/gfx/geometry/dip_util.h"
(...skipping 18 matching lines...) Expand all
48 return; 50 return;
49 } 51 }
50 surface->AddDestructionDependency(sequence); 52 surface->AddDestructionDependency(sequence);
51 } 53 }
52 54
53 } // namespace 55 } // namespace
54 56
55 //////////////////////////////////////////////////////////////////////////////// 57 ////////////////////////////////////////////////////////////////////////////////
56 // DelegatedFrameHost 58 // DelegatedFrameHost
57 59
58 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) 60 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client,
61 bool begin_frame_scheduling_enabled)
59 : client_(client), 62 : client_(client),
60 compositor_(nullptr), 63 compositor_(nullptr),
61 use_surfaces_(UseSurfacesEnabled()), 64 use_surfaces_(UseSurfacesEnabled()),
62 last_output_surface_id_(0), 65 last_output_surface_id_(0),
63 pending_delegated_ack_count_(0), 66 pending_delegated_ack_count_(0),
64 skipped_frames_(false), 67 skipped_frames_(false),
65 current_scale_factor_(1.f), 68 current_scale_factor_(1.f),
66 can_lock_compositor_(YES_CAN_LOCK), 69 can_lock_compositor_(YES_CAN_LOCK),
67 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { 70 delegated_frame_evictor_(new DelegatedFrameEvictor(this)),
71 begin_frame_scheduling_enabled_(begin_frame_scheduling_enabled),
72 needs_begin_frames_(false) {
68 ImageTransportFactory::GetInstance()->AddObserver(this); 73 ImageTransportFactory::GetInstance()->AddObserver(this);
69 } 74 }
70 75
71 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { 76 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) {
72 delegated_frame_evictor_->SetVisible(true); 77 delegated_frame_evictor_->SetVisible(true);
73 78
74 if (surface_id_.is_null() && !frame_provider_.get() && 79 if (surface_id_.is_null() && !frame_provider_.get() &&
75 !released_front_lock_.get()) { 80 !released_front_lock_.get()) {
76 if (compositor_) 81 if (compositor_)
77 released_front_lock_ = compositor_->GetCompositorLock(); 82 released_front_lock_ = compositor_->GetCompositorLock();
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 callback, 827 callback,
823 subscriber_texture, 828 subscriber_texture,
824 base::Passed(&release_callback)); 829 base::Passed(&release_callback));
825 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), 830 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(),
826 texture_mailbox.sync_point(), 831 texture_mailbox.sync_point(),
827 video_frame.get(), 832 video_frame.get(),
828 region_in_frame.origin(), 833 region_in_frame.origin(),
829 finished_callback); 834 finished_callback);
830 } 835 }
831 836
837 void DelegatedFrameHost::OnSetNeedsBeginFrames(bool needs_begin_frames) {
838 DCHECK(begin_frame_scheduling_enabled_);
839
840 if (needs_begin_frames_ == needs_begin_frames)
841 return;
842
843 needs_begin_frames_ = needs_begin_frames;
844
845 // In some cases, BeginFrame is needed before |client_|'s window is added
846 // in the root window hierarchy.
847 if (!compositor_)
848 return;
849
850 if (needs_begin_frames)
851 StartObservingBeginFrames();
852 else
853 StopObservingBeginFrames();
854 }
855
832 //////////////////////////////////////////////////////////////////////////////// 856 ////////////////////////////////////////////////////////////////////////////////
833 // DelegatedFrameHost, ui::CompositorObserver implementation: 857 // DelegatedFrameHost, ui::CompositorObserver implementation:
834 858
835 void DelegatedFrameHost::OnCompositingDidCommit( 859 void DelegatedFrameHost::OnCompositingDidCommit(
836 ui::Compositor* compositor) { 860 ui::Compositor* compositor) {
837 if (can_lock_compositor_ == NO_PENDING_COMMIT) { 861 if (can_lock_compositor_ == NO_PENDING_COMMIT) {
838 can_lock_compositor_ = YES_CAN_LOCK; 862 can_lock_compositor_ = YES_CAN_LOCK;
839 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) 863 if (resize_lock_.get() && resize_lock_->GrabDeferredLock())
840 can_lock_compositor_ = YES_DID_LOCK; 864 can_lock_compositor_ = YES_DID_LOCK;
841 } 865 }
(...skipping 29 matching lines...) Expand all
871 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; 895 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME;
872 } 896 }
873 } 897 }
874 898
875 void DelegatedFrameHost::OnCompositingShuttingDown(ui::Compositor* compositor) { 899 void DelegatedFrameHost::OnCompositingShuttingDown(ui::Compositor* compositor) {
876 DCHECK_EQ(compositor, compositor_); 900 DCHECK_EQ(compositor, compositor_);
877 ResetCompositor(); 901 ResetCompositor();
878 DCHECK(!compositor_); 902 DCHECK(!compositor_);
879 } 903 }
880 904
905 ///////////////////////////////////////////////////////////////////////////////
906 // ui::CompositorBeginFrameObserver implementation.
881 void DelegatedFrameHost::OnUpdateVSyncParameters( 907 void DelegatedFrameHost::OnUpdateVSyncParameters(
882 base::TimeTicks timebase, 908 base::TimeTicks timebase,
883 base::TimeDelta interval) { 909 base::TimeDelta interval) {
884 vsync_timebase_ = timebase; 910 vsync_timebase_ = timebase;
885 vsync_interval_ = interval; 911 vsync_interval_ = interval;
886 if (client_->DelegatedFrameHostIsVisible()) 912 if (client_->DelegatedFrameHostIsVisible())
887 client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval); 913 client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval);
888 } 914 }
889 915
916 void DelegatedFrameHost::OnSendBeginFrame(const cc::BeginFrameArgs& args) {
917 DCHECK(begin_frame_scheduling_enabled_);
918
919 client_->DelegatedFrameHostSendBeginFrame(args);
920 last_sent_begin_frame_args_ = args;
921 vsync_timebase_ = args.frame_time;
922 vsync_interval_ = args.interval;
923 }
924
890 //////////////////////////////////////////////////////////////////////////////// 925 ////////////////////////////////////////////////////////////////////////////////
891 // DelegatedFrameHost, ImageTransportFactoryObserver implementation: 926 // DelegatedFrameHost, ImageTransportFactoryObserver implementation:
892 927
893 void DelegatedFrameHost::OnLostResources() { 928 void DelegatedFrameHost::OnLostResources() {
894 if (frame_provider_.get() || !surface_id_.is_null()) 929 if (frame_provider_.get() || !surface_id_.is_null())
895 EvictDelegatedFrame(); 930 EvictDelegatedFrame();
896 idle_frame_subscriber_textures_.clear(); 931 idle_frame_subscriber_textures_.clear();
897 yuv_readback_pipeline_.reset(); 932 yuv_readback_pipeline_.reset();
898 933
899 client_->DelegatedFrameHostOnLostCompositorResources(); 934 client_->DelegatedFrameHostOnLostCompositorResources();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 969
935 void DelegatedFrameHost::SetCompositor(ui::Compositor* compositor) { 970 void DelegatedFrameHost::SetCompositor(ui::Compositor* compositor) {
936 DCHECK(!compositor_); 971 DCHECK(!compositor_);
937 if (!compositor) 972 if (!compositor)
938 return; 973 return;
939 compositor_ = compositor; 974 compositor_ = compositor;
940 compositor_->AddObserver(this); 975 compositor_->AddObserver(this);
941 DCHECK(!vsync_manager_.get()); 976 DCHECK(!vsync_manager_.get());
942 vsync_manager_ = compositor_->vsync_manager(); 977 vsync_manager_ = compositor_->vsync_manager();
943 vsync_manager_->AddObserver(this); 978 vsync_manager_->AddObserver(this);
979
980 if (begin_frame_scheduling_enabled_ && needs_begin_frames_)
981 StartObservingBeginFrames();
944 } 982 }
945 983
946 void DelegatedFrameHost::ResetCompositor() { 984 void DelegatedFrameHost::ResetCompositor() {
947 if (!compositor_) 985 if (!compositor_)
948 return; 986 return;
949 RunOnCommitCallbacks(); 987 RunOnCommitCallbacks();
950 if (resize_lock_) { 988 if (resize_lock_) {
951 resize_lock_.reset(); 989 resize_lock_.reset();
952 client_->DelegatedFrameHostResizeLockWasReleased(); 990 client_->DelegatedFrameHostResizeLockWasReleased();
953 } 991 }
954 if (compositor_->HasObserver(this)) 992 if (compositor_->HasObserver(this))
955 compositor_->RemoveObserver(this); 993 compositor_->RemoveObserver(this);
956 if (vsync_manager_.get()) { 994 if (vsync_manager_.get()) {
957 vsync_manager_->RemoveObserver(this); 995 vsync_manager_->RemoveObserver(this);
958 vsync_manager_ = NULL; 996 vsync_manager_ = NULL;
959 } 997 }
998
999 if (begin_frame_scheduling_enabled_ && needs_begin_frames_)
1000 StopObservingBeginFrames();
1001
960 compositor_ = nullptr; 1002 compositor_ = nullptr;
961 } 1003 }
962 1004
963 void DelegatedFrameHost::LockResources() { 1005 void DelegatedFrameHost::LockResources() {
964 DCHECK(frame_provider_.get() || !surface_id_.is_null()); 1006 DCHECK(frame_provider_.get() || !surface_id_.is_null());
965 delegated_frame_evictor_->LockFrame(); 1007 delegated_frame_evictor_->LockFrame();
966 } 1008 }
967 1009
968 void DelegatedFrameHost::RequestCopyOfOutput( 1010 void DelegatedFrameHost::RequestCopyOfOutput(
969 scoped_ptr<cc::CopyOutputRequest> request) { 1011 scoped_ptr<cc::CopyOutputRequest> request) {
970 if (!request_copy_of_output_callback_for_testing_.is_null()) 1012 if (!request_copy_of_output_callback_for_testing_.is_null())
971 request_copy_of_output_callback_for_testing_.Run(request.Pass()); 1013 request_copy_of_output_callback_for_testing_.Run(request.Pass());
972 else 1014 else
973 client_->DelegatedFrameHostGetLayer()->RequestCopyOfOutput(request.Pass()); 1015 client_->DelegatedFrameHostGetLayer()->RequestCopyOfOutput(request.Pass());
974 } 1016 }
975 1017
976 void DelegatedFrameHost::UnlockResources() { 1018 void DelegatedFrameHost::UnlockResources() {
977 DCHECK(frame_provider_.get() || !surface_id_.is_null()); 1019 DCHECK(frame_provider_.get() || !surface_id_.is_null());
978 delegated_frame_evictor_->UnlockFrame(); 1020 delegated_frame_evictor_->UnlockFrame();
979 } 1021 }
980 1022
1023 void DelegatedFrameHost::StartObservingBeginFrames() {
1024 DCHECK(begin_frame_scheduling_enabled_);
1025 DCHECK(compositor_);
1026
1027 compositor_->AddBeginFrameObserver(this, last_sent_begin_frame_args_);
1028 }
1029
1030 void DelegatedFrameHost::StopObservingBeginFrames() {
1031 DCHECK(begin_frame_scheduling_enabled_);
1032 DCHECK(compositor_);
1033
1034 compositor_->RemoveBeginFrameObserver(this);
1035 }
1036
981 //////////////////////////////////////////////////////////////////////////////// 1037 ////////////////////////////////////////////////////////////////////////////////
982 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: 1038 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation:
983 1039
984 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, 1040 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer,
985 ui::Layer* new_layer) { 1041 ui::Layer* new_layer) {
986 // The new_layer is the one that will be used by our Window, so that's the one 1042 // The new_layer is the one that will be used by our Window, so that's the one
987 // that should keep our frame. old_layer will be returned to the 1043 // that should keep our frame. old_layer will be returned to the
988 // RecreateLayer caller, and should have a copy. 1044 // RecreateLayer caller, and should have a copy.
989 if (frame_provider_.get()) { 1045 if (frame_provider_.get()) {
990 new_layer->SetShowDelegatedContent(frame_provider_.get(), 1046 new_layer->SetShowDelegatedContent(frame_provider_.get(),
991 current_frame_size_in_dip_); 1047 current_frame_size_in_dip_);
992 } 1048 }
993 if (!surface_id_.is_null()) { 1049 if (!surface_id_.is_null()) {
994 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 1050 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
995 cc::SurfaceManager* manager = factory->GetSurfaceManager(); 1051 cc::SurfaceManager* manager = factory->GetSurfaceManager();
996 new_layer->SetShowSurface( 1052 new_layer->SetShowSurface(
997 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), 1053 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)),
998 base::Bind(&RequireCallback, base::Unretained(manager)), 1054 base::Bind(&RequireCallback, base::Unretained(manager)),
999 current_surface_size_, current_scale_factor_, 1055 current_surface_size_, current_scale_factor_,
1000 current_frame_size_in_dip_); 1056 current_frame_size_in_dip_);
1001 } 1057 }
1002 } 1058 }
1003 1059
1004 } // namespace content 1060 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698