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_factory.h" | 15 #include "cc/surfaces/surface_factory.h" |
15 #include "content/browser/compositor/resize_lock.h" | 16 #include "content/browser/compositor/resize_lock.h" |
16 #include "content/browser/gpu/compositor_util.h" | 17 #include "content/browser/gpu/compositor_util.h" |
17 #include "content/common/gpu/client/gl_helper.h" | 18 #include "content/common/gpu/client/gl_helper.h" |
18 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" | 19 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 dfh->AsWeakPtr(), | 834 dfh->AsWeakPtr(), |
834 callback, | 835 callback, |
835 subscriber_texture, | 836 subscriber_texture, |
836 base::Passed(&release_callback)); | 837 base::Passed(&release_callback)); |
837 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), | 838 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), |
838 texture_mailbox.sync_point(), | 839 texture_mailbox.sync_point(), |
839 video_frame.get(), | 840 video_frame.get(), |
840 finished_callback); | 841 finished_callback); |
841 } | 842 } |
842 | 843 |
| 844 void DelegatedFrameHost::UpdateVSyncParameters(const cc::BeginFrameArgs& args) { |
| 845 vsync_timebase_ = args.frame_time; |
| 846 vsync_interval_ = args.interval; |
| 847 } |
| 848 |
843 //////////////////////////////////////////////////////////////////////////////// | 849 //////////////////////////////////////////////////////////////////////////////// |
844 // DelegatedFrameHost, ui::CompositorObserver implementation: | 850 // DelegatedFrameHost, ui::CompositorObserver implementation: |
845 | 851 |
846 void DelegatedFrameHost::OnCompositingDidCommit( | 852 void DelegatedFrameHost::OnCompositingDidCommit( |
847 ui::Compositor* compositor) { | 853 ui::Compositor* compositor) { |
848 RenderWidgetHostImpl* host = client_->GetHost(); | 854 RenderWidgetHostImpl* host = client_->GetHost(); |
849 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 855 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
850 can_lock_compositor_ = YES_CAN_LOCK; | 856 can_lock_compositor_ = YES_CAN_LOCK; |
851 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) | 857 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
852 can_lock_compositor_ = YES_DID_LOCK; | 858 can_lock_compositor_ = YES_DID_LOCK; |
(...skipping 24 matching lines...) Expand all Loading... |
877 | 883 |
878 void DelegatedFrameHost::OnCompositingLockStateChanged( | 884 void DelegatedFrameHost::OnCompositingLockStateChanged( |
879 ui::Compositor* compositor) { | 885 ui::Compositor* compositor) { |
880 // A compositor lock that is part of a resize lock timed out. We | 886 // A compositor lock that is part of a resize lock timed out. We |
881 // should display a renderer frame. | 887 // should display a renderer frame. |
882 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { | 888 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { |
883 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; | 889 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; |
884 } | 890 } |
885 } | 891 } |
886 | 892 |
887 void DelegatedFrameHost::OnUpdateVSyncParameters( | |
888 base::TimeTicks timebase, | |
889 base::TimeDelta interval) { | |
890 vsync_timebase_ = timebase; | |
891 vsync_interval_ = interval; | |
892 RenderWidgetHostImpl* host = client_->GetHost(); | |
893 if (client_->IsVisible()) | |
894 host->UpdateVSyncParameters(timebase, interval); | |
895 } | |
896 | |
897 //////////////////////////////////////////////////////////////////////////////// | 893 //////////////////////////////////////////////////////////////////////////////// |
898 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: | 894 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: |
899 | 895 |
900 void DelegatedFrameHost::OnLostResources() { | 896 void DelegatedFrameHost::OnLostResources() { |
901 RenderWidgetHostImpl* host = client_->GetHost(); | 897 RenderWidgetHostImpl* host = client_->GetHost(); |
902 if (frame_provider_.get() || !surface_id_.is_null()) | 898 if (frame_provider_.get() || !surface_id_.is_null()) |
903 EvictDelegatedFrame(); | 899 EvictDelegatedFrame(); |
904 idle_frame_subscriber_textures_.clear(); | 900 idle_frame_subscriber_textures_.clear(); |
905 yuv_readback_pipeline_.reset(); | 901 yuv_readback_pipeline_.reset(); |
906 | 902 |
907 host->ScheduleComposite(); | 903 host->ScheduleComposite(); |
908 } | 904 } |
909 | 905 |
910 //////////////////////////////////////////////////////////////////////////////// | 906 //////////////////////////////////////////////////////////////////////////////// |
911 // DelegatedFrameHost, private: | 907 // DelegatedFrameHost, private: |
912 | 908 |
913 DelegatedFrameHost::~DelegatedFrameHost() { | 909 DelegatedFrameHost::~DelegatedFrameHost() { |
914 ImageTransportFactory::GetInstance()->RemoveObserver(this); | 910 ImageTransportFactory::GetInstance()->RemoveObserver(this); |
915 | 911 |
916 if (!surface_id_.is_null()) | 912 if (!surface_id_.is_null()) |
917 surface_factory_->Destroy(surface_id_); | 913 surface_factory_->Destroy(surface_id_); |
918 if (resource_collection_.get()) | 914 if (resource_collection_.get()) |
919 resource_collection_->SetClient(NULL); | 915 resource_collection_->SetClient(NULL); |
920 | |
921 DCHECK(!vsync_manager_.get()); | |
922 } | 916 } |
923 | 917 |
924 void DelegatedFrameHost::RunOnCommitCallbacks() { | 918 void DelegatedFrameHost::RunOnCommitCallbacks() { |
925 for (std::vector<base::Closure>::const_iterator | 919 for (std::vector<base::Closure>::const_iterator |
926 it = on_compositing_did_commit_callbacks_.begin(); | 920 it = on_compositing_did_commit_callbacks_.begin(); |
927 it != on_compositing_did_commit_callbacks_.end(); ++it) { | 921 it != on_compositing_did_commit_callbacks_.end(); ++it) { |
928 it->Run(); | 922 it->Run(); |
929 } | 923 } |
930 on_compositing_did_commit_callbacks_.clear(); | 924 on_compositing_did_commit_callbacks_.clear(); |
931 } | 925 } |
932 | 926 |
933 void DelegatedFrameHost::AddOnCommitCallbackAndDisableLocks( | 927 void DelegatedFrameHost::AddOnCommitCallbackAndDisableLocks( |
934 const base::Closure& callback) { | 928 const base::Closure& callback) { |
935 ui::Compositor* compositor = client_->GetCompositor(); | 929 ui::Compositor* compositor = client_->GetCompositor(); |
936 DCHECK(compositor); | 930 DCHECK(compositor); |
937 | 931 |
938 if (!compositor->HasObserver(this)) | 932 if (!compositor->HasObserver(this)) |
939 compositor->AddObserver(this); | 933 compositor->AddObserver(this); |
940 | 934 |
941 can_lock_compositor_ = NO_PENDING_COMMIT; | 935 can_lock_compositor_ = NO_PENDING_COMMIT; |
942 on_compositing_did_commit_callbacks_.push_back(callback); | 936 on_compositing_did_commit_callbacks_.push_back(callback); |
943 } | 937 } |
944 | 938 |
945 void DelegatedFrameHost::AddedToWindow() { | 939 void DelegatedFrameHost::AddedToWindow() { |
946 ui::Compositor* compositor = client_->GetCompositor(); | |
947 if (compositor) { | |
948 DCHECK(!vsync_manager_.get()); | |
949 vsync_manager_ = compositor->vsync_manager(); | |
950 vsync_manager_->AddObserver(this); | |
951 } | |
952 } | 940 } |
953 | 941 |
954 void DelegatedFrameHost::RemovingFromWindow() { | 942 void DelegatedFrameHost::RemovingFromWindow() { |
955 RunOnCommitCallbacks(); | 943 RunOnCommitCallbacks(); |
956 resize_lock_.reset(); | 944 resize_lock_.reset(); |
957 client_->GetHost()->WasResized(); | 945 client_->GetHost()->WasResized(); |
958 ui::Compositor* compositor = client_->GetCompositor(); | 946 ui::Compositor* compositor = client_->GetCompositor(); |
959 if (compositor && compositor->HasObserver(this)) | 947 if (compositor && compositor->HasObserver(this)) |
960 compositor->RemoveObserver(this); | 948 compositor->RemoveObserver(this); |
961 | |
962 if (vsync_manager_.get()) { | |
963 vsync_manager_->RemoveObserver(this); | |
964 vsync_manager_ = NULL; | |
965 } | |
966 } | 949 } |
967 | 950 |
968 void DelegatedFrameHost::LockResources() { | 951 void DelegatedFrameHost::LockResources() { |
969 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 952 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
970 delegated_frame_evictor_->LockFrame(); | 953 delegated_frame_evictor_->LockFrame(); |
971 } | 954 } |
972 | 955 |
973 void DelegatedFrameHost::UnlockResources() { | 956 void DelegatedFrameHost::UnlockResources() { |
974 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 957 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
975 delegated_frame_evictor_->UnlockFrame(); | 958 delegated_frame_evictor_->UnlockFrame(); |
(...skipping 10 matching lines...) Expand all Loading... |
986 if (frame_provider_.get()) { | 969 if (frame_provider_.get()) { |
987 new_layer->SetShowDelegatedContent(frame_provider_.get(), | 970 new_layer->SetShowDelegatedContent(frame_provider_.get(), |
988 current_frame_size_in_dip_); | 971 current_frame_size_in_dip_); |
989 } | 972 } |
990 if (!surface_id_.is_null()) { | 973 if (!surface_id_.is_null()) { |
991 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); | 974 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); |
992 } | 975 } |
993 } | 976 } |
994 | 977 |
995 } // namespace content | 978 } // namespace content |
OLD | NEW |