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

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

Issue 2779303002: [EXPERIMENT] Revert "Route D3D VSync signal to Compositor" (Closed)
Patch Set: Resolve merge conflict Created 3 years, 8 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"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 #include "services/service_manager/runner/common/client_util.h" 52 #include "services/service_manager/runner/common/client_util.h"
53 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" 53 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
54 #include "third_party/khronos/GLES2/gl2.h" 54 #include "third_party/khronos/GLES2/gl2.h"
55 #include "ui/compositor/compositor.h" 55 #include "ui/compositor/compositor.h"
56 #include "ui/compositor/compositor_constants.h" 56 #include "ui/compositor/compositor_constants.h"
57 #include "ui/compositor/compositor_switches.h" 57 #include "ui/compositor/compositor_switches.h"
58 #include "ui/compositor/layer.h" 58 #include "ui/compositor/layer.h"
59 #include "ui/display/types/display_snapshot.h" 59 #include "ui/display/types/display_snapshot.h"
60 #include "ui/gfx/geometry/size.h" 60 #include "ui/gfx/geometry/size.h"
61 #include "ui/gfx/switches.h" 61 #include "ui/gfx/switches.h"
62 #include "ui/gl/gl_switches.h"
63 62
64 #if defined(USE_AURA) 63 #if defined(USE_AURA)
65 #include "content/public/common/service_manager_connection.h" 64 #include "content/public/common/service_manager_connection.h"
66 #include "ui/aura/window_tree_host.h" 65 #include "ui/aura/window_tree_host.h"
67 #endif 66 #endif
68 67
69 #if defined(OS_WIN) 68 #if defined(OS_WIN)
70 #include "base/win/windows_version.h"
71 #include "components/display_compositor/compositor_overlay_candidate_validator_w in.h" 69 #include "components/display_compositor/compositor_overlay_candidate_validator_w in.h"
72 #include "content/browser/compositor/software_output_device_win.h" 70 #include "content/browser/compositor/software_output_device_win.h"
73 #include "ui/gfx/win/rendering_window_manager.h" 71 #include "ui/gfx/win/rendering_window_manager.h"
74 #elif defined(USE_OZONE) 72 #elif defined(USE_OZONE)
75 #include "components/display_compositor/compositor_overlay_candidate_validator_o zone.h" 73 #include "components/display_compositor/compositor_overlay_candidate_validator_o zone.h"
76 #include "content/browser/compositor/software_output_device_ozone.h" 74 #include "content/browser/compositor/software_output_device_ozone.h"
77 #include "ui/ozone/public/overlay_candidates_ozone.h" 75 #include "ui/ozone/public/overlay_candidates_ozone.h"
78 #include "ui/ozone/public/overlay_manager_ozone.h" 76 #include "ui/ozone/public/overlay_manager_ozone.h"
79 #include "ui/ozone/public/ozone_platform.h" 77 #include "ui/ozone/public/ozone_platform.h"
80 #include "ui/ozone/public/ozone_switches.h" 78 #include "ui/ozone/public/ozone_switches.h"
(...skipping 21 matching lines...) Expand all
102 using cc::ContextProvider; 100 using cc::ContextProvider;
103 using gpu::gles2::GLES2Interface; 101 using gpu::gles2::GLES2Interface;
104 102
105 namespace { 103 namespace {
106 104
107 const int kNumRetriesBeforeSoftwareFallback = 4; 105 const int kNumRetriesBeforeSoftwareFallback = 4;
108 // The client_id used here should not conflict with the client_id generated 106 // The client_id used here should not conflict with the client_id generated
109 // from RenderWidgetHostImpl. 107 // from RenderWidgetHostImpl.
110 constexpr uint32_t kDefaultClientId = 0u; 108 constexpr uint32_t kDefaultClientId = 0u;
111 109
112 bool IsGpuVSyncSignalSupported() {
113 #if defined(OS_WIN)
114 // TODO(stanisc): http://crbug.com/467617 Limit to Windows 8+ for now because
115 // of locking issue caused by waiting for VSync on Win7.
116 return base::win::GetVersion() >= base::win::VERSION_WIN8 &&
117 base::FeatureList::IsEnabled(features::kD3DVsync);
118 #else
119 return false;
120 #endif // defined(OS_WIN)
121 }
122
123 scoped_refptr<ui::ContextProviderCommandBuffer> CreateContextCommon( 110 scoped_refptr<ui::ContextProviderCommandBuffer> CreateContextCommon(
124 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host, 111 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
125 gpu::SurfaceHandle surface_handle, 112 gpu::SurfaceHandle surface_handle,
126 bool need_alpha_channel, 113 bool need_alpha_channel,
127 bool need_stencil_bits, 114 bool need_stencil_bits,
128 bool support_locking, 115 bool support_locking,
129 ui::ContextProviderCommandBuffer* shared_context_provider, 116 ui::ContextProviderCommandBuffer* shared_context_provider,
130 ui::command_buffer_metrics::ContextType type) { 117 ui::command_buffer_metrics::ContextType type) {
131 DCHECK( 118 DCHECK(
132 content::GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor()); 119 content::GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 } 160 }
174 #endif 161 #endif
175 162
176 } // namespace 163 } // namespace
177 164
178 namespace content { 165 namespace content {
179 166
180 struct GpuProcessTransportFactory::PerCompositorData { 167 struct GpuProcessTransportFactory::PerCompositorData {
181 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; 168 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle;
182 BrowserCompositorOutputSurface* display_output_surface = nullptr; 169 BrowserCompositorOutputSurface* display_output_surface = nullptr;
183 // Either |synthetic_begin_frame_source| or |gpu_vsync_begin_frame_source| is 170 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source;
184 // valid but not both at the same time.
185 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source;
186 std::unique_ptr<GpuVSyncBeginFrameSource> gpu_vsync_begin_frame_source;
187 ReflectorImpl* reflector = nullptr; 171 ReflectorImpl* reflector = nullptr;
188 std::unique_ptr<cc::Display> display; 172 std::unique_ptr<cc::Display> display;
189 bool output_is_secure = false; 173 bool output_is_secure = false;
190 }; 174 };
191 175
192 GpuProcessTransportFactory::GpuProcessTransportFactory() 176 GpuProcessTransportFactory::GpuProcessTransportFactory()
193 : frame_sink_id_allocator_(kDefaultClientId), 177 : frame_sink_id_allocator_(kDefaultClientId),
194 task_graph_runner_(new cc::SingleThreadTaskGraphRunner), 178 task_graph_runner_(new cc::SingleThreadTaskGraphRunner),
195 callback_factory_(this) { 179 callback_factory_(this) {
196 cc::SetClientNameForMetrics("Browser"); 180 cc::SetClientNameForMetrics("Browser");
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 gpu::GpuChannelEstablishedCallback callback( 446 gpu::GpuChannelEstablishedCallback callback(
463 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, 447 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
464 callback_factory_.GetWeakPtr(), compositor, 448 callback_factory_.GetWeakPtr(), compositor,
465 create_gpu_output_surface, num_attempts + 1)); 449 create_gpu_output_surface, num_attempts + 1));
466 DCHECK(gpu_channel_factory_); 450 DCHECK(gpu_channel_factory_);
467 gpu_channel_factory_->EstablishGpuChannel(callback); 451 gpu_channel_factory_->EstablishGpuChannel(callback);
468 return; 452 return;
469 } 453 }
470 } 454 }
471 455
456 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source;
457 if (!compositor->GetRendererSettings().disable_display_vsync) {
458 synthetic_begin_frame_source.reset(new cc::DelayBasedBeginFrameSource(
459 base::MakeUnique<cc::DelayBasedTimeSource>(
460 compositor->task_runner().get())));
461 } else {
462 synthetic_begin_frame_source.reset(new cc::BackToBackBeginFrameSource(
463 base::MakeUnique<cc::DelayBasedTimeSource>(
464 compositor->task_runner().get())));
465 }
466 cc::BeginFrameSource* begin_frame_source = synthetic_begin_frame_source.get();
467
472 BrowserCompositorOutputSurface::UpdateVSyncParametersCallback vsync_callback = 468 BrowserCompositorOutputSurface::UpdateVSyncParametersCallback vsync_callback =
473 base::Bind(&ui::Compositor::SetDisplayVSyncParameters, compositor); 469 base::Bind(&ui::Compositor::SetDisplayVSyncParameters, compositor);
474 cc::BeginFrameSource* begin_frame_source = nullptr;
475 GpuVSyncControl* gpu_vsync_control = nullptr;
476 470
477 std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface; 471 std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface;
478 #if BUILDFLAG(ENABLE_VULKAN) 472 #if BUILDFLAG(ENABLE_VULKAN)
479 std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface; 473 std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface;
480 if (vulkan_context_provider) { 474 if (vulkan_context_provider) {
481 vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface( 475 vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface(
482 vulkan_context_provider, vsync_callback)); 476 vulkan_context_provider, vsync_callback));
483 if (!vulkan_surface->Initialize(compositor.get()->widget())) { 477 if (!vulkan_surface->Initialize(compositor.get()->widget())) {
484 vulkan_surface->Destroy(); 478 vulkan_surface->Destroy();
485 vulkan_surface.reset(); 479 vulkan_surface.reset();
(...skipping 19 matching lines...) Expand all
505 std::unique_ptr< 499 std::unique_ptr<
506 display_compositor::CompositorOverlayCandidateValidator>()); 500 display_compositor::CompositorOverlayCandidateValidator>());
507 } else if (capabilities.surfaceless) { 501 } else if (capabilities.surfaceless) {
508 #if defined(OS_MACOSX) 502 #if defined(OS_MACOSX)
509 display_output_surface = base::MakeUnique<GpuOutputSurfaceMac>( 503 display_output_surface = base::MakeUnique<GpuOutputSurfaceMac>(
510 compositor->widget(), context_provider, data->surface_handle, 504 compositor->widget(), context_provider, data->surface_handle,
511 vsync_callback, 505 vsync_callback,
512 CreateOverlayCandidateValidator(compositor->widget()), 506 CreateOverlayCandidateValidator(compositor->widget()),
513 GetGpuMemoryBufferManager()); 507 GetGpuMemoryBufferManager());
514 #else 508 #else
515 auto gpu_output_surface = 509 display_output_surface =
516 base::MakeUnique<GpuSurfacelessBrowserCompositorOutputSurface>( 510 base::MakeUnique<GpuSurfacelessBrowserCompositorOutputSurface>(
517 context_provider, data->surface_handle, vsync_callback, 511 context_provider, data->surface_handle, vsync_callback,
518 CreateOverlayCandidateValidator(compositor->widget()), 512 CreateOverlayCandidateValidator(compositor->widget()),
519 GL_TEXTURE_2D, GL_RGB, 513 GL_TEXTURE_2D, GL_RGB,
520 display::DisplaySnapshot::PrimaryFormat(), 514 display::DisplaySnapshot::PrimaryFormat(),
521 GetGpuMemoryBufferManager()); 515 GetGpuMemoryBufferManager());
522 gpu_vsync_control = gpu_output_surface.get();
523 display_output_surface = std::move(gpu_output_surface);
524 #endif 516 #endif
525 } else { 517 } else {
526 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator> 518 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
527 validator; 519 validator;
528 #if defined(OS_WIN) 520 #if defined(OS_WIN)
529 if (capabilities.dc_layers) 521 if (capabilities.dc_layers)
530 validator = CreateOverlayCandidateValidator(compositor->widget()); 522 validator = CreateOverlayCandidateValidator(compositor->widget());
531 #elif !defined(OS_MACOSX) 523 #elif !defined(OS_MACOSX)
532 // Overlays are only supported on surfaceless output surfaces on Mac. 524 // Overlays are only supported on surfaceless output surfaces on Mac.
533 validator = CreateOverlayCandidateValidator(compositor->widget()); 525 validator = CreateOverlayCandidateValidator(compositor->widget());
534 #endif 526 #endif
535 auto gpu_output_surface = 527 display_output_surface =
536 base::MakeUnique<GpuBrowserCompositorOutputSurface>( 528 base::MakeUnique<GpuBrowserCompositorOutputSurface>(
537 context_provider, vsync_callback, std::move(validator)); 529 context_provider, vsync_callback, std::move(validator));
538 gpu_vsync_control = gpu_output_surface.get();
539 display_output_surface = std::move(gpu_output_surface);
540 } 530 }
541 } 531 }
542 } 532 }
543 533
544 data->display_output_surface = display_output_surface.get(); 534 data->display_output_surface = display_output_surface.get();
545 if (data->reflector) 535 if (data->reflector)
546 data->reflector->OnSourceSurfaceReady(data->display_output_surface); 536 data->reflector->OnSourceSurfaceReady(data->display_output_surface);
547 537
548 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source;
549 std::unique_ptr<GpuVSyncBeginFrameSource> gpu_vsync_begin_frame_source;
550
551 if (!begin_frame_source) {
552 if (!compositor->GetRendererSettings().disable_display_vsync) {
553 if (gpu_vsync_control && IsGpuVSyncSignalSupported()) {
554 gpu_vsync_begin_frame_source =
555 base::MakeUnique<GpuVSyncBeginFrameSource>(gpu_vsync_control);
556 begin_frame_source = gpu_vsync_begin_frame_source.get();
557 } else {
558 synthetic_begin_frame_source =
559 base::MakeUnique<cc::DelayBasedBeginFrameSource>(
560 base::MakeUnique<cc::DelayBasedTimeSource>(
561 compositor->task_runner().get()));
562 begin_frame_source = synthetic_begin_frame_source.get();
563 }
564 } else {
565 synthetic_begin_frame_source =
566 base::MakeUnique<cc::BackToBackBeginFrameSource>(
567 base::MakeUnique<cc::DelayBasedTimeSource>(
568 compositor->task_runner().get()));
569 begin_frame_source = synthetic_begin_frame_source.get();
570 }
571 }
572
573 #if defined(OS_WIN) 538 #if defined(OS_WIN)
574 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( 539 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild(
575 compositor->widget()); 540 compositor->widget());
576 #endif 541 #endif
577 542
578 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( 543 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler(
579 compositor->task_runner().get(), 544 compositor->task_runner().get(),
580 display_output_surface->capabilities().max_frames_pending)); 545 display_output_surface->capabilities().max_frames_pending));
581 546
582 // The Display owns and uses the |display_output_surface| created above. 547 // The Display owns and uses the |display_output_surface| created above.
583 data->display = base::MakeUnique<cc::Display>( 548 data->display = base::MakeUnique<cc::Display>(
584 HostSharedBitmapManager::current(), GetGpuMemoryBufferManager(), 549 HostSharedBitmapManager::current(), GetGpuMemoryBufferManager(),
585 compositor->GetRendererSettings(), compositor->frame_sink_id(), 550 compositor->GetRendererSettings(), compositor->frame_sink_id(),
586 begin_frame_source, std::move(display_output_surface), 551 begin_frame_source, std::move(display_output_surface),
587 std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>( 552 std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>(
588 compositor->task_runner().get())); 553 compositor->task_runner().get()));
589 // Note that we are careful not to destroy prior BeginFrameSource objects 554 // Note that we are careful not to destroy a prior |data->begin_frame_source|
590 // until we have reset |data->display|. 555 // until we have reset |data->display|.
591 data->synthetic_begin_frame_source = std::move(synthetic_begin_frame_source); 556 data->begin_frame_source = std::move(synthetic_begin_frame_source);
592 data->gpu_vsync_begin_frame_source = std::move(gpu_vsync_begin_frame_source);
593 557
594 // The |delegated_output_surface| is given back to the compositor, it 558 // The |delegated_output_surface| is given back to the compositor, it
595 // delegates to the Display as its root surface. Importantly, it shares the 559 // delegates to the Display as its root surface. Importantly, it shares the
596 // same ContextProvider as the Display's output surface. 560 // same ContextProvider as the Display's output surface.
597 auto compositor_frame_sink = 561 auto compositor_frame_sink =
598 vulkan_context_provider 562 vulkan_context_provider
599 ? base::MakeUnique<cc::DirectCompositorFrameSink>( 563 ? base::MakeUnique<cc::DirectCompositorFrameSink>(
600 compositor->frame_sink_id(), surface_manager_.get(), 564 compositor->frame_sink_id(), surface_manager_.get(),
601 data->display.get(), 565 data->display.get(),
602 static_cast<scoped_refptr<cc::VulkanContextProvider>>( 566 static_cast<scoped_refptr<cc::VulkanContextProvider>>(
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 } 705 }
742 706
743 void GpuProcessTransportFactory::SetAuthoritativeVSyncInterval( 707 void GpuProcessTransportFactory::SetAuthoritativeVSyncInterval(
744 ui::Compositor* compositor, 708 ui::Compositor* compositor,
745 base::TimeDelta interval) { 709 base::TimeDelta interval) {
746 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); 710 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor);
747 if (it == per_compositor_data_.end()) 711 if (it == per_compositor_data_.end())
748 return; 712 return;
749 PerCompositorData* data = it->second.get(); 713 PerCompositorData* data = it->second.get();
750 DCHECK(data); 714 DCHECK(data);
751 if (data->synthetic_begin_frame_source) 715 if (data->begin_frame_source)
752 data->synthetic_begin_frame_source->SetAuthoritativeVSyncInterval(interval); 716 data->begin_frame_source->SetAuthoritativeVSyncInterval(interval);
753 } 717 }
754 718
755 void GpuProcessTransportFactory::SetDisplayVSyncParameters( 719 void GpuProcessTransportFactory::SetDisplayVSyncParameters(
756 ui::Compositor* compositor, 720 ui::Compositor* compositor,
757 base::TimeTicks timebase, 721 base::TimeTicks timebase,
758 base::TimeDelta interval) { 722 base::TimeDelta interval) {
759 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); 723 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor);
760 if (it == per_compositor_data_.end()) 724 if (it == per_compositor_data_.end())
761 return; 725 return;
762 PerCompositorData* data = it->second.get(); 726 PerCompositorData* data = it->second.get();
763 DCHECK(data); 727 DCHECK(data);
764 if (data->synthetic_begin_frame_source) { 728 if (data->begin_frame_source)
765 data->synthetic_begin_frame_source->OnUpdateVSyncParameters(timebase, 729 data->begin_frame_source->OnUpdateVSyncParameters(timebase, interval);
766 interval);
767 } else if (data->gpu_vsync_begin_frame_source) {
768 data->gpu_vsync_begin_frame_source->OnVSync(timebase, interval);
769 }
770 } 730 }
771 731
772 void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor, 732 void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor,
773 bool secure) { 733 bool secure) {
774 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); 734 PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor);
775 if (it == per_compositor_data_.end()) 735 if (it == per_compositor_data_.end())
776 return; 736 return;
777 PerCompositorData* data = it->second.get(); 737 PerCompositorData* data = it->second.get();
778 DCHECK(data); 738 DCHECK(data);
779 data->output_is_secure = secure; 739 data->output_is_secure = secure;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 shared_vulkan_context_provider_ = 883 shared_vulkan_context_provider_ =
924 cc::VulkanInProcessContextProvider::Create(); 884 cc::VulkanInProcessContextProvider::Create();
925 } 885 }
926 886
927 shared_vulkan_context_provider_initialized_ = true; 887 shared_vulkan_context_provider_initialized_ = true;
928 } 888 }
929 return shared_vulkan_context_provider_; 889 return shared_vulkan_context_provider_;
930 } 890 }
931 891
932 } // namespace content 892 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698