| 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/gpu_process_transport_factory.h" | 5 #include "content/browser/compositor/gpu_process_transport_factory.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/profiler/scoped_tracker.h" | 14 #include "base/profiler/scoped_tracker.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/threading/simple_thread.h" | 16 #include "base/threading/simple_thread.h" |
| 17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 18 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
| 19 #include "build/build_config.h" | 19 #include "build/build_config.h" |
| 20 #include "cc/base/histograms.h" | 20 #include "cc/base/histograms.h" |
| 21 #include "cc/output/compositor_frame.h" | 21 #include "cc/output/compositor_frame.h" |
| 22 #include "cc/output/output_surface.h" | 22 #include "cc/output/output_surface.h" |
| 23 #include "cc/output/texture_mailbox_deleter.h" |
| 23 #include "cc/output/vulkan_in_process_context_provider.h" | 24 #include "cc/output/vulkan_in_process_context_provider.h" |
| 24 #include "cc/raster/single_thread_task_graph_runner.h" | 25 #include "cc/raster/single_thread_task_graph_runner.h" |
| 25 #include "cc/raster/task_graph_runner.h" | 26 #include "cc/raster/task_graph_runner.h" |
| 27 #include "cc/scheduler/begin_frame_source.h" |
| 26 #include "cc/surfaces/display.h" | 28 #include "cc/surfaces/display.h" |
| 29 #include "cc/surfaces/display_scheduler.h" |
| 27 #include "cc/surfaces/surface_display_output_surface.h" | 30 #include "cc/surfaces/surface_display_output_surface.h" |
| 28 #include "cc/surfaces/surface_manager.h" | 31 #include "cc/surfaces/surface_manager.h" |
| 29 #include "components/display_compositor/compositor_overlay_candidate_validator.h
" | 32 #include "components/display_compositor/compositor_overlay_candidate_validator.h
" |
| 30 #include "components/display_compositor/gl_helper.h" | 33 #include "components/display_compositor/gl_helper.h" |
| 31 #include "content/browser/compositor/browser_compositor_output_surface.h" | 34 #include "content/browser/compositor/browser_compositor_output_surface.h" |
| 32 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" | 35 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" |
| 33 #include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_s
urface.h" | 36 #include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_s
urface.h" |
| 34 #include "content/browser/compositor/offscreen_browser_compositor_output_surface
.h" | 37 #include "content/browser/compositor/offscreen_browser_compositor_output_surface
.h" |
| 35 #include "content/browser/compositor/reflector_impl.h" | 38 #include "content/browser/compositor/reflector_impl.h" |
| 36 #include "content/browser/compositor/software_browser_compositor_output_surface.
h" | 39 #include "content/browser/compositor/software_browser_compositor_output_surface.
h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 } | 148 } |
| 146 #endif | 149 #endif |
| 147 | 150 |
| 148 } // namespace | 151 } // namespace |
| 149 | 152 |
| 150 namespace content { | 153 namespace content { |
| 151 | 154 |
| 152 struct GpuProcessTransportFactory::PerCompositorData { | 155 struct GpuProcessTransportFactory::PerCompositorData { |
| 153 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; | 156 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; |
| 154 BrowserCompositorOutputSurface* display_output_surface = nullptr; | 157 BrowserCompositorOutputSurface* display_output_surface = nullptr; |
| 158 cc::SyntheticBeginFrameSource* begin_frame_source = nullptr; |
| 155 ReflectorImpl* reflector = nullptr; | 159 ReflectorImpl* reflector = nullptr; |
| 156 std::unique_ptr<cc::Display> display; | 160 std::unique_ptr<cc::Display> display; |
| 157 bool output_is_secure = false; | 161 bool output_is_secure = false; |
| 158 }; | 162 }; |
| 159 | 163 |
| 160 GpuProcessTransportFactory::GpuProcessTransportFactory() | 164 GpuProcessTransportFactory::GpuProcessTransportFactory() |
| 161 : next_surface_id_namespace_(1u), | 165 : next_surface_id_namespace_(1u), |
| 162 task_graph_runner_(new cc::SingleThreadTaskGraphRunner), | 166 task_graph_runner_(new cc::SingleThreadTaskGraphRunner), |
| 163 callback_factory_(this) { | 167 callback_factory_(this) { |
| 164 cc::SetClientNameForMetrics("Browser"); | 168 cc::SetClientNameForMetrics("Browser"); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 void GpuProcessTransportFactory::CreateOutputSurface( | 276 void GpuProcessTransportFactory::CreateOutputSurface( |
| 273 base::WeakPtr<ui::Compositor> compositor) { | 277 base::WeakPtr<ui::Compositor> compositor) { |
| 274 DCHECK(!!compositor); | 278 DCHECK(!!compositor); |
| 275 PerCompositorData* data = per_compositor_data_[compositor.get()]; | 279 PerCompositorData* data = per_compositor_data_[compositor.get()]; |
| 276 if (!data) { | 280 if (!data) { |
| 277 data = CreatePerCompositorData(compositor.get()); | 281 data = CreatePerCompositorData(compositor.get()); |
| 278 } else { | 282 } else { |
| 279 // TODO(danakj): We can destroy the |data->display| here when the compositor | 283 // TODO(danakj): We can destroy the |data->display| here when the compositor |
| 280 // destroys its OutputSurface before calling back here. | 284 // destroys its OutputSurface before calling back here. |
| 281 data->display_output_surface = nullptr; | 285 data->display_output_surface = nullptr; |
| 286 data->begin_frame_source = nullptr; |
| 282 } | 287 } |
| 283 | 288 |
| 284 #if defined(OS_WIN) | 289 #if defined(OS_WIN) |
| 285 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( | 290 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( |
| 286 compositor->widget()); | 291 compositor->widget()); |
| 287 #endif | 292 #endif |
| 288 | 293 |
| 289 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); | 294 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); |
| 290 | 295 |
| 291 const bool create_gpu_output_surface = | 296 const bool create_gpu_output_surface = |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 // Try again. | 418 // Try again. |
| 414 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( | 419 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( |
| 415 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT, | 420 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT, |
| 416 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, | 421 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, |
| 417 callback_factory_.GetWeakPtr(), compositor, | 422 callback_factory_.GetWeakPtr(), compositor, |
| 418 create_gpu_output_surface, num_attempts + 1)); | 423 create_gpu_output_surface, num_attempts + 1)); |
| 419 return; | 424 return; |
| 420 } | 425 } |
| 421 } | 426 } |
| 422 | 427 |
| 428 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source( |
| 429 new cc::SyntheticBeginFrameSource(compositor->task_runner().get(), |
| 430 cc::BeginFrameArgs::DefaultInterval())); |
| 431 |
| 423 std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface; | 432 std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface; |
| 424 #if defined(ENABLE_VULKAN) | 433 #if defined(ENABLE_VULKAN) |
| 425 std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface; | 434 std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface; |
| 426 if (vulkan_context_provider) { | 435 if (vulkan_context_provider) { |
| 427 vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface( | 436 vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface( |
| 428 vulkan_context_provider, compositor->vsync_manager(), | 437 vulkan_context_provider, compositor->vsync_manager(), |
| 429 compositor->task_runner().get())); | 438 compositor->task_runner().get())); |
| 430 if (!vulkan_surface->Initialize(compositor.get()->widget())) { | 439 if (!vulkan_surface->Initialize(compositor.get()->widget())) { |
| 431 vulkan_surface->Destroy(); | 440 vulkan_surface->Destroy(); |
| 432 vulkan_surface.reset(); | 441 vulkan_surface.reset(); |
| 433 } else { | 442 } else { |
| 434 display_output_surface = std::move(vulkan_surface); | 443 display_output_surface = std::move(vulkan_surface); |
| 435 } | 444 } |
| 436 } | 445 } |
| 437 #endif | 446 #endif |
| 438 | 447 |
| 439 if (!display_output_surface) { | 448 if (!display_output_surface) { |
| 440 if (!create_gpu_output_surface) { | 449 if (!create_gpu_output_surface) { |
| 441 display_output_surface = | 450 display_output_surface = |
| 442 base::WrapUnique(new SoftwareBrowserCompositorOutputSurface( | 451 base::WrapUnique(new SoftwareBrowserCompositorOutputSurface( |
| 443 CreateSoftwareOutputDevice(compositor.get()), | 452 CreateSoftwareOutputDevice(compositor.get()), |
| 444 compositor->vsync_manager(), compositor->task_runner().get())); | 453 compositor->vsync_manager(), begin_frame_source.get())); |
| 445 } else { | 454 } else { |
| 446 DCHECK(context_provider); | 455 DCHECK(context_provider); |
| 447 const auto& capabilities = context_provider->ContextCapabilities(); | 456 const auto& capabilities = context_provider->ContextCapabilities(); |
| 448 if (data->surface_handle == gpu::kNullSurfaceHandle) { | 457 if (data->surface_handle == gpu::kNullSurfaceHandle) { |
| 449 display_output_surface = | 458 display_output_surface = |
| 450 base::WrapUnique(new OffscreenBrowserCompositorOutputSurface( | 459 base::WrapUnique(new OffscreenBrowserCompositorOutputSurface( |
| 451 context_provider, compositor->vsync_manager(), | 460 context_provider, compositor->vsync_manager(), |
| 452 compositor->task_runner().get(), | 461 begin_frame_source.get(), |
| 453 std::unique_ptr<display_compositor:: | 462 std::unique_ptr<display_compositor:: |
| 454 CompositorOverlayCandidateValidator>())); | 463 CompositorOverlayCandidateValidator>())); |
| 455 } else if (capabilities.surfaceless) { | 464 } else if (capabilities.surfaceless) { |
| 456 #if defined(OS_MACOSX) | 465 #if defined(OS_MACOSX) |
| 457 display_output_surface = base::WrapUnique(new GpuOutputSurfaceMac( | 466 display_output_surface = base::WrapUnique(new GpuOutputSurfaceMac( |
| 458 context_provider, data->surface_handle, compositor->vsync_manager(), | 467 context_provider, data->surface_handle, compositor->vsync_manager(), |
| 459 compositor->task_runner().get(), | 468 begin_frame_source.get(), |
| 460 CreateOverlayCandidateValidator(compositor->widget()), | 469 CreateOverlayCandidateValidator(compositor->widget()), |
| 461 BrowserGpuMemoryBufferManager::current())); | 470 BrowserGpuMemoryBufferManager::current())); |
| 462 #else | 471 #else |
| 463 display_output_surface = | 472 display_output_surface = |
| 464 base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface( | 473 base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface( |
| 465 context_provider, data->surface_handle, | 474 context_provider, data->surface_handle, |
| 466 compositor->vsync_manager(), compositor->task_runner().get(), | 475 compositor->vsync_manager(), begin_frame_source.get(), |
| 467 CreateOverlayCandidateValidator(compositor->widget()), | 476 CreateOverlayCandidateValidator(compositor->widget()), |
| 468 GL_TEXTURE_2D, GL_RGB, | 477 GL_TEXTURE_2D, GL_RGB, |
| 469 BrowserGpuMemoryBufferManager::current())); | 478 BrowserGpuMemoryBufferManager::current())); |
| 470 #endif | 479 #endif |
| 471 } else { | 480 } else { |
| 472 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator> | 481 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator> |
| 473 validator; | 482 validator; |
| 474 #if !defined(OS_MACOSX) | 483 #if !defined(OS_MACOSX) |
| 475 // Overlays are only supported on surfaceless output surfaces on Mac. | 484 // Overlays are only supported on surfaceless output surfaces on Mac. |
| 476 validator = CreateOverlayCandidateValidator(compositor->widget()); | 485 validator = CreateOverlayCandidateValidator(compositor->widget()); |
| 477 #endif | 486 #endif |
| 478 display_output_surface = | 487 display_output_surface = |
| 479 base::WrapUnique(new GpuBrowserCompositorOutputSurface( | 488 base::WrapUnique(new GpuBrowserCompositorOutputSurface( |
| 480 context_provider, compositor->vsync_manager(), | 489 context_provider, compositor->vsync_manager(), |
| 481 compositor->task_runner().get(), std::move(validator))); | 490 begin_frame_source.get(), std::move(validator))); |
| 482 } | 491 } |
| 483 } | 492 } |
| 484 } | 493 } |
| 485 | 494 |
| 486 data->display_output_surface = display_output_surface.get(); | 495 data->display_output_surface = display_output_surface.get(); |
| 496 data->begin_frame_source = begin_frame_source.get(); |
| 487 if (data->reflector) | 497 if (data->reflector) |
| 488 data->reflector->OnSourceSurfaceReady(data->display_output_surface); | 498 data->reflector->OnSourceSurfaceReady(data->display_output_surface); |
| 489 | 499 |
| 490 #if defined(OS_WIN) | 500 #if defined(OS_WIN) |
| 491 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( | 501 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( |
| 492 compositor->widget()); | 502 compositor->widget()); |
| 493 #endif | 503 #endif |
| 494 | 504 |
| 505 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( |
| 506 begin_frame_source.get(), compositor->task_runner().get(), |
| 507 display_output_surface->capabilities().max_frames_pending)); |
| 508 |
| 495 // The Display owns and uses the |display_output_surface| created above. | 509 // The Display owns and uses the |display_output_surface| created above. |
| 496 data->display = base::MakeUnique<cc::Display>( | 510 data->display = base::MakeUnique<cc::Display>( |
| 497 surface_manager_.get(), HostSharedBitmapManager::current(), | 511 surface_manager_.get(), HostSharedBitmapManager::current(), |
| 498 BrowserGpuMemoryBufferManager::current(), | 512 BrowserGpuMemoryBufferManager::current(), |
| 499 compositor->GetRendererSettings(), | 513 compositor->GetRendererSettings(), |
| 500 compositor->surface_id_allocator()->id_namespace(), | 514 compositor->surface_id_allocator()->id_namespace(), |
| 501 compositor->task_runner().get(), std::move(display_output_surface)); | 515 std::move(begin_frame_source), std::move(display_output_surface), |
| 516 std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>( |
| 517 compositor->task_runner().get())); |
| 502 | 518 |
| 503 // The |delegated_output_surface| is given back to the compositor, it | 519 // The |delegated_output_surface| is given back to the compositor, it |
| 504 // delegates to the Display as its root surface. Importantly, it shares the | 520 // delegates to the Display as its root surface. Importantly, it shares the |
| 505 // same ContextProvider as the Display's output surface. | 521 // same ContextProvider as the Display's output surface. |
| 506 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface( | 522 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface( |
| 507 vulkan_context_provider | 523 vulkan_context_provider |
| 508 ? new cc::SurfaceDisplayOutputSurface( | 524 ? new cc::SurfaceDisplayOutputSurface( |
| 509 surface_manager_.get(), compositor->surface_id_allocator(), | 525 surface_manager_.get(), compositor->surface_id_allocator(), |
| 510 data->display.get(), | 526 data->display.get(), |
| 511 static_cast<scoped_refptr<cc::VulkanContextProvider>>( | 527 static_cast<scoped_refptr<cc::VulkanContextProvider>>( |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 } | 640 } |
| 625 | 641 |
| 626 void GpuProcessTransportFactory::SetAuthoritativeVSyncInterval( | 642 void GpuProcessTransportFactory::SetAuthoritativeVSyncInterval( |
| 627 ui::Compositor* compositor, | 643 ui::Compositor* compositor, |
| 628 base::TimeDelta interval) { | 644 base::TimeDelta interval) { |
| 629 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); | 645 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); |
| 630 if (it == per_compositor_data_.end()) | 646 if (it == per_compositor_data_.end()) |
| 631 return; | 647 return; |
| 632 PerCompositorData* data = it->second; | 648 PerCompositorData* data = it->second; |
| 633 DCHECK(data); | 649 DCHECK(data); |
| 634 if (data->display_output_surface) { | 650 if (data->begin_frame_source) { |
| 635 data->display_output_surface->begin_frame_source() | 651 data->begin_frame_source->SetAuthoritativeVSyncInterval(interval); |
| 636 ->SetAuthoritativeVSyncInterval(interval); | |
| 637 } | 652 } |
| 638 } | 653 } |
| 639 | 654 |
| 640 void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor, | 655 void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor, |
| 641 bool secure) { | 656 bool secure) { |
| 642 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); | 657 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); |
| 643 if (it == per_compositor_data_.end()) | 658 if (it == per_compositor_data_.end()) |
| 644 return; | 659 return; |
| 645 PerCompositorData* data = it->second; | 660 PerCompositorData* data = it->second; |
| 646 DCHECK(data); | 661 DCHECK(data); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 shared_vulkan_context_provider_ = | 798 shared_vulkan_context_provider_ = |
| 784 cc::VulkanInProcessContextProvider::Create(); | 799 cc::VulkanInProcessContextProvider::Create(); |
| 785 } | 800 } |
| 786 | 801 |
| 787 shared_vulkan_context_provider_initialized_ = true; | 802 shared_vulkan_context_provider_initialized_ = true; |
| 788 } | 803 } |
| 789 return shared_vulkan_context_provider_; | 804 return shared_vulkan_context_provider_; |
| 790 } | 805 } |
| 791 | 806 |
| 792 } // namespace content | 807 } // namespace content |
| OLD | NEW |