Chromium Code Reviews| 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 |