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/base/switches.h" | |
10 #include "cc/output/begin_frame_args.h" | |
9 #include "cc/output/compositor_frame.h" | 11 #include "cc/output/compositor_frame.h" |
10 #include "cc/output/compositor_frame_ack.h" | 12 #include "cc/output/compositor_frame_ack.h" |
11 #include "cc/output/copy_output_request.h" | 13 #include "cc/output/copy_output_request.h" |
12 #include "cc/resources/single_release_callback.h" | 14 #include "cc/resources/single_release_callback.h" |
13 #include "cc/resources/texture_mailbox.h" | 15 #include "cc/resources/texture_mailbox.h" |
14 #include "cc/surfaces/surface.h" | 16 #include "cc/surfaces/surface.h" |
15 #include "cc/surfaces/surface_factory.h" | 17 #include "cc/surfaces/surface_factory.h" |
16 #include "cc/surfaces/surface_manager.h" | 18 #include "cc/surfaces/surface_manager.h" |
17 #include "content/browser/compositor/resize_lock.h" | 19 #include "content/browser/compositor/resize_lock.h" |
18 #include "content/browser/gpu/compositor_util.h" | 20 #include "content/browser/gpu/compositor_util.h" |
19 #include "content/common/gpu/client/gl_helper.h" | 21 #include "content/common/gpu/client/gl_helper.h" |
22 #include "content/common/view_messages.h" | |
20 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" | 23 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" |
21 #include "content/public/common/content_switches.h" | 24 #include "content/public/common/content_switches.h" |
22 #include "media/base/video_frame.h" | 25 #include "media/base/video_frame.h" |
23 #include "media/base/video_util.h" | 26 #include "media/base/video_util.h" |
24 #include "skia/ext/image_operations.h" | 27 #include "skia/ext/image_operations.h" |
25 #include "third_party/skia/include/core/SkCanvas.h" | 28 #include "third_party/skia/include/core/SkCanvas.h" |
26 #include "third_party/skia/include/core/SkPaint.h" | 29 #include "third_party/skia/include/core/SkPaint.h" |
27 #include "third_party/skia/include/effects/SkLumaColorFilter.h" | 30 #include "third_party/skia/include/effects/SkLumaColorFilter.h" |
28 #include "ui/gfx/frame_time.h" | 31 #include "ui/gfx/frame_time.h" |
29 #include "ui/gfx/geometry/dip_util.h" | 32 #include "ui/gfx/geometry/dip_util.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
78 // DelegatedFrameHost | 81 // DelegatedFrameHost |
79 | 82 |
80 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) | 83 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) |
81 : client_(client), | 84 : client_(client), |
82 use_surfaces_(UseSurfacesEnabled()), | 85 use_surfaces_(UseSurfacesEnabled()), |
83 last_output_surface_id_(0), | 86 last_output_surface_id_(0), |
84 pending_delegated_ack_count_(0), | 87 pending_delegated_ack_count_(0), |
85 skipped_frames_(false), | 88 skipped_frames_(false), |
86 current_scale_factor_(1.f), | 89 current_scale_factor_(1.f), |
87 can_lock_compositor_(YES_CAN_LOCK), | 90 can_lock_compositor_(YES_CAN_LOCK), |
88 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { | 91 delegated_frame_evictor_(new DelegatedFrameEvictor(this)), |
92 begin_frame_scheduling_enabled_(false), | |
93 needs_begin_frames_(false) { | |
89 ImageTransportFactory::GetInstance()->AddObserver(this); | 94 ImageTransportFactory::GetInstance()->AddObserver(this); |
95 begin_frame_scheduling_enabled_ = | |
96 base::CommandLine::ForCurrentProcess()->HasSwitch( | |
97 cc::switches::kEnableBeginFrameScheduling); | |
90 } | 98 } |
91 | 99 |
92 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { | 100 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
93 delegated_frame_evictor_->SetVisible(true); | 101 delegated_frame_evictor_->SetVisible(true); |
94 | 102 |
95 if (surface_id_.is_null() && !frame_provider_.get() && | 103 if (surface_id_.is_null() && !frame_provider_.get() && |
96 !released_front_lock_.get()) { | 104 !released_front_lock_.get()) { |
97 ui::Compositor* compositor = client_->GetCompositor(); | 105 ui::Compositor* compositor = client_->GetCompositor(); |
98 if (compositor) | 106 if (compositor) |
99 released_front_lock_ = compositor->GetCompositorLock(); | 107 released_front_lock_ = compositor->GetCompositorLock(); |
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
858 dfh->AsWeakPtr(), | 866 dfh->AsWeakPtr(), |
859 callback, | 867 callback, |
860 subscriber_texture, | 868 subscriber_texture, |
861 base::Passed(&release_callback)); | 869 base::Passed(&release_callback)); |
862 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), | 870 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), |
863 texture_mailbox.sync_point(), | 871 texture_mailbox.sync_point(), |
864 video_frame.get(), | 872 video_frame.get(), |
865 finished_callback); | 873 finished_callback); |
866 } | 874 } |
867 | 875 |
876 void DelegatedFrameHost::OnSetNeedsBeginFrames(bool needs_begin_frames) { | |
877 DCHECK(begin_frame_scheduling_enabled_); | |
878 DCHECK(client_->GetCompositor()); | |
879 | |
880 if (needs_begin_frames_ == needs_begin_frames) | |
881 return; | |
882 | |
883 TRACE_EVENT1("cc", | |
884 "DelegatedFrameHost::OnSetNeedsBeginFrames", | |
885 "needs_begin_frames", | |
886 needs_begin_frames); | |
887 | |
888 needs_begin_frames_ = needs_begin_frames; | |
889 | |
890 if (needs_begin_frames) | |
891 StartObservingBeginFrames(); | |
892 else | |
893 StopObservingBeginFrames(); | |
894 } | |
895 | |
868 //////////////////////////////////////////////////////////////////////////////// | 896 //////////////////////////////////////////////////////////////////////////////// |
869 // DelegatedFrameHost, ui::CompositorObserver implementation: | 897 // DelegatedFrameHost, ui::CompositorObserver implementation: |
870 | 898 |
871 void DelegatedFrameHost::OnCompositingDidCommit( | 899 void DelegatedFrameHost::OnCompositingDidCommit( |
872 ui::Compositor* compositor) { | 900 ui::Compositor* compositor) { |
873 RenderWidgetHostImpl* host = client_->GetHost(); | 901 RenderWidgetHostImpl* host = client_->GetHost(); |
874 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 902 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
875 can_lock_compositor_ = YES_CAN_LOCK; | 903 can_lock_compositor_ = YES_CAN_LOCK; |
876 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) | 904 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
877 can_lock_compositor_ = YES_DID_LOCK; | 905 can_lock_compositor_ = YES_DID_LOCK; |
(...skipping 24 matching lines...) Expand all Loading... | |
902 | 930 |
903 void DelegatedFrameHost::OnCompositingLockStateChanged( | 931 void DelegatedFrameHost::OnCompositingLockStateChanged( |
904 ui::Compositor* compositor) { | 932 ui::Compositor* compositor) { |
905 // A compositor lock that is part of a resize lock timed out. We | 933 // A compositor lock that is part of a resize lock timed out. We |
906 // should display a renderer frame. | 934 // should display a renderer frame. |
907 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { | 935 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { |
908 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; | 936 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; |
909 } | 937 } |
910 } | 938 } |
911 | 939 |
940 /////////////////////////////////////////////////////////////////////////////// | |
941 // ui::CompositorBeginFrameObserver implementation. | |
942 void DelegatedFrameHost::OnSendBeginFrame( | |
943 const cc::BeginFrameArgs& args) { | |
944 DCHECK(begin_frame_scheduling_enabled_); | |
945 | |
946 TRACE_EVENT0("cc", "DelegatedFrameHost::OnSendBeginFrame"); | |
brianderson
2014/12/12 01:17:02
I don't think we need a trace per Renderer. A trac
simonhong
2014/12/15 15:37:27
Removed.
| |
947 client_->OnSendBeginFrame(args); | |
948 last_begin_frame_args_ = args; | |
949 SetVSyncParams(args.frame_time, args.interval); | |
950 } | |
951 | |
952 /////////////////////////////////////////////////////////////////////////////// | |
953 // ui::CompositorVSyncManager::Observer implementation. | |
912 void DelegatedFrameHost::OnUpdateVSyncParameters( | 954 void DelegatedFrameHost::OnUpdateVSyncParameters( |
913 base::TimeTicks timebase, | 955 base::TimeTicks timebase, |
914 base::TimeDelta interval) { | 956 base::TimeDelta interval) { |
915 vsync_timebase_ = timebase; | 957 DCHECK(!begin_frame_scheduling_enabled_); |
916 vsync_interval_ = interval; | 958 SetVSyncParams(timebase, interval); |
917 RenderWidgetHostImpl* host = client_->GetHost(); | 959 RenderWidgetHostImpl* host = client_->GetHost(); |
918 if (client_->IsVisible()) | 960 if (client_->IsVisible()) |
919 host->UpdateVSyncParameters(timebase, interval); | 961 host->UpdateVSyncParameters(timebase, interval); |
920 } | 962 } |
921 | 963 |
922 //////////////////////////////////////////////////////////////////////////////// | 964 //////////////////////////////////////////////////////////////////////////////// |
923 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: | 965 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: |
924 | 966 |
925 void DelegatedFrameHost::OnLostResources() { | 967 void DelegatedFrameHost::OnLostResources() { |
926 RenderWidgetHostImpl* host = client_->GetHost(); | 968 RenderWidgetHostImpl* host = client_->GetHost(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
962 | 1004 |
963 if (!compositor->HasObserver(this)) | 1005 if (!compositor->HasObserver(this)) |
964 compositor->AddObserver(this); | 1006 compositor->AddObserver(this); |
965 | 1007 |
966 can_lock_compositor_ = NO_PENDING_COMMIT; | 1008 can_lock_compositor_ = NO_PENDING_COMMIT; |
967 if (!callback.is_null()) | 1009 if (!callback.is_null()) |
968 on_compositing_did_commit_callbacks_.push_back(callback); | 1010 on_compositing_did_commit_callbacks_.push_back(callback); |
969 } | 1011 } |
970 | 1012 |
971 void DelegatedFrameHost::AddedToWindow() { | 1013 void DelegatedFrameHost::AddedToWindow() { |
1014 // When |begin_frame_scheduling_enabled_| is true, vsync parameter is not used | |
1015 // in renderer. | |
1016 if (begin_frame_scheduling_enabled_) { | |
1017 if (needs_begin_frames_) | |
1018 StartObservingBeginFrames(); | |
1019 return; | |
1020 } | |
1021 | |
972 ui::Compositor* compositor = client_->GetCompositor(); | 1022 ui::Compositor* compositor = client_->GetCompositor(); |
973 if (compositor) { | 1023 if (compositor) { |
974 DCHECK(!vsync_manager_.get()); | 1024 DCHECK(!vsync_manager_.get()); |
975 vsync_manager_ = compositor->vsync_manager(); | 1025 vsync_manager_ = compositor->vsync_manager(); |
976 vsync_manager_->AddObserver(this); | 1026 vsync_manager_->AddObserver(this); |
977 } | 1027 } |
978 } | 1028 } |
979 | 1029 |
980 void DelegatedFrameHost::RemovingFromWindow() { | 1030 void DelegatedFrameHost::RemovingFromWindow() { |
981 RunOnCommitCallbacks(); | 1031 RunOnCommitCallbacks(); |
982 resize_lock_.reset(); | 1032 resize_lock_.reset(); |
983 client_->GetHost()->WasResized(); | 1033 client_->GetHost()->WasResized(); |
984 ui::Compositor* compositor = client_->GetCompositor(); | 1034 ui::Compositor* compositor = client_->GetCompositor(); |
985 if (compositor && compositor->HasObserver(this)) | 1035 if (compositor && compositor->HasObserver(this)) |
986 compositor->RemoveObserver(this); | 1036 compositor->RemoveObserver(this); |
987 | 1037 |
1038 if (begin_frame_scheduling_enabled_) { | |
1039 DCHECK(!vsync_manager_) << "Not used with unifed BeginFrame"; | |
1040 if (needs_begin_frames_) | |
1041 StopObservingBeginFrames(); | |
1042 return; | |
1043 } | |
1044 | |
988 if (vsync_manager_.get()) { | 1045 if (vsync_manager_.get()) { |
989 vsync_manager_->RemoveObserver(this); | 1046 vsync_manager_->RemoveObserver(this); |
990 vsync_manager_ = NULL; | 1047 vsync_manager_ = NULL; |
991 } | 1048 } |
992 } | 1049 } |
993 | 1050 |
994 void DelegatedFrameHost::LockResources() { | 1051 void DelegatedFrameHost::LockResources() { |
995 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 1052 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
996 delegated_frame_evictor_->LockFrame(); | 1053 delegated_frame_evictor_->LockFrame(); |
997 } | 1054 } |
998 | 1055 |
999 void DelegatedFrameHost::UnlockResources() { | 1056 void DelegatedFrameHost::UnlockResources() { |
1000 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 1057 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
1001 delegated_frame_evictor_->UnlockFrame(); | 1058 delegated_frame_evictor_->UnlockFrame(); |
1002 } | 1059 } |
1003 | 1060 |
1061 void DelegatedFrameHost::StartObservingBeginFrames() { | |
1062 DCHECK(begin_frame_scheduling_enabled_); | |
1063 DCHECK(client_->GetCompositor()); | |
1064 | |
1065 client_->GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_); | |
1066 } | |
1067 | |
1068 void DelegatedFrameHost::StopObservingBeginFrames() { | |
1069 DCHECK(begin_frame_scheduling_enabled_); | |
1070 DCHECK(client_->GetCompositor()); | |
1071 | |
1072 client_->GetCompositor()->RemoveBeginFrameObserver(this); | |
1073 } | |
1074 | |
1075 void DelegatedFrameHost::SetVSyncParams(base::TimeTicks timebase, | |
1076 base::TimeDelta interval) { | |
1077 vsync_timebase_ = timebase; | |
1078 vsync_interval_ = interval; | |
1079 } | |
1080 | |
1004 //////////////////////////////////////////////////////////////////////////////// | 1081 //////////////////////////////////////////////////////////////////////////////// |
1005 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: | 1082 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: |
1006 | 1083 |
1007 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, | 1084 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, |
1008 ui::Layer* new_layer) { | 1085 ui::Layer* new_layer) { |
1009 // The new_layer is the one that will be used by our Window, so that's the one | 1086 // 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 | 1087 // that should keep our frame. old_layer will be returned to the |
1011 // RecreateLayer caller, and should have a copy. | 1088 // RecreateLayer caller, and should have a copy. |
1012 if (frame_provider_.get()) { | 1089 if (frame_provider_.get()) { |
1013 new_layer->SetShowDelegatedContent(frame_provider_.get(), | 1090 new_layer->SetShowDelegatedContent(frame_provider_.get(), |
1014 current_frame_size_in_dip_); | 1091 current_frame_size_in_dip_); |
1015 } | 1092 } |
1016 if (!surface_id_.is_null()) { | 1093 if (!surface_id_.is_null()) { |
1017 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 1094 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
1018 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 1095 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
1019 new_layer->SetShowSurface( | 1096 new_layer->SetShowSurface( |
1020 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 1097 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
1021 base::Bind(&RequireCallback, base::Unretained(manager)), | 1098 base::Bind(&RequireCallback, base::Unretained(manager)), |
1022 current_surface_size_, current_scale_factor_, | 1099 current_surface_size_, current_scale_factor_, |
1023 current_frame_size_in_dip_); | 1100 current_frame_size_in_dip_); |
1024 } | 1101 } |
1025 } | 1102 } |
1026 | 1103 |
1027 } // namespace content | 1104 } // namespace content |
OLD | NEW |