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/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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
78 // DelegatedFrameHost | 80 // DelegatedFrameHost |
79 | 81 |
80 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) | 82 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) |
81 : client_(client), | 83 : client_(client), |
82 use_surfaces_(UseSurfacesEnabled()), | 84 use_surfaces_(UseSurfacesEnabled()), |
83 last_output_surface_id_(0), | 85 last_output_surface_id_(0), |
84 pending_delegated_ack_count_(0), | 86 pending_delegated_ack_count_(0), |
85 skipped_frames_(false), | 87 skipped_frames_(false), |
86 current_scale_factor_(1.f), | 88 current_scale_factor_(1.f), |
87 can_lock_compositor_(YES_CAN_LOCK), | 89 can_lock_compositor_(YES_CAN_LOCK), |
88 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { | 90 delegated_frame_evictor_(new DelegatedFrameEvictor(this)), |
91 begin_frame_scheduling_enabled_(false), | |
92 needs_begin_frames_(false) { | |
89 ImageTransportFactory::GetInstance()->AddObserver(this); | 93 ImageTransportFactory::GetInstance()->AddObserver(this); |
94 #if defined(USE_AURA) | |
95 begin_frame_scheduling_enabled_ = true; | |
96 #endif | |
90 } | 97 } |
91 | 98 |
92 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { | 99 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
93 delegated_frame_evictor_->SetVisible(true); | 100 delegated_frame_evictor_->SetVisible(true); |
94 | 101 |
95 if (surface_id_.is_null() && !frame_provider_.get() && | 102 if (surface_id_.is_null() && !frame_provider_.get() && |
96 !released_front_lock_.get()) { | 103 !released_front_lock_.get()) { |
97 ui::Compositor* compositor = client_->GetCompositor(); | 104 ui::Compositor* compositor = client_->GetCompositor(); |
98 if (compositor) | 105 if (compositor) |
99 released_front_lock_ = compositor->GetCompositorLock(); | 106 released_front_lock_ = compositor->GetCompositorLock(); |
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
858 dfh->AsWeakPtr(), | 865 dfh->AsWeakPtr(), |
859 callback, | 866 callback, |
860 subscriber_texture, | 867 subscriber_texture, |
861 base::Passed(&release_callback)); | 868 base::Passed(&release_callback)); |
862 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), | 869 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), |
863 texture_mailbox.sync_point(), | 870 texture_mailbox.sync_point(), |
864 video_frame.get(), | 871 video_frame.get(), |
865 finished_callback); | 872 finished_callback); |
866 } | 873 } |
867 | 874 |
875 void DelegatedFrameHost::OnSetNeedsBeginFrames(bool needs_begin_frames) { | |
876 DCHECK(begin_frame_scheduling_enabled_); | |
877 | |
878 if (needs_begin_frames_ == needs_begin_frames) | |
879 return; | |
880 | |
881 needs_begin_frames_ = needs_begin_frames; | |
882 | |
883 // In some cases, BeginFrame is needed before |client_|'s window is added | |
884 // in the root window hierarchy. In this case, we creates a synthetic | |
885 // BeginFrameArgs and send it to renderer to trigger rendering. Later, | |
886 // |client_|'s window will be added to root window tree and |this| can be act | |
887 // as a CompositorBeginFrameObserver. | |
888 if (!client_->GetCompositor()) { | |
889 OnSendBeginFrame(cc::BeginFrameArgs::Create( | |
brianderson
2014/12/16 23:23:52
We'll need some guarantee of monotonicity of the f
simonhong
2014/12/18 16:10:38
Removed this. I think sending BeginFrame after thi
| |
890 BEGINFRAME_FROM_HERE, | |
891 base::TimeTicks(), | |
892 gfx::FrameTime::Now(), | |
mithro-old
2014/12/18 16:19:04
EKK! You should never be using Now() in any code r
| |
893 cc::BeginFrameArgs::DefaultInterval(), | |
894 cc::BeginFrameArgs::NORMAL)); | |
895 return; | |
896 } | |
897 | |
898 if (needs_begin_frames) | |
899 StartObservingBeginFrames(); | |
900 else | |
901 StopObservingBeginFrames(); | |
902 } | |
903 | |
868 //////////////////////////////////////////////////////////////////////////////// | 904 //////////////////////////////////////////////////////////////////////////////// |
869 // DelegatedFrameHost, ui::CompositorObserver implementation: | 905 // DelegatedFrameHost, ui::CompositorObserver implementation: |
870 | 906 |
871 void DelegatedFrameHost::OnCompositingDidCommit( | 907 void DelegatedFrameHost::OnCompositingDidCommit( |
872 ui::Compositor* compositor) { | 908 ui::Compositor* compositor) { |
873 RenderWidgetHostImpl* host = client_->GetHost(); | 909 RenderWidgetHostImpl* host = client_->GetHost(); |
874 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 910 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
875 can_lock_compositor_ = YES_CAN_LOCK; | 911 can_lock_compositor_ = YES_CAN_LOCK; |
876 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) | 912 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
877 can_lock_compositor_ = YES_DID_LOCK; | 913 can_lock_compositor_ = YES_DID_LOCK; |
(...skipping 24 matching lines...) Expand all Loading... | |
902 | 938 |
903 void DelegatedFrameHost::OnCompositingLockStateChanged( | 939 void DelegatedFrameHost::OnCompositingLockStateChanged( |
904 ui::Compositor* compositor) { | 940 ui::Compositor* compositor) { |
905 // A compositor lock that is part of a resize lock timed out. We | 941 // A compositor lock that is part of a resize lock timed out. We |
906 // should display a renderer frame. | 942 // should display a renderer frame. |
907 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { | 943 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { |
908 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; | 944 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; |
909 } | 945 } |
910 } | 946 } |
911 | 947 |
948 /////////////////////////////////////////////////////////////////////////////// | |
949 // ui::CompositorBeginFrameObserver implementation. | |
950 void DelegatedFrameHost::OnSendBeginFrame( | |
951 const cc::BeginFrameArgs& args) { | |
952 DCHECK(begin_frame_scheduling_enabled_); | |
953 | |
954 client_->OnSendBeginFrame(args); | |
955 last_sent_begin_frame_args_ = args; | |
956 SetVSyncParams(args.frame_time, args.interval); | |
957 } | |
958 | |
959 /////////////////////////////////////////////////////////////////////////////// | |
960 // ui::CompositorVSyncManager::Observer implementation. | |
912 void DelegatedFrameHost::OnUpdateVSyncParameters( | 961 void DelegatedFrameHost::OnUpdateVSyncParameters( |
913 base::TimeTicks timebase, | 962 base::TimeTicks timebase, |
914 base::TimeDelta interval) { | 963 base::TimeDelta interval) { |
915 vsync_timebase_ = timebase; | 964 DCHECK(!begin_frame_scheduling_enabled_); |
916 vsync_interval_ = interval; | 965 SetVSyncParams(timebase, interval); |
917 RenderWidgetHostImpl* host = client_->GetHost(); | 966 RenderWidgetHostImpl* host = client_->GetHost(); |
918 if (client_->IsVisible()) | 967 if (client_->IsVisible()) |
919 host->UpdateVSyncParameters(timebase, interval); | 968 host->UpdateVSyncParameters(timebase, interval); |
920 } | 969 } |
921 | 970 |
922 //////////////////////////////////////////////////////////////////////////////// | 971 //////////////////////////////////////////////////////////////////////////////// |
923 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: | 972 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: |
924 | 973 |
925 void DelegatedFrameHost::OnLostResources() { | 974 void DelegatedFrameHost::OnLostResources() { |
926 RenderWidgetHostImpl* host = client_->GetHost(); | 975 RenderWidgetHostImpl* host = client_->GetHost(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
962 | 1011 |
963 if (!compositor->HasObserver(this)) | 1012 if (!compositor->HasObserver(this)) |
964 compositor->AddObserver(this); | 1013 compositor->AddObserver(this); |
965 | 1014 |
966 can_lock_compositor_ = NO_PENDING_COMMIT; | 1015 can_lock_compositor_ = NO_PENDING_COMMIT; |
967 if (!callback.is_null()) | 1016 if (!callback.is_null()) |
968 on_compositing_did_commit_callbacks_.push_back(callback); | 1017 on_compositing_did_commit_callbacks_.push_back(callback); |
969 } | 1018 } |
970 | 1019 |
971 void DelegatedFrameHost::AddedToWindow() { | 1020 void DelegatedFrameHost::AddedToWindow() { |
1021 // When |begin_frame_scheduling_enabled_| is true, vsync parameter is not used | |
1022 // in renderer. | |
1023 if (begin_frame_scheduling_enabled_) { | |
1024 if (needs_begin_frames_) | |
1025 StartObservingBeginFrames(); | |
1026 return; | |
1027 } | |
1028 | |
972 ui::Compositor* compositor = client_->GetCompositor(); | 1029 ui::Compositor* compositor = client_->GetCompositor(); |
973 if (compositor) { | 1030 if (compositor) { |
974 DCHECK(!vsync_manager_.get()); | 1031 DCHECK(!vsync_manager_.get()); |
975 vsync_manager_ = compositor->vsync_manager(); | 1032 vsync_manager_ = compositor->vsync_manager(); |
976 vsync_manager_->AddObserver(this); | 1033 vsync_manager_->AddObserver(this); |
977 } | 1034 } |
978 } | 1035 } |
979 | 1036 |
980 void DelegatedFrameHost::RemovingFromWindow() { | 1037 void DelegatedFrameHost::RemovingFromWindow() { |
981 RunOnCommitCallbacks(); | 1038 RunOnCommitCallbacks(); |
982 resize_lock_.reset(); | 1039 resize_lock_.reset(); |
983 client_->GetHost()->WasResized(); | 1040 client_->GetHost()->WasResized(); |
984 ui::Compositor* compositor = client_->GetCompositor(); | 1041 ui::Compositor* compositor = client_->GetCompositor(); |
985 if (compositor && compositor->HasObserver(this)) | 1042 if (compositor && compositor->HasObserver(this)) |
986 compositor->RemoveObserver(this); | 1043 compositor->RemoveObserver(this); |
987 | 1044 |
1045 if (begin_frame_scheduling_enabled_) { | |
1046 DCHECK(!vsync_manager_) << "Not used with unifed BeginFrame"; | |
1047 if (needs_begin_frames_) | |
1048 StopObservingBeginFrames(); | |
1049 return; | |
1050 } | |
1051 | |
988 if (vsync_manager_.get()) { | 1052 if (vsync_manager_.get()) { |
989 vsync_manager_->RemoveObserver(this); | 1053 vsync_manager_->RemoveObserver(this); |
990 vsync_manager_ = NULL; | 1054 vsync_manager_ = NULL; |
991 } | 1055 } |
992 } | 1056 } |
993 | 1057 |
994 void DelegatedFrameHost::LockResources() { | 1058 void DelegatedFrameHost::LockResources() { |
995 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 1059 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
996 delegated_frame_evictor_->LockFrame(); | 1060 delegated_frame_evictor_->LockFrame(); |
997 } | 1061 } |
998 | 1062 |
999 void DelegatedFrameHost::UnlockResources() { | 1063 void DelegatedFrameHost::UnlockResources() { |
1000 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 1064 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
1001 delegated_frame_evictor_->UnlockFrame(); | 1065 delegated_frame_evictor_->UnlockFrame(); |
1002 } | 1066 } |
1003 | 1067 |
1068 void DelegatedFrameHost::StartObservingBeginFrames() { | |
1069 DCHECK(begin_frame_scheduling_enabled_); | |
1070 DCHECK(client_->GetCompositor()); | |
1071 | |
1072 client_->GetCompositor()->AddBeginFrameObserver(this, | |
1073 last_sent_begin_frame_args_); | |
1074 } | |
1075 | |
1076 void DelegatedFrameHost::StopObservingBeginFrames() { | |
1077 DCHECK(begin_frame_scheduling_enabled_); | |
1078 DCHECK(client_->GetCompositor()); | |
1079 | |
1080 client_->GetCompositor()->RemoveBeginFrameObserver(this); | |
1081 } | |
1082 | |
1083 void DelegatedFrameHost::SetVSyncParams(base::TimeTicks timebase, | |
1084 base::TimeDelta interval) { | |
1085 vsync_timebase_ = timebase; | |
1086 vsync_interval_ = interval; | |
1087 } | |
1088 | |
1004 //////////////////////////////////////////////////////////////////////////////// | 1089 //////////////////////////////////////////////////////////////////////////////// |
1005 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: | 1090 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: |
1006 | 1091 |
1007 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, | 1092 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, |
1008 ui::Layer* new_layer) { | 1093 ui::Layer* new_layer) { |
1009 // The new_layer is the one that will be used by our Window, so that's the one | 1094 // The new_layer is the one that will be used by our Window, so that's the one |
1010 // that should keep our frame. old_layer will be returned to the | 1095 // that should keep our frame. old_layer will be returned to the |
1011 // RecreateLayer caller, and should have a copy. | 1096 // RecreateLayer caller, and should have a copy. |
1012 if (frame_provider_.get()) { | 1097 if (frame_provider_.get()) { |
1013 new_layer->SetShowDelegatedContent(frame_provider_.get(), | 1098 new_layer->SetShowDelegatedContent(frame_provider_.get(), |
1014 current_frame_size_in_dip_); | 1099 current_frame_size_in_dip_); |
1015 } | 1100 } |
1016 if (!surface_id_.is_null()) { | 1101 if (!surface_id_.is_null()) { |
1017 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 1102 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
1018 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 1103 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
1019 new_layer->SetShowSurface( | 1104 new_layer->SetShowSurface( |
1020 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 1105 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
1021 base::Bind(&RequireCallback, base::Unretained(manager)), | 1106 base::Bind(&RequireCallback, base::Unretained(manager)), |
1022 current_surface_size_, current_scale_factor_, | 1107 current_surface_size_, current_scale_factor_, |
1023 current_frame_size_in_dip_); | 1108 current_frame_size_in_dip_); |
1024 } | 1109 } |
1025 } | 1110 } |
1026 | 1111 |
1027 } // namespace content | 1112 } // namespace content |
OLD | NEW |