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

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 2317753002: cc: Abstract the LayerTreeHost. (Closed)
Patch Set: Rebase Created 4 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
« no previous file with comments | « cc/trees/swap_promise_monitor.cc ('k') | content/renderer/gpu/render_widget_compositor.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/renderer_host/compositor_impl_android.h" 5 #include "content/browser/renderer_host/compositor_impl_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <android/native_window_jni.h> 8 #include <android/native_window_jni.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <unordered_set> 10 #include <unordered_set>
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 496
497 cc::LayerTreeHost::InitParams params; 497 cc::LayerTreeHost::InitParams params;
498 params.client = this; 498 params.client = this;
499 params.shared_bitmap_manager = HostSharedBitmapManager::current(); 499 params.shared_bitmap_manager = HostSharedBitmapManager::current();
500 params.gpu_memory_buffer_manager = BrowserGpuMemoryBufferManager::current(); 500 params.gpu_memory_buffer_manager = BrowserGpuMemoryBufferManager::current();
501 params.task_graph_runner = g_task_graph_runner.Pointer(); 501 params.task_graph_runner = g_task_graph_runner.Pointer();
502 params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); 502 params.main_task_runner = base::ThreadTaskRunnerHandle::Get();
503 params.settings = &settings; 503 params.settings = &settings;
504 params.animation_host = cc::AnimationHost::CreateMainInstance(); 504 params.animation_host = cc::AnimationHost::CreateMainInstance();
505 host_ = cc::LayerTreeHost::CreateSingleThreaded(this, &params); 505 host_ = cc::LayerTreeHost::CreateSingleThreaded(this, &params);
506 DCHECK(!host_->visible()); 506 DCHECK(!host_->IsVisible());
507 host_->GetLayerTree()->SetRootLayer(root_window_->GetLayer()); 507 host_->GetLayerTree()->SetRootLayer(root_window_->GetLayer());
508 host_->set_surface_client_id(surface_id_allocator_->client_id()); 508 host_->SetSurfaceClientId(surface_id_allocator_->client_id());
509 host_->GetLayerTree()->SetViewportSize(size_); 509 host_->GetLayerTree()->SetViewportSize(size_);
510 host_->GetLayerTree()->set_has_transparent_background( 510 host_->GetLayerTree()->set_has_transparent_background(
511 has_transparent_background_); 511 has_transparent_background_);
512 host_->GetLayerTree()->SetDeviceScaleFactor(device_scale_factor_); 512 host_->GetLayerTree()->SetDeviceScaleFactor(device_scale_factor_);
513 513
514 if (needs_animate_) 514 if (needs_animate_)
515 host_->SetNeedsAnimate(); 515 host_->SetNeedsAnimate();
516 } 516 }
517 517
518 void CompositorImpl::SetVisible(bool visible) { 518 void CompositorImpl::SetVisible(bool visible) {
519 TRACE_EVENT1("cc", "CompositorImpl::SetVisible", "visible", visible); 519 TRACE_EVENT1("cc", "CompositorImpl::SetVisible", "visible", visible);
520 if (!visible) { 520 if (!visible) {
521 DCHECK(host_->visible()); 521 DCHECK(host_->IsVisible());
522 522
523 // Make a best effort to try to complete pending readbacks. 523 // Make a best effort to try to complete pending readbacks.
524 // TODO(crbug.com/637035): Consider doing this in a better way, 524 // TODO(crbug.com/637035): Consider doing this in a better way,
525 // ideally with the guarantee of readbacks completing. 525 // ideally with the guarantee of readbacks completing.
526 if (display_.get() && HavePendingReadbacks()) 526 if (display_.get() && HavePendingReadbacks())
527 display_->ForceImmediateDrawAndSwapIfPossible(); 527 display_->ForceImmediateDrawAndSwapIfPossible();
528 528
529 host_->SetVisible(false); 529 host_->SetVisible(false);
530 host_->ReleaseOutputSurface(); 530 host_->ReleaseOutputSurface();
531 pending_swapbuffers_ = 0; 531 pending_swapbuffers_ = 0;
(...skipping 23 matching lines...) Expand all
555 root_window_->GetLayer()->SetBounds(size); 555 root_window_->GetLayer()->SetBounds(size);
556 } 556 }
557 557
558 void CompositorImpl::SetHasTransparentBackground(bool flag) { 558 void CompositorImpl::SetHasTransparentBackground(bool flag) {
559 has_transparent_background_ = flag; 559 has_transparent_background_ = flag;
560 if (host_) 560 if (host_)
561 host_->GetLayerTree()->set_has_transparent_background(flag); 561 host_->GetLayerTree()->set_has_transparent_background(flag);
562 } 562 }
563 563
564 void CompositorImpl::SetNeedsComposite() { 564 void CompositorImpl::SetNeedsComposite() {
565 if (!host_->visible()) 565 if (!host_->IsVisible())
566 return; 566 return;
567 TRACE_EVENT0("compositor", "Compositor::SetNeedsComposite"); 567 TRACE_EVENT0("compositor", "Compositor::SetNeedsComposite");
568 host_->SetNeedsAnimate(); 568 host_->SetNeedsAnimate();
569 } 569 }
570 570
571 void CompositorImpl::UpdateLayerTreeHost() { 571 void CompositorImpl::UpdateLayerTreeHost() {
572 client_->UpdateLayerTreeHost(); 572 client_->UpdateLayerTreeHost();
573 if (needs_animate_) { 573 if (needs_animate_) {
574 needs_animate_ = false; 574 needs_animate_ = false;
575 root_window_->Animate(base::TimeTicks::Now()); 575 root_window_->Animate(base::TimeTicks::Now());
(...skipping 17 matching lines...) Expand all
593 LOG(ERROR) << "Failed to init OutputSurface for compositor."; 593 LOG(ERROR) << "Failed to init OutputSurface for compositor.";
594 LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2) 594 LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2)
595 << "Too many context creation failures. Giving up... "; 595 << "Too many context creation failures. Giving up... ";
596 HandlePendingOutputSurfaceRequest(); 596 HandlePendingOutputSurfaceRequest();
597 } 597 }
598 598
599 void CompositorImpl::HandlePendingOutputSurfaceRequest() { 599 void CompositorImpl::HandlePendingOutputSurfaceRequest() {
600 DCHECK(output_surface_request_pending_); 600 DCHECK(output_surface_request_pending_);
601 601
602 // We might have been made invisible now. 602 // We might have been made invisible now.
603 if (!host_->visible()) 603 if (!host_->IsVisible())
604 return; 604 return;
605 605
606 #if defined(ENABLE_VULKAN) 606 #if defined(ENABLE_VULKAN)
607 CreateVulkanOutputSurface() 607 CreateVulkanOutputSurface()
608 if (display_) 608 if (display_)
609 return; 609 return;
610 #endif 610 #endif
611 611
612 DCHECK(surface_handle_ != gpu::kNullSurfaceHandle); 612 DCHECK(surface_handle_ != gpu::kNullSurfaceHandle);
613 ContextProviderFactoryImpl::GetInstance()->RequestGpuChannelHost(base::Bind( 613 ContextProviderFactoryImpl::GetInstance()->RequestGpuChannelHost(base::Bind(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 case ui::ContextProviderFactory::GpuChannelHostResult:: 657 case ui::ContextProviderFactory::GpuChannelHostResult::
658 FAILURE_FACTORY_SHUTDOWN: 658 FAILURE_FACTORY_SHUTDOWN:
659 break; 659 break;
660 case ui::ContextProviderFactory::GpuChannelHostResult:: 660 case ui::ContextProviderFactory::GpuChannelHostResult::
661 FAILURE_GPU_PROCESS_INITIALIZATION_FAILED: 661 FAILURE_GPU_PROCESS_INITIALIZATION_FAILED:
662 // TODO(khushalsagar): Retry or have a fallback path after 662 // TODO(khushalsagar): Retry or have a fallback path after
663 // crbug.com/643282 is resolved. 663 // crbug.com/643282 is resolved.
664 break; 664 break;
665 case ui::ContextProviderFactory::GpuChannelHostResult::SUCCESS: 665 case ui::ContextProviderFactory::GpuChannelHostResult::SUCCESS:
666 // We don't need the context anymore if we are invisible. 666 // We don't need the context anymore if we are invisible.
667 if (!host_->visible()) 667 if (!host_->IsVisible())
668 return; 668 return;
669 669
670 DCHECK(window_); 670 DCHECK(window_);
671 DCHECK_NE(surface_handle_, gpu::kNullSurfaceHandle); 671 DCHECK_NE(surface_handle_, gpu::kNullSurfaceHandle);
672 scoped_refptr<cc::ContextProvider> context_provider = 672 scoped_refptr<cc::ContextProvider> context_provider =
673 ContextProviderFactoryImpl::GetInstance() 673 ContextProviderFactoryImpl::GetInstance()
674 ->CreateDisplayContextProvider( 674 ->CreateDisplayContextProvider(
675 surface_handle_, GetCompositorContextSharedMemoryLimits(), 675 surface_handle_, GetCompositorContextSharedMemoryLimits(),
676 GetCompositorContextAttributes(has_transparent_background_), 676 GetCompositorContextAttributes(has_transparent_background_),
677 false /*support_locking*/, false /*automatic_flushes*/, 677 false /*support_locking*/, false /*automatic_flushes*/,
(...skipping 27 matching lines...) Expand all
705 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); 705 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get();
706 std::unique_ptr<ExternalBeginFrameSource> begin_frame_source( 706 std::unique_ptr<ExternalBeginFrameSource> begin_frame_source(
707 new ExternalBeginFrameSource(this)); 707 new ExternalBeginFrameSource(this));
708 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( 708 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler(
709 begin_frame_source.get(), task_runner, 709 begin_frame_source.get(), task_runner,
710 display_output_surface->capabilities().max_frames_pending)); 710 display_output_surface->capabilities().max_frames_pending));
711 711
712 display_.reset(new cc::Display( 712 display_.reset(new cc::Display(
713 HostSharedBitmapManager::current(), 713 HostSharedBitmapManager::current(),
714 BrowserGpuMemoryBufferManager::current(), 714 BrowserGpuMemoryBufferManager::current(),
715 host_->settings().renderer_settings, std::move(begin_frame_source), 715 host_->GetSettings().renderer_settings, std::move(begin_frame_source),
716 std::move(display_output_surface), std::move(scheduler), 716 std::move(display_output_surface), std::move(scheduler),
717 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); 717 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner)));
718 718
719 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface( 719 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface(
720 vulkan_context_provider ? new cc::SurfaceDisplayOutputSurface( 720 vulkan_context_provider ? new cc::SurfaceDisplayOutputSurface(
721 manager, surface_id_allocator_.get(), 721 manager, surface_id_allocator_.get(),
722 display_.get(), vulkan_context_provider) 722 display_.get(), vulkan_context_provider)
723 : new cc::SurfaceDisplayOutputSurface( 723 : new cc::SurfaceDisplayOutputSurface(
724 manager, surface_id_allocator_.get(), 724 manager, surface_id_allocator_.get(),
725 display_.get(), context_provider, nullptr)); 725 display_.get(), context_provider, nullptr));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 DCHECK_GT(pending_swapbuffers_, 0U); 767 DCHECK_GT(pending_swapbuffers_, 0U);
768 pending_swapbuffers_--; 768 pending_swapbuffers_--;
769 client_->OnSwapBuffersCompleted(pending_swapbuffers_); 769 client_->OnSwapBuffersCompleted(pending_swapbuffers_);
770 } 770 }
771 771
772 void CompositorImpl::DidAbortSwapBuffers() { 772 void CompositorImpl::DidAbortSwapBuffers() {
773 TRACE_EVENT0("compositor", "CompositorImpl::DidAbortSwapBuffers"); 773 TRACE_EVENT0("compositor", "CompositorImpl::DidAbortSwapBuffers");
774 // This really gets called only once from 774 // This really gets called only once from
775 // SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() when the 775 // SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() when the
776 // context was lost. 776 // context was lost.
777 if (host_->visible()) 777 if (host_->IsVisible())
778 host_->SetNeedsCommit(); 778 host_->SetNeedsCommit();
779 client_->OnSwapBuffersCompleted(0); 779 client_->OnSwapBuffersCompleted(0);
780 } 780 }
781 781
782 void CompositorImpl::DidCommit() { 782 void CompositorImpl::DidCommit() {
783 root_window_->OnCompositingDidCommit(); 783 root_window_->OnCompositingDidCommit();
784 } 784 }
785 785
786 void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) { 786 void CompositorImpl::AttachLayerForReadback(scoped_refptr<cc::Layer> layer) {
787 readback_layer_tree_->AddChild(layer); 787 readback_layer_tree_->AddChild(layer);
(...skipping 16 matching lines...) Expand all
804 if (needs_begin_frames_ == needs_begin_frames) 804 if (needs_begin_frames_ == needs_begin_frames)
805 return; 805 return;
806 806
807 needs_begin_frames_ = needs_begin_frames; 807 needs_begin_frames_ = needs_begin_frames;
808 if (needs_begin_frames_) 808 if (needs_begin_frames_)
809 root_window_->RequestVSyncUpdate(); 809 root_window_->RequestVSyncUpdate();
810 } 810 }
811 811
812 void CompositorImpl::SetNeedsAnimate() { 812 void CompositorImpl::SetNeedsAnimate() {
813 needs_animate_ = true; 813 needs_animate_ = true;
814 if (!host_->visible()) 814 if (!host_->IsVisible())
815 return; 815 return;
816 816
817 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); 817 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate");
818 host_->SetNeedsAnimate(); 818 host_->SetNeedsAnimate();
819 } 819 }
820 820
821 bool CompositorImpl::HavePendingReadbacks() { 821 bool CompositorImpl::HavePendingReadbacks() {
822 return !readback_layer_tree_->children().empty(); 822 return !readback_layer_tree_->children().empty();
823 } 823 }
824 824
825 } // namespace content 825 } // namespace content
OLDNEW
« no previous file with comments | « cc/trees/swap_promise_monitor.cc ('k') | content/renderer/gpu/render_widget_compositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698