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