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 18 matching lines...) Expand all Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |