Chromium Code Reviews| Index: services/ui/gpu/gpu_main.cc |
| diff --git a/services/ui/gpu/gpu_main.cc b/services/ui/gpu/gpu_main.cc |
| index e590b355ac22ca6a93f94c3cd01a345626b7623f..62824bce4ae381a633d72e58e78579eff18f3f21 100644 |
| --- a/services/ui/gpu/gpu_main.cc |
| +++ b/services/ui/gpu/gpu_main.cc |
| @@ -13,6 +13,7 @@ |
| #include "components/viz/service/display_compositor/gpu_display_provider.h" |
| #include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" |
| #include "gpu/command_buffer/common/activity_flags.h" |
| +#include "gpu/ipc/client/gpu_memory_buffer_impl.h" |
| #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
| #include "gpu/ipc/gpu_in_process_thread_service.h" |
| #include "gpu/ipc/service/gpu_memory_buffer_factory.h" |
| @@ -44,6 +45,57 @@ std::unique_ptr<base::MessagePump> CreateMessagePumpMac() { |
| } |
| #endif // defined(OS_MACOSX) |
| +class InProcessGpuMemoryBufferManager : public gpu::GpuMemoryBufferManager { |
|
Fady Samuel
2017/06/16 22:33:17
Move this to a separate file please
|
| + public: |
| + InProcessGpuMemoryBufferManager(gpu::GpuChannelManager* channel_manager, |
| + gpu::GpuMemoryBufferFactory* memory_factory) |
| + : client_id_(1), |
| + channel_manager_(channel_manager), |
| + memory_factory_(memory_factory), |
| + weak_factory_(this) { |
| + weak_ptr_ = weak_factory_.GetWeakPtr(); |
| + } |
| + |
| + ~InProcessGpuMemoryBufferManager() override {} |
| + |
| + private: |
| + void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, |
| + int client_id, |
| + const gpu::SyncToken& sync_token) { |
| + channel_manager_->DestroyGpuMemoryBuffer(id, client_id, sync_token); |
| + } |
| + |
| + // gpu::GpuMemoryBufferManager: |
| + std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer( |
| + const gfx::Size& size, |
| + gfx::BufferFormat format, |
| + gfx::BufferUsage usage, |
| + gpu::SurfaceHandle surface_handle) override { |
| + gfx::GpuMemoryBufferId id(next_gpu_memory_id_++); |
| + gfx::GpuMemoryBufferHandle buffer_handle = |
| + memory_factory_->CreateGpuMemoryBuffer(id, size, format, usage, |
| + client_id_, surface_handle); |
| + return gpu::GpuMemoryBufferImpl::CreateFromHandle( |
| + buffer_handle, size, format, usage, |
| + base::Bind(&InProcessGpuMemoryBufferManager::DestroyGpuMemoryBuffer, |
| + weak_ptr_, id, client_id_)); |
| + } |
| + |
| + void SetDestructionSyncToken(gfx::GpuMemoryBuffer* buffer, |
| + const gpu::SyncToken& sync_token) override { |
| + static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( |
| + sync_token); |
| + } |
| + |
| + const int client_id_; |
| + int next_gpu_memory_id_ = 1; |
| + gpu::GpuChannelManager* channel_manager_; |
| + gpu::GpuMemoryBufferFactory* memory_factory_; |
| + base::WeakPtr<InProcessGpuMemoryBufferManager> weak_ptr_; |
| + base::WeakPtrFactory<InProcessGpuMemoryBufferManager> weak_factory_; |
| + DISALLOW_COPY_AND_ASSIGN(InProcessGpuMemoryBufferManager); |
| +}; |
| + |
| } // namespace |
| namespace ui { |
| @@ -175,35 +227,26 @@ void GpuMain::CreateFrameSinkManagerInternal( |
| gpu_service_->mailbox_manager(), gpu_service_->share_group()); |
| gpu::ImageFactory* image_factory = gpu_service_->gpu_image_factory(); |
| - |
| - // If the FrameSinkManager creation was delayed because GpuService had not |
| - // been created yet, then this is called, in gpu thread, right after |
| - // GpuService is created. |
| - mojom::GpuServicePtr gpu_service; |
| - BindGpuInternalOnGpuThread(mojo::MakeRequest(&gpu_service)); |
| compositor_thread_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&GpuMain::CreateFrameSinkManagerOnCompositorThread, |
| base::Unretained(this), image_factory, |
| - base::Passed(gpu_service.PassInterface()), |
| base::Passed(std::move(request)), |
| base::Passed(std::move(client_info)))); |
| } |
| void GpuMain::CreateFrameSinkManagerOnCompositorThread( |
| gpu::ImageFactory* image_factory, |
| - mojom::GpuServicePtrInfo gpu_service_info, |
| cc::mojom::FrameSinkManagerRequest request, |
| cc::mojom::FrameSinkManagerClientPtrInfo client_info) { |
| DCHECK(!frame_sink_manager_); |
| cc::mojom::FrameSinkManagerClientPtr client; |
| client.Bind(std::move(client_info)); |
| - gpu_internal_.Bind(std::move(gpu_service_info)); |
| - |
| display_provider_ = base::MakeUnique<viz::GpuDisplayProvider>( |
| gpu_command_service_, |
| - base::MakeUnique<viz::ServerGpuMemoryBufferManager>(gpu_internal_.get(), |
| - 1 /* client_id */), |
| + base::MakeUnique<InProcessGpuMemoryBufferManager>( |
| + gpu_service_->gpu_channel_manager(), |
| + gpu_service_->gpu_memory_buffer_factory()), |
| image_factory); |
| frame_sink_manager_ = base::MakeUnique<viz::MojoFrameSinkManager>( |
| @@ -215,7 +258,6 @@ void GpuMain::CreateFrameSinkManagerOnCompositorThread( |
| void GpuMain::TearDownOnCompositorThread() { |
| frame_sink_manager_.reset(); |
| display_provider_.reset(); |
| - gpu_internal_.reset(); |
| } |
| void GpuMain::TearDownOnGpuThread() { |
| @@ -242,10 +284,6 @@ void GpuMain::CreateGpuServiceOnGpuThread( |
| } |
| } |
| -void GpuMain::BindGpuInternalOnGpuThread(mojom::GpuServiceRequest request) { |
| - gpu_service_->Bind(std::move(request)); |
| -} |
| - |
| void GpuMain::PreSandboxStartup() { |
| // TODO(sad): https://crbug.com/645602 |
| } |