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

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

Issue 775143003: cc: Implement unified BeginFrame on aura (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/compositor/delegated_frame_host.h ('k') | content/browser/renderer_host/render_process_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698