| 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" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 } | 158 } |
| 159 #endif | 159 #endif |
| 160 | 160 |
| 161 } // namespace | 161 } // namespace |
| 162 | 162 |
| 163 namespace content { | 163 namespace content { |
| 164 | 164 |
| 165 struct GpuProcessTransportFactory::PerCompositorData { | 165 struct GpuProcessTransportFactory::PerCompositorData { |
| 166 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; | 166 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; |
| 167 BrowserCompositorOutputSurface* display_output_surface = nullptr; | 167 BrowserCompositorOutputSurface* display_output_surface = nullptr; |
| 168 cc::SyntheticBeginFrameSource* begin_frame_source = nullptr; | 168 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source; |
| 169 ReflectorImpl* reflector = nullptr; | 169 ReflectorImpl* reflector = nullptr; |
| 170 std::unique_ptr<cc::Display> display; | 170 std::unique_ptr<cc::Display> display; |
| 171 bool output_is_secure = false; | 171 bool output_is_secure = false; |
| 172 }; | 172 }; |
| 173 | 173 |
| 174 GpuProcessTransportFactory::GpuProcessTransportFactory() | 174 GpuProcessTransportFactory::GpuProcessTransportFactory() |
| 175 : task_graph_runner_(new cc::SingleThreadTaskGraphRunner), | 175 : task_graph_runner_(new cc::SingleThreadTaskGraphRunner), |
| 176 callback_factory_(this) { | 176 callback_factory_(this) { |
| 177 cc::SetClientNameForMetrics("Browser"); | 177 cc::SetClientNameForMetrics("Browser"); |
| 178 | 178 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 return GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor(); | 285 return GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor(); |
| 286 } | 286 } |
| 287 | 287 |
| 288 void GpuProcessTransportFactory::CreateCompositorFrameSink( | 288 void GpuProcessTransportFactory::CreateCompositorFrameSink( |
| 289 base::WeakPtr<ui::Compositor> compositor) { | 289 base::WeakPtr<ui::Compositor> compositor) { |
| 290 DCHECK(!!compositor); | 290 DCHECK(!!compositor); |
| 291 PerCompositorData* data = per_compositor_data_[compositor.get()].get(); | 291 PerCompositorData* data = per_compositor_data_[compositor.get()].get(); |
| 292 if (!data) { | 292 if (!data) { |
| 293 data = CreatePerCompositorData(compositor.get()); | 293 data = CreatePerCompositorData(compositor.get()); |
| 294 } else { | 294 } else { |
| 295 // TODO(danakj): We can destroy the |data->display| here when the compositor | 295 // TODO(danakj): We can destroy the |data->display| and |
| 296 // destroys its CompositorFrameSink before calling back here. | 296 // |data->begin_frame_source| here when the compositor destroys its |
| 297 // CompositorFrameSink before calling back here. |
| 297 data->display_output_surface = nullptr; | 298 data->display_output_surface = nullptr; |
| 298 data->begin_frame_source = nullptr; | |
| 299 } | 299 } |
| 300 | 300 |
| 301 #if defined(OS_WIN) | 301 #if defined(OS_WIN) |
| 302 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( | 302 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( |
| 303 compositor->widget()); | 303 compositor->widget()); |
| 304 #endif | 304 #endif |
| 305 | 305 |
| 306 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); | 306 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); |
| 307 const bool create_gpu_output_surface = | 307 const bool create_gpu_output_surface = |
| 308 ShouldCreateGpuCompositorFrameSink(compositor.get()); | 308 ShouldCreateGpuCompositorFrameSink(compositor.get()); |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 } | 539 } |
| 540 #else | 540 #else |
| 541 NOTREACHED(); | 541 NOTREACHED(); |
| 542 #endif | 542 #endif |
| 543 } | 543 } |
| 544 } | 544 } |
| 545 } | 545 } |
| 546 } | 546 } |
| 547 | 547 |
| 548 data->display_output_surface = display_output_surface.get(); | 548 data->display_output_surface = display_output_surface.get(); |
| 549 data->begin_frame_source = begin_frame_source.get(); | |
| 550 if (data->reflector) | 549 if (data->reflector) |
| 551 data->reflector->OnSourceSurfaceReady(data->display_output_surface); | 550 data->reflector->OnSourceSurfaceReady(data->display_output_surface); |
| 552 | 551 |
| 553 #if defined(OS_WIN) | 552 #if defined(OS_WIN) |
| 554 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( | 553 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( |
| 555 compositor->widget()); | 554 compositor->widget()); |
| 556 #endif | 555 #endif |
| 557 | 556 |
| 558 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( | 557 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( |
| 559 begin_frame_source.get(), compositor->task_runner().get(), | 558 compositor->task_runner().get(), |
| 560 display_output_surface->capabilities().max_frames_pending)); | 559 display_output_surface->capabilities().max_frames_pending)); |
| 561 | 560 |
| 562 // The Display owns and uses the |display_output_surface| created above. | 561 // The Display owns and uses the |display_output_surface| created above. |
| 563 data->display = base::MakeUnique<cc::Display>( | 562 data->display = base::MakeUnique<cc::Display>( |
| 564 HostSharedBitmapManager::current(), GetGpuMemoryBufferManager(), | 563 HostSharedBitmapManager::current(), GetGpuMemoryBufferManager(), |
| 565 compositor->GetRendererSettings(), compositor->frame_sink_id(), | 564 compositor->GetRendererSettings(), compositor->frame_sink_id(), |
| 566 std::move(begin_frame_source), std::move(display_output_surface), | 565 begin_frame_source.get(), std::move(display_output_surface), |
| 567 std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>( | 566 std::move(scheduler), base::MakeUnique<cc::TextureMailboxDeleter>( |
| 568 compositor->task_runner().get())); | 567 compositor->task_runner().get())); |
| 568 // Note that we are careful not to destroy a prior |data->begin_frame_source| |
| 569 // until we have reset |data->display|. |
| 570 data->begin_frame_source = std::move(begin_frame_source); |
| 569 | 571 |
| 570 // The |delegated_output_surface| is given back to the compositor, it | 572 // The |delegated_output_surface| is given back to the compositor, it |
| 571 // delegates to the Display as its root surface. Importantly, it shares the | 573 // delegates to the Display as its root surface. Importantly, it shares the |
| 572 // same ContextProvider as the Display's output surface. | 574 // same ContextProvider as the Display's output surface. |
| 573 auto compositor_frame_sink = | 575 auto compositor_frame_sink = |
| 574 vulkan_context_provider | 576 vulkan_context_provider |
| 575 ? base::MakeUnique<cc::DirectCompositorFrameSink>( | 577 ? base::MakeUnique<cc::DirectCompositorFrameSink>( |
| 576 compositor->frame_sink_id(), surface_manager_.get(), | 578 compositor->frame_sink_id(), surface_manager_.get(), |
| 577 data->display.get(), | 579 data->display.get(), |
| 578 static_cast<scoped_refptr<cc::VulkanContextProvider>>( | 580 static_cast<scoped_refptr<cc::VulkanContextProvider>>( |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 894 shared_vulkan_context_provider_ = | 896 shared_vulkan_context_provider_ = |
| 895 cc::VulkanInProcessContextProvider::Create(); | 897 cc::VulkanInProcessContextProvider::Create(); |
| 896 } | 898 } |
| 897 | 899 |
| 898 shared_vulkan_context_provider_initialized_ = true; | 900 shared_vulkan_context_provider_initialized_ = true; |
| 899 } | 901 } |
| 900 return shared_vulkan_context_provider_; | 902 return shared_vulkan_context_provider_; |
| 901 } | 903 } |
| 902 | 904 |
| 903 } // namespace content | 905 } // namespace content |
| OLD | NEW |