| 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/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
| 10 #include "cc/output/compositor_frame_ack.h" | 10 #include "cc/output/compositor_frame_ack.h" |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 if (resource_collection_.get()) { | 325 if (resource_collection_.get()) { |
| 326 resource_collection_->SetClient(NULL); | 326 resource_collection_->SetClient(NULL); |
| 327 | 327 |
| 328 if (resource_collection_->LoseAllResources()) | 328 if (resource_collection_->LoseAllResources()) |
| 329 SendReturnedDelegatedResources(last_output_surface_id_); | 329 SendReturnedDelegatedResources(last_output_surface_id_); |
| 330 | 330 |
| 331 resource_collection_ = NULL; | 331 resource_collection_ = NULL; |
| 332 } | 332 } |
| 333 last_output_surface_id_ = output_surface_id; | 333 last_output_surface_id_ = output_surface_id; |
| 334 } | 334 } |
| 335 bool modified_layers = false; |
| 335 if (frame_size.IsEmpty()) { | 336 if (frame_size.IsEmpty()) { |
| 336 DCHECK(frame_data->resource_list.empty()); | 337 DCHECK(frame_data->resource_list.empty()); |
| 337 EvictDelegatedFrame(); | 338 EvictDelegatedFrame(); |
| 339 modified_layers = true; |
| 338 } else { | 340 } else { |
| 339 if (use_surfaces_) { | 341 if (use_surfaces_) { |
| 340 if (!surface_factory_) { | 342 if (!surface_factory_) { |
| 341 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 343 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 342 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 344 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
| 343 id_allocator_ = factory->CreateSurfaceIdAllocator(); | 345 id_allocator_ = factory->CreateSurfaceIdAllocator(); |
| 344 surface_factory_ = | 346 surface_factory_ = |
| 345 make_scoped_ptr(new cc::SurfaceFactory(manager, this)); | 347 make_scoped_ptr(new cc::SurfaceFactory(manager, this)); |
| 346 } | 348 } |
| 347 if (surface_id_.is_null() || frame_size != current_surface_size_ || | 349 if (surface_id_.is_null() || frame_size != current_surface_size_ || |
| 348 frame_size_in_dip != current_frame_size_in_dip_) { | 350 frame_size_in_dip != current_frame_size_in_dip_) { |
| 349 if (!surface_id_.is_null()) | 351 if (!surface_id_.is_null()) |
| 350 surface_factory_->Destroy(surface_id_); | 352 surfaces_to_destroy_after_commit_.push_back(surface_id_); |
| 351 surface_id_ = id_allocator_->GenerateId(); | 353 surface_id_ = id_allocator_->GenerateId(); |
| 352 surface_factory_->Create(surface_id_, frame_size); | 354 surface_factory_->Create(surface_id_, frame_size); |
| 353 client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip); | 355 client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip); |
| 354 current_surface_size_ = frame_size; | 356 current_surface_size_ = frame_size; |
| 357 modified_layers = true; |
| 355 } | 358 } |
| 356 scoped_ptr<cc::CompositorFrame> compositor_frame = | 359 scoped_ptr<cc::CompositorFrame> compositor_frame = |
| 357 make_scoped_ptr(new cc::CompositorFrame()); | 360 make_scoped_ptr(new cc::CompositorFrame()); |
| 358 compositor_frame->delegated_frame_data = frame_data.Pass(); | 361 compositor_frame->delegated_frame_data = frame_data.Pass(); |
| 359 surface_factory_->SubmitFrame(surface_id_, compositor_frame.Pass()); | 362 surface_factory_->SubmitFrame(surface_id_, compositor_frame.Pass()); |
| 360 } else { | 363 } else { |
| 361 if (!resource_collection_) { | 364 if (!resource_collection_) { |
| 362 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 365 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 363 resource_collection_->SetClient(this); | 366 resource_collection_->SetClient(this); |
| 364 } | 367 } |
| 365 // If the physical frame size changes, we need a new |frame_provider_|. If | 368 // If the physical frame size changes, we need a new |frame_provider_|. If |
| 366 // the physical frame size is the same, but the size in DIP changed, we | 369 // the physical frame size is the same, but the size in DIP changed, we |
| 367 // need to adjust the scale at which the frames will be drawn, and we do | 370 // need to adjust the scale at which the frames will be drawn, and we do |
| 368 // this by making a new |frame_provider_| also to ensure the scale change | 371 // this by making a new |frame_provider_| also to ensure the scale change |
| 369 // is presented in sync with the new frame content. | 372 // is presented in sync with the new frame content. |
| 370 if (!frame_provider_.get() || | 373 if (!frame_provider_.get() || |
| 371 frame_size != frame_provider_->frame_size() || | 374 frame_size != frame_provider_->frame_size() || |
| 372 frame_size_in_dip != current_frame_size_in_dip_) { | 375 frame_size_in_dip != current_frame_size_in_dip_) { |
| 373 frame_provider_ = new cc::DelegatedFrameProvider( | 376 frame_provider_ = new cc::DelegatedFrameProvider( |
| 374 resource_collection_.get(), frame_data.Pass()); | 377 resource_collection_.get(), frame_data.Pass()); |
| 375 client_->GetLayer()->SetShowDelegatedContent(frame_provider_.get(), | 378 client_->GetLayer()->SetShowDelegatedContent(frame_provider_.get(), |
| 376 frame_size_in_dip); | 379 frame_size_in_dip); |
| 377 } else { | 380 } else { |
| 378 frame_provider_->SetFrameData(frame_data.Pass()); | 381 frame_provider_->SetFrameData(frame_data.Pass()); |
| 379 } | 382 } |
| 383 modified_layers = true; |
| 380 } | 384 } |
| 381 } | 385 } |
| 382 released_front_lock_ = NULL; | 386 released_front_lock_ = NULL; |
| 383 current_frame_size_in_dip_ = frame_size_in_dip; | 387 current_frame_size_in_dip_ = frame_size_in_dip; |
| 384 CheckResizeLock(); | 388 CheckResizeLock(); |
| 385 | 389 |
| 386 client_->SchedulePaintInRect(damage_rect_in_dip); | 390 if (modified_layers) { |
| 391 // TODO(jbauman): Need to always tell the window observer about the |
| 392 // damage. |
| 393 client_->SchedulePaintInRect(damage_rect_in_dip); |
| 394 } |
| 387 | 395 |
| 388 pending_delegated_ack_count_++; | 396 pending_delegated_ack_count_++; |
| 389 | 397 |
| 390 ui::Compositor* compositor = client_->GetCompositor(); | 398 ui::Compositor* compositor = client_->GetCompositor(); |
| 391 if (!compositor) { | 399 if (!compositor || !modified_layers) { |
| 392 SendDelegatedFrameAck(output_surface_id); | 400 SendDelegatedFrameAck(output_surface_id); |
| 393 } else { | 401 } else { |
| 394 std::vector<ui::LatencyInfo>::const_iterator it; | 402 std::vector<ui::LatencyInfo>::const_iterator it; |
| 395 for (it = latency_info.begin(); it != latency_info.end(); ++it) | 403 for (it = latency_info.begin(); it != latency_info.end(); ++it) |
| 396 compositor->SetLatencyInfo(*it); | 404 compositor->SetLatencyInfo(*it); |
| 397 // If we've previously skipped any latency infos add them. | 405 // If we've previously skipped any latency infos add them. |
| 398 for (it = skipped_latency_info_list_.begin(); | 406 for (it = skipped_latency_info_list_.begin(); |
| 399 it != skipped_latency_info_list_.end(); | 407 it != skipped_latency_info_list_.end(); |
| 400 ++it) | 408 ++it) |
| 401 compositor->SetLatencyInfo(*it); | 409 compositor->SetLatencyInfo(*it); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 resources.end(), | 469 resources.end(), |
| 462 std::back_inserter(surface_returned_resources_)); | 470 std::back_inserter(surface_returned_resources_)); |
| 463 if (!pending_delegated_ack_count_) | 471 if (!pending_delegated_ack_count_) |
| 464 SendReturnedDelegatedResources(last_output_surface_id_); | 472 SendReturnedDelegatedResources(last_output_surface_id_); |
| 465 } | 473 } |
| 466 | 474 |
| 467 void DelegatedFrameHost::EvictDelegatedFrame() { | 475 void DelegatedFrameHost::EvictDelegatedFrame() { |
| 468 client_->GetLayer()->SetShowPaintedContent(); | 476 client_->GetLayer()->SetShowPaintedContent(); |
| 469 frame_provider_ = NULL; | 477 frame_provider_ = NULL; |
| 470 if (!surface_id_.is_null()) { | 478 if (!surface_id_.is_null()) { |
| 471 surface_factory_->Destroy(surface_id_); | 479 surfaces_to_destroy_after_commit_.push_back(surface_id_); |
| 472 surface_id_ = cc::SurfaceId(); | 480 surface_id_ = cc::SurfaceId(); |
| 473 } | 481 } |
| 474 delegated_frame_evictor_->DiscardedFrame(); | 482 delegated_frame_evictor_->DiscardedFrame(); |
| 475 } | 483 } |
| 476 | 484 |
| 477 // static | 485 // static |
| 478 void DelegatedFrameHost::CopyFromCompositingSurfaceHasResult( | 486 void DelegatedFrameHost::CopyFromCompositingSurfaceHasResult( |
| 479 const gfx::Size& dst_size_in_pixel, | 487 const gfx::Size& dst_size_in_pixel, |
| 480 const SkColorType color_type, | 488 const SkColorType color_type, |
| 481 const base::Callback<void(bool, const SkBitmap&)>& callback, | 489 const base::Callback<void(bool, const SkBitmap&)>& callback, |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 749 texture_mailbox.sync_point(), | 757 texture_mailbox.sync_point(), |
| 750 video_frame.get(), | 758 video_frame.get(), |
| 751 finished_callback); | 759 finished_callback); |
| 752 } | 760 } |
| 753 | 761 |
| 754 //////////////////////////////////////////////////////////////////////////////// | 762 //////////////////////////////////////////////////////////////////////////////// |
| 755 // DelegatedFrameHost, ui::CompositorObserver implementation: | 763 // DelegatedFrameHost, ui::CompositorObserver implementation: |
| 756 | 764 |
| 757 void DelegatedFrameHost::OnCompositingDidCommit( | 765 void DelegatedFrameHost::OnCompositingDidCommit( |
| 758 ui::Compositor* compositor) { | 766 ui::Compositor* compositor) { |
| 767 std::copy(surfaces_to_destroy_after_commit_.begin(), |
| 768 surfaces_to_destroy_after_commit_.end(), |
| 769 std::back_inserter(surfaces_to_destroy_after_swap_)); |
| 770 surfaces_to_destroy_after_commit_.clear(); |
| 759 RenderWidgetHostImpl* host = client_->GetHost(); | 771 RenderWidgetHostImpl* host = client_->GetHost(); |
| 760 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 772 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
| 761 can_lock_compositor_ = YES_CAN_LOCK; | 773 can_lock_compositor_ = YES_CAN_LOCK; |
| 762 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) | 774 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
| 763 can_lock_compositor_ = YES_DID_LOCK; | 775 can_lock_compositor_ = YES_DID_LOCK; |
| 764 } | 776 } |
| 765 RunOnCommitCallbacks(); | 777 RunOnCommitCallbacks(); |
| 766 if (resize_lock_ && | 778 if (resize_lock_ && |
| 767 resize_lock_->expected_size() == current_frame_size_in_dip_) { | 779 resize_lock_->expected_size() == current_frame_size_in_dip_) { |
| 768 resize_lock_.reset(); | 780 resize_lock_.reset(); |
| 769 host->WasResized(); | 781 host->WasResized(); |
| 770 // We may have had a resize while we had the lock (e.g. if the lock expired, | 782 // We may have had a resize while we had the lock (e.g. if the lock expired, |
| 771 // or if the UI still gave us some resizes), so make sure we grab a new lock | 783 // or if the UI still gave us some resizes), so make sure we grab a new lock |
| 772 // if necessary. | 784 // if necessary. |
| 773 MaybeCreateResizeLock(); | 785 MaybeCreateResizeLock(); |
| 774 } | 786 } |
| 775 } | 787 } |
| 776 | 788 |
| 777 void DelegatedFrameHost::OnCompositingStarted( | 789 void DelegatedFrameHost::OnCompositingStarted( |
| 778 ui::Compositor* compositor, base::TimeTicks start_time) { | 790 ui::Compositor* compositor, base::TimeTicks start_time) { |
| 779 last_draw_ended_ = start_time; | 791 last_draw_ended_ = start_time; |
| 780 } | 792 } |
| 781 | 793 |
| 782 void DelegatedFrameHost::OnCompositingEnded( | 794 void DelegatedFrameHost::OnCompositingEnded( |
| 783 ui::Compositor* compositor) { | 795 ui::Compositor* compositor) { |
| 796 for (std::vector<cc::SurfaceId>::iterator it = |
| 797 surfaces_to_destroy_after_swap_.begin(); |
| 798 it != surfaces_to_destroy_after_swap_.end(); |
| 799 ++it) { |
| 800 surface_factory_->Destroy(*it); |
| 801 } |
| 802 surfaces_to_destroy_after_swap_.clear(); |
| 784 } | 803 } |
| 785 | 804 |
| 786 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { | 805 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { |
| 787 } | 806 } |
| 788 | 807 |
| 789 void DelegatedFrameHost::OnCompositingLockStateChanged( | 808 void DelegatedFrameHost::OnCompositingLockStateChanged( |
| 790 ui::Compositor* compositor) { | 809 ui::Compositor* compositor) { |
| 791 // A compositor lock that is part of a resize lock timed out. We | 810 // A compositor lock that is part of a resize lock timed out. We |
| 792 // should display a renderer frame. | 811 // should display a renderer frame. |
| 793 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { | 812 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 817 } | 836 } |
| 818 | 837 |
| 819 //////////////////////////////////////////////////////////////////////////////// | 838 //////////////////////////////////////////////////////////////////////////////// |
| 820 // DelegatedFrameHost, private: | 839 // DelegatedFrameHost, private: |
| 821 | 840 |
| 822 DelegatedFrameHost::~DelegatedFrameHost() { | 841 DelegatedFrameHost::~DelegatedFrameHost() { |
| 823 ImageTransportFactory::GetInstance()->RemoveObserver(this); | 842 ImageTransportFactory::GetInstance()->RemoveObserver(this); |
| 824 | 843 |
| 825 if (!surface_id_.is_null()) | 844 if (!surface_id_.is_null()) |
| 826 surface_factory_->Destroy(surface_id_); | 845 surface_factory_->Destroy(surface_id_); |
| 846 for (std::vector<cc::SurfaceId>::iterator it = |
| 847 surfaces_to_destroy_after_commit_.begin(); |
| 848 it != surfaces_to_destroy_after_commit_.end(); |
| 849 ++it) { |
| 850 surface_factory_->Destroy(*it); |
| 851 } |
| 852 surfaces_to_destroy_after_commit_.clear(); |
| 853 for (std::vector<cc::SurfaceId>::iterator it = |
| 854 surfaces_to_destroy_after_swap_.begin(); |
| 855 it != surfaces_to_destroy_after_swap_.end(); |
| 856 ++it) { |
| 857 surface_factory_->Destroy(*it); |
| 858 } |
| 859 surfaces_to_destroy_after_swap_.clear(); |
| 827 if (resource_collection_.get()) | 860 if (resource_collection_.get()) |
| 828 resource_collection_->SetClient(NULL); | 861 resource_collection_->SetClient(NULL); |
| 829 | 862 |
| 830 DCHECK(!vsync_manager_); | 863 DCHECK(!vsync_manager_); |
| 831 } | 864 } |
| 832 | 865 |
| 833 void DelegatedFrameHost::RunOnCommitCallbacks() { | 866 void DelegatedFrameHost::RunOnCommitCallbacks() { |
| 834 for (std::vector<base::Closure>::const_iterator | 867 for (std::vector<base::Closure>::const_iterator |
| 835 it = on_compositing_did_commit_callbacks_.begin(); | 868 it = on_compositing_did_commit_callbacks_.begin(); |
| 836 it != on_compositing_did_commit_callbacks_.end(); ++it) { | 869 it != on_compositing_did_commit_callbacks_.end(); ++it) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 new_layer->SetShowDelegatedContent(frame_provider_.get(), | 929 new_layer->SetShowDelegatedContent(frame_provider_.get(), |
| 897 current_frame_size_in_dip_); | 930 current_frame_size_in_dip_); |
| 898 } | 931 } |
| 899 if (!surface_id_.is_null()) { | 932 if (!surface_id_.is_null()) { |
| 900 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); | 933 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); |
| 901 } | 934 } |
| 902 } | 935 } |
| 903 | 936 |
| 904 } // namespace content | 937 } // namespace content |
| 905 | 938 |
| OLD | NEW |