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

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

Issue 2029323004: Get rid of virtual Display::CreateScheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@onscreendisplayclient
Patch Set: displaytest: unusedvar Created 4 years, 6 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
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/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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698