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_macros.h" | 13 #include "base/metrics/histogram_macros.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" | |
22 #include "cc/output/output_surface.h" | |
23 #include "cc/output/texture_mailbox_deleter.h" | 21 #include "cc/output/texture_mailbox_deleter.h" |
24 #include "cc/output/vulkan_in_process_context_provider.h" | 22 #include "cc/output/vulkan_in_process_context_provider.h" |
25 #include "cc/raster/single_thread_task_graph_runner.h" | 23 #include "cc/raster/single_thread_task_graph_runner.h" |
26 #include "cc/raster/task_graph_runner.h" | 24 #include "cc/raster/task_graph_runner.h" |
27 #include "cc/scheduler/begin_frame_source.h" | 25 #include "cc/scheduler/begin_frame_source.h" |
28 #include "cc/scheduler/delay_based_time_source.h" | 26 #include "cc/scheduler/delay_based_time_source.h" |
| 27 #include "cc/surfaces/direct_compositor_frame_sink.h" |
29 #include "cc/surfaces/display.h" | 28 #include "cc/surfaces/display.h" |
30 #include "cc/surfaces/display_scheduler.h" | 29 #include "cc/surfaces/display_scheduler.h" |
31 #include "cc/surfaces/surface_display_output_surface.h" | |
32 #include "cc/surfaces/surface_manager.h" | 30 #include "cc/surfaces/surface_manager.h" |
33 #include "components/display_compositor/compositor_overlay_candidate_validator.h
" | 31 #include "components/display_compositor/compositor_overlay_candidate_validator.h
" |
34 #include "components/display_compositor/gl_helper.h" | 32 #include "components/display_compositor/gl_helper.h" |
35 #include "content/browser/compositor/browser_compositor_output_surface.h" | 33 #include "content/browser/compositor/browser_compositor_output_surface.h" |
36 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" | 34 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" |
37 #include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_s
urface.h" | 35 #include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_s
urface.h" |
38 #include "content/browser/compositor/offscreen_browser_compositor_output_surface
.h" | 36 #include "content/browser/compositor/offscreen_browser_compositor_output_surface
.h" |
39 #include "content/browser/compositor/reflector_impl.h" | 37 #include "content/browser/compositor/reflector_impl.h" |
40 #include "content/browser/compositor/software_browser_compositor_output_surface.
h" | 38 #include "content/browser/compositor/software_browser_compositor_output_surface.
h" |
41 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 39 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 ca_layers_disabled)); | 253 ca_layers_disabled)); |
256 } | 254 } |
257 #elif defined(OS_ANDROID) | 255 #elif defined(OS_ANDROID) |
258 validator.reset( | 256 validator.reset( |
259 new display_compositor::CompositorOverlayCandidateValidatorAndroid()); | 257 new display_compositor::CompositorOverlayCandidateValidatorAndroid()); |
260 #endif | 258 #endif |
261 | 259 |
262 return validator; | 260 return validator; |
263 } | 261 } |
264 | 262 |
265 static bool ShouldCreateGpuOutputSurface(ui::Compositor* compositor) { | 263 static bool ShouldCreateGpuCompositorFrameSink(ui::Compositor* compositor) { |
266 #if defined(OS_CHROMEOS) | 264 #if defined(OS_CHROMEOS) |
267 // Software fallback does not happen on Chrome OS. | 265 // Software fallback does not happen on Chrome OS. |
268 return true; | 266 return true; |
269 #endif | 267 #endif |
270 if (IsUsingMus()) | 268 if (IsUsingMus()) |
271 return true; | 269 return true; |
272 | 270 |
273 #if defined(OS_WIN) | 271 #if defined(OS_WIN) |
274 if (::GetProp(compositor->widget(), kForceSoftwareCompositor) && | 272 if (::GetProp(compositor->widget(), kForceSoftwareCompositor) && |
275 ::RemoveProp(compositor->widget(), kForceSoftwareCompositor)) | 273 ::RemoveProp(compositor->widget(), kForceSoftwareCompositor)) |
276 return false; | 274 return false; |
277 #endif | 275 #endif |
278 | 276 |
279 return GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor(); | 277 return GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor(); |
280 } | 278 } |
281 | 279 |
282 void GpuProcessTransportFactory::CreateOutputSurface( | 280 void GpuProcessTransportFactory::CreateCompositorFrameSink( |
283 base::WeakPtr<ui::Compositor> compositor) { | 281 base::WeakPtr<ui::Compositor> compositor) { |
284 DCHECK(!!compositor); | 282 DCHECK(!!compositor); |
285 PerCompositorData* data = per_compositor_data_[compositor.get()].get(); | 283 PerCompositorData* data = per_compositor_data_[compositor.get()].get(); |
286 if (!data) { | 284 if (!data) { |
287 data = CreatePerCompositorData(compositor.get()); | 285 data = CreatePerCompositorData(compositor.get()); |
288 } else { | 286 } else { |
289 // TODO(danakj): We can destroy the |data->display| here when the compositor | 287 // TODO(danakj): We can destroy the |data->display| here when the compositor |
290 // destroys its OutputSurface before calling back here. | 288 // destroys its CompositorFrameSink before calling back here. |
291 data->display_output_surface = nullptr; | 289 data->display_output_surface = nullptr; |
292 data->begin_frame_source = nullptr; | 290 data->begin_frame_source = nullptr; |
293 } | 291 } |
294 | 292 |
295 #if defined(OS_WIN) | 293 #if defined(OS_WIN) |
296 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( | 294 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( |
297 compositor->widget()); | 295 compositor->widget()); |
298 #endif | 296 #endif |
299 | 297 |
300 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); | 298 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); |
301 const bool create_gpu_output_surface = | 299 const bool create_gpu_output_surface = |
302 ShouldCreateGpuOutputSurface(compositor.get()); | 300 ShouldCreateGpuCompositorFrameSink(compositor.get()); |
303 if (create_gpu_output_surface && !use_vulkan) { | 301 if (create_gpu_output_surface && !use_vulkan) { |
304 gpu::GpuChannelEstablishedCallback callback( | 302 gpu::GpuChannelEstablishedCallback callback( |
305 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, | 303 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, |
306 callback_factory_.GetWeakPtr(), compositor, | 304 callback_factory_.GetWeakPtr(), compositor, |
307 create_gpu_output_surface, 0)); | 305 create_gpu_output_surface, 0)); |
308 DCHECK(gpu_channel_factory_); | 306 DCHECK(gpu_channel_factory_); |
309 gpu_channel_factory_->EstablishGpuChannel(callback); | 307 gpu_channel_factory_->EstablishGpuChannel(callback); |
310 } else { | 308 } else { |
311 EstablishedGpuChannel(compositor, create_gpu_output_surface, 0, nullptr); | 309 EstablishedGpuChannel(compositor, create_gpu_output_surface, 0, nullptr); |
312 } | 310 } |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 HostSharedBitmapManager::current(), | 544 HostSharedBitmapManager::current(), |
547 GetGpuMemoryBufferManager(), | 545 GetGpuMemoryBufferManager(), |
548 compositor->GetRendererSettings(), std::move(begin_frame_source), | 546 compositor->GetRendererSettings(), std::move(begin_frame_source), |
549 std::move(display_output_surface), std::move(scheduler), | 547 std::move(display_output_surface), std::move(scheduler), |
550 base::MakeUnique<cc::TextureMailboxDeleter>( | 548 base::MakeUnique<cc::TextureMailboxDeleter>( |
551 compositor->task_runner().get())); | 549 compositor->task_runner().get())); |
552 | 550 |
553 // The |delegated_output_surface| is given back to the compositor, it | 551 // The |delegated_output_surface| is given back to the compositor, it |
554 // delegates to the Display as its root surface. Importantly, it shares the | 552 // delegates to the Display as its root surface. Importantly, it shares the |
555 // same ContextProvider as the Display's output surface. | 553 // same ContextProvider as the Display's output surface. |
556 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface( | 554 auto compositor_frame_sink = |
557 vulkan_context_provider | 555 vulkan_context_provider |
558 ? new cc::SurfaceDisplayOutputSurface( | 556 ? base::MakeUnique<cc::DirectCompositorFrameSink>( |
559 surface_manager_.get(), compositor->surface_id_allocator(), | 557 surface_manager_.get(), compositor->surface_id_allocator(), |
560 data->display.get(), | 558 data->display.get(), |
561 static_cast<scoped_refptr<cc::VulkanContextProvider>>( | 559 static_cast<scoped_refptr<cc::VulkanContextProvider>>( |
562 vulkan_context_provider)) | 560 vulkan_context_provider)) |
563 : new cc::SurfaceDisplayOutputSurface( | 561 : base::MakeUnique<cc::DirectCompositorFrameSink>( |
564 surface_manager_.get(), compositor->surface_id_allocator(), | 562 surface_manager_.get(), compositor->surface_id_allocator(), |
565 data->display.get(), context_provider, | 563 data->display.get(), context_provider, |
566 shared_worker_context_provider_)); | 564 shared_worker_context_provider_); |
567 data->display->Resize(compositor->size()); | 565 data->display->Resize(compositor->size()); |
568 data->display->SetOutputIsSecure(data->output_is_secure); | 566 data->display->SetOutputIsSecure(data->output_is_secure); |
569 data->display->SetColorSpace(data->color_space); | 567 data->display->SetColorSpace(data->color_space); |
570 compositor->SetOutputSurface(std::move(delegated_output_surface)); | 568 compositor->SetCompositorFrameSink(std::move(compositor_frame_sink)); |
571 } | 569 } |
572 | 570 |
573 std::unique_ptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( | 571 std::unique_ptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( |
574 ui::Compositor* source_compositor, | 572 ui::Compositor* source_compositor, |
575 ui::Layer* target_layer) { | 573 ui::Layer* target_layer) { |
576 PerCompositorData* source_data = | 574 PerCompositorData* source_data = |
577 per_compositor_data_[source_compositor].get(); | 575 per_compositor_data_[source_compositor].get(); |
578 DCHECK(source_data); | 576 DCHECK(source_data); |
579 | 577 |
580 std::unique_ptr<ReflectorImpl> reflector( | 578 std::unique_ptr<ReflectorImpl> reflector( |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 shared_vulkan_context_provider_ = | 872 shared_vulkan_context_provider_ = |
875 cc::VulkanInProcessContextProvider::Create(); | 873 cc::VulkanInProcessContextProvider::Create(); |
876 } | 874 } |
877 | 875 |
878 shared_vulkan_context_provider_initialized_ = true; | 876 shared_vulkan_context_provider_initialized_ = true; |
879 } | 877 } |
880 return shared_vulkan_context_provider_; | 878 return shared_vulkan_context_provider_; |
881 } | 879 } |
882 | 880 |
883 } // namespace content | 881 } // namespace content |
OLD | NEW |