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