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

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

Issue 423773002: Unified BeginFrame scheduling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: WIP in mac and android Created 6 years, 3 months 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 | Annotate | Revision Log
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_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 736 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 dfh->AsWeakPtr(), 756 dfh->AsWeakPtr(),
756 callback, 757 callback,
757 subscriber_texture, 758 subscriber_texture,
758 base::Passed(&release_callback)); 759 base::Passed(&release_callback));
759 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), 760 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(),
760 texture_mailbox.sync_point(), 761 texture_mailbox.sync_point(),
761 video_frame.get(), 762 video_frame.get(),
762 finished_callback); 763 finished_callback);
763 } 764 }
764 765
766 void DelegatedFrameHost::UpdateVSyncParameters(const cc::BeginFrameArgs& args) {
767 vsync_timebase_ = args.frame_time;
768 vsync_interval_ = args.interval;
769 }
770
765 //////////////////////////////////////////////////////////////////////////////// 771 ////////////////////////////////////////////////////////////////////////////////
766 // DelegatedFrameHost, ui::CompositorObserver implementation: 772 // DelegatedFrameHost, ui::CompositorObserver implementation:
767 773
768 void DelegatedFrameHost::OnCompositingDidCommit( 774 void DelegatedFrameHost::OnCompositingDidCommit(
769 ui::Compositor* compositor) { 775 ui::Compositor* compositor) {
770 RenderWidgetHostImpl* host = client_->GetHost(); 776 RenderWidgetHostImpl* host = client_->GetHost();
771 if (can_lock_compositor_ == NO_PENDING_COMMIT) { 777 if (can_lock_compositor_ == NO_PENDING_COMMIT) {
772 can_lock_compositor_ = YES_CAN_LOCK; 778 can_lock_compositor_ = YES_CAN_LOCK;
773 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) 779 if (resize_lock_.get() && resize_lock_->GrabDeferredLock())
774 can_lock_compositor_ = YES_DID_LOCK; 780 can_lock_compositor_ = YES_DID_LOCK;
(...skipping 24 matching lines...) Expand all
799 805
800 void DelegatedFrameHost::OnCompositingLockStateChanged( 806 void DelegatedFrameHost::OnCompositingLockStateChanged(
801 ui::Compositor* compositor) { 807 ui::Compositor* compositor) {
802 // A compositor lock that is part of a resize lock timed out. We 808 // A compositor lock that is part of a resize lock timed out. We
803 // should display a renderer frame. 809 // should display a renderer frame.
804 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { 810 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) {
805 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; 811 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME;
806 } 812 }
807 } 813 }
808 814
809 void DelegatedFrameHost::OnUpdateVSyncParameters(
810 base::TimeTicks timebase,
811 base::TimeDelta interval) {
812 vsync_timebase_ = timebase;
813 vsync_interval_ = interval;
814 RenderWidgetHostImpl* host = client_->GetHost();
815 if (client_->IsVisible())
816 host->UpdateVSyncParameters(timebase, interval);
817 }
818
819 //////////////////////////////////////////////////////////////////////////////// 815 ////////////////////////////////////////////////////////////////////////////////
820 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: 816 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation:
821 817
822 void DelegatedFrameHost::OnLostResources() { 818 void DelegatedFrameHost::OnLostResources() {
823 RenderWidgetHostImpl* host = client_->GetHost(); 819 RenderWidgetHostImpl* host = client_->GetHost();
824 if (frame_provider_.get() || !surface_id_.is_null()) 820 if (frame_provider_.get() || !surface_id_.is_null())
825 EvictDelegatedFrame(); 821 EvictDelegatedFrame();
826 idle_frame_subscriber_textures_.clear(); 822 idle_frame_subscriber_textures_.clear();
827 yuv_readback_pipeline_.reset(); 823 yuv_readback_pipeline_.reset();
828 824
829 host->ScheduleComposite(); 825 host->ScheduleComposite();
830 } 826 }
831 827
832 //////////////////////////////////////////////////////////////////////////////// 828 ////////////////////////////////////////////////////////////////////////////////
833 // DelegatedFrameHost, private: 829 // DelegatedFrameHost, private:
834 830
835 DelegatedFrameHost::~DelegatedFrameHost() { 831 DelegatedFrameHost::~DelegatedFrameHost() {
836 ImageTransportFactory::GetInstance()->RemoveObserver(this); 832 ImageTransportFactory::GetInstance()->RemoveObserver(this);
837 833
838 if (!surface_id_.is_null()) 834 if (!surface_id_.is_null())
839 surface_factory_->Destroy(surface_id_); 835 surface_factory_->Destroy(surface_id_);
840 if (resource_collection_.get()) 836 if (resource_collection_.get())
841 resource_collection_->SetClient(NULL); 837 resource_collection_->SetClient(NULL);
842
843 DCHECK(!vsync_manager_);
844 } 838 }
845 839
846 void DelegatedFrameHost::RunOnCommitCallbacks() { 840 void DelegatedFrameHost::RunOnCommitCallbacks() {
847 for (std::vector<base::Closure>::const_iterator 841 for (std::vector<base::Closure>::const_iterator
848 it = on_compositing_did_commit_callbacks_.begin(); 842 it = on_compositing_did_commit_callbacks_.begin();
849 it != on_compositing_did_commit_callbacks_.end(); ++it) { 843 it != on_compositing_did_commit_callbacks_.end(); ++it) {
850 it->Run(); 844 it->Run();
851 } 845 }
852 on_compositing_did_commit_callbacks_.clear(); 846 on_compositing_did_commit_callbacks_.clear();
853 } 847 }
854 848
855 void DelegatedFrameHost::AddOnCommitCallbackAndDisableLocks( 849 void DelegatedFrameHost::AddOnCommitCallbackAndDisableLocks(
856 const base::Closure& callback) { 850 const base::Closure& callback) {
857 ui::Compositor* compositor = client_->GetCompositor(); 851 ui::Compositor* compositor = client_->GetCompositor();
858 DCHECK(compositor); 852 DCHECK(compositor);
859 853
860 if (!compositor->HasObserver(this)) 854 if (!compositor->HasObserver(this))
861 compositor->AddObserver(this); 855 compositor->AddObserver(this);
862 856
863 can_lock_compositor_ = NO_PENDING_COMMIT; 857 can_lock_compositor_ = NO_PENDING_COMMIT;
864 on_compositing_did_commit_callbacks_.push_back(callback); 858 on_compositing_did_commit_callbacks_.push_back(callback);
865 } 859 }
866 860
867 void DelegatedFrameHost::AddedToWindow() { 861 void DelegatedFrameHost::AddedToWindow() {
868 ui::Compositor* compositor = client_->GetCompositor();
869 if (compositor) {
870 DCHECK(!vsync_manager_);
871 vsync_manager_ = compositor->vsync_manager();
872 vsync_manager_->AddObserver(this);
873 }
874 } 862 }
875 863
876 void DelegatedFrameHost::RemovingFromWindow() { 864 void DelegatedFrameHost::RemovingFromWindow() {
877 RunOnCommitCallbacks(); 865 RunOnCommitCallbacks();
878 resize_lock_.reset(); 866 resize_lock_.reset();
879 client_->GetHost()->WasResized(); 867 client_->GetHost()->WasResized();
880 ui::Compositor* compositor = client_->GetCompositor(); 868 ui::Compositor* compositor = client_->GetCompositor();
881 if (compositor && compositor->HasObserver(this)) 869 if (compositor && compositor->HasObserver(this))
882 compositor->RemoveObserver(this); 870 compositor->RemoveObserver(this);
883
884 if (vsync_manager_) {
885 vsync_manager_->RemoveObserver(this);
886 vsync_manager_ = NULL;
887 }
888 } 871 }
889 872
890 void DelegatedFrameHost::LockResources() { 873 void DelegatedFrameHost::LockResources() {
891 DCHECK(frame_provider_ || !surface_id_.is_null()); 874 DCHECK(frame_provider_ || !surface_id_.is_null());
892 delegated_frame_evictor_->LockFrame(); 875 delegated_frame_evictor_->LockFrame();
893 } 876 }
894 877
895 void DelegatedFrameHost::UnlockResources() { 878 void DelegatedFrameHost::UnlockResources() {
896 DCHECK(frame_provider_ || !surface_id_.is_null()); 879 DCHECK(frame_provider_ || !surface_id_.is_null());
897 delegated_frame_evictor_->UnlockFrame(); 880 delegated_frame_evictor_->UnlockFrame();
(...skipping 10 matching lines...) Expand all
908 if (frame_provider_.get()) { 891 if (frame_provider_.get()) {
909 new_layer->SetShowDelegatedContent(frame_provider_.get(), 892 new_layer->SetShowDelegatedContent(frame_provider_.get(),
910 current_frame_size_in_dip_); 893 current_frame_size_in_dip_);
911 } 894 }
912 if (!surface_id_.is_null()) { 895 if (!surface_id_.is_null()) {
913 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); 896 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_);
914 } 897 }
915 } 898 }
916 899
917 } // namespace content 900 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698