Chromium Code Reviews| Index: services/ui/gpu/gpu_service_internal.cc |
| diff --git a/services/ui/gpu/gpu_service_internal.cc b/services/ui/gpu/gpu_service_internal.cc |
| index adfc88fdadf0fe1ddc398b1ac342b8b4a2acda81..cb0bcd8c8b4c67936839c907172b51e553310133 100644 |
| --- a/services/ui/gpu/gpu_service_internal.cc |
| +++ b/services/ui/gpu/gpu_service_internal.cc |
| @@ -4,9 +4,11 @@ |
| #include "services/ui/gpu/gpu_service_internal.h" |
| +#include "base/bind.h" |
| #include "base/memory/shared_memory.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "build/build_config.h" |
| +#include "cc/output/in_process_context_provider.h" |
| #include "gpu/command_buffer/service/gpu_switches.h" |
| #include "gpu/command_buffer/service/sync_point_manager.h" |
| #include "gpu/config/gpu_info_collector.h" |
| @@ -14,6 +16,8 @@ |
| #include "gpu/config/gpu_util.h" |
| #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
| #include "gpu/ipc/common/memory_stats.h" |
| +#include "gpu/ipc/gpu_in_process_thread_service.h" |
| +#include "gpu/ipc/service/gpu_channel_manager.h" |
| #include "gpu/ipc/service/gpu_memory_buffer_factory.h" |
| #include "gpu/ipc/service/gpu_watchdog_thread.h" |
| #include "ipc/ipc_channel_handle.h" |
| @@ -22,6 +26,9 @@ |
| #include "media/gpu/ipc/service/gpu_video_decode_accelerator.h" |
| #include "media/gpu/ipc/service/gpu_video_encode_accelerator.h" |
| #include "media/gpu/ipc/service/media_gpu_channel_manager.h" |
| +#include "mojo/public/cpp/bindings/strong_binding.h" |
| +#include "services/ui/surfaces/display_compositor.h" |
| +#include "services/ui/surfaces/mus_gpu_memory_buffer_manager.h" |
| #include "ui/gl/gl_implementation.h" |
| #include "ui/gl/gl_switches.h" |
| #include "ui/gl/gpu_switching_manager.h" |
| @@ -41,10 +48,12 @@ GpuServiceInternal::GpuServiceInternal( |
| watchdog_thread_(std::move(watchdog_thread)), |
| gpu_memory_buffer_factory_(gpu_memory_buffer_factory), |
| gpu_info_(gpu_info), |
| - binding_(this) {} |
| + compositor_thread_("GpuCompositorThread") { |
|
sadrul
2016/11/21 17:23:49
DisplayCompositorThread?
Fady Samuel
2016/11/21 20:40:41
Done.
|
| + compositor_thread_.Start(); |
| +} |
| GpuServiceInternal::~GpuServiceInternal() { |
| - binding_.Close(); |
| + bindings_.CloseAllBindings(); |
| media_gpu_channel_manager_.reset(); |
| gpu_channel_manager_.reset(); |
| owned_sync_point_manager_.reset(); |
| @@ -57,8 +66,7 @@ GpuServiceInternal::~GpuServiceInternal() { |
| } |
| void GpuServiceInternal::Add(mojom::GpuServiceInternalRequest request) { |
| - binding_.Close(); |
| - binding_.Bind(std::move(request)); |
| + bindings_.AddBinding(this, std::move(request)); |
| } |
| void GpuServiceInternal::CreateGpuMemoryBuffer( |
| @@ -83,6 +91,47 @@ void GpuServiceInternal::DestroyGpuMemoryBuffer( |
| gpu_channel_manager_->DestroyGpuMemoryBuffer(id, client_id, sync_token); |
| } |
| +void GpuServiceInternal::CreateDisplayCompositor( |
| + cc::mojom::DisplayCompositorRequest request, |
| + cc::mojom::DisplayCompositorClientPtr client) { |
| + DCHECK(!gpu_command_service_); |
|
sadrul
2016/11/21 17:23:49
DCHECK(CalledOnValidThread())
Fady Samuel
2016/11/21 20:40:41
Done.
|
| + gpu_command_service_ = new gpu::GpuInProcessThreadService( |
| + base::ThreadTaskRunnerHandle::Get(), owned_sync_point_manager_.get(), |
| + gpu_channel_manager_->mailbox_manager(), |
| + gpu_channel_manager_->share_group()); |
| + mojom::GpuServiceInternalPtr gpu_service_ptr; |
| + Add(mojo::GetProxy(&gpu_service_ptr)); |
| + compositor_thread_.task_runner()->PostTask( |
|
sadrul
2016/11/21 17:23:49
Why does DC need to live in a separate thread? (I
Fady Samuel
2016/11/21 20:40:41
InProcessCommandBuffer can block on progress on th
|
| + FROM_HERE, |
| + base::Bind(&GpuServiceInternal::CreateDisplayCompositorOnCompositorThread, |
| + base::Unretained(this), |
| + base::Passed(gpu_service_ptr.PassInterface()), |
| + base::Passed(&request), base::Passed(client.PassInterface()))); |
| +} |
| + |
| +void GpuServiceInternal::CreateDisplayCompositorOnCompositorThread( |
| + mojom::GpuServiceInternalPtrInfo gpu_service_info, |
| + cc::mojom::DisplayCompositorRequest request, |
| + cc::mojom::DisplayCompositorClientPtrInfo client_info) { |
| + mojom::GpuServiceInternalPtr gpu_service_ptr; |
|
sadrul
2016/11/21 17:23:49
DCHECK(compositor_thread_.task_runner()->BelongsTo
Fady Samuel
2016/11/21 20:40:41
Done.
|
| + gpu_service_ptr.Bind(std::move(gpu_service_info)); |
| + |
| + cc::mojom::DisplayCompositorClientPtr client_ptr; |
| + client_ptr.Bind(std::move(client_info)); |
| + |
| + std::unique_ptr<MusGpuMemoryBufferManager> gpu_memory_buffer_manager = |
| + base::MakeUnique<MusGpuMemoryBufferManager>(std::move(gpu_service_ptr), |
| + 1 /* client_id */); |
| + // |gpu_memory_buffer_factory_| is null in tests. |
| + gpu::ImageFactory* image_factory = |
| + gpu_memory_buffer_factory_ ? gpu_memory_buffer_factory_->AsImageFactory() |
| + : nullptr; |
| + mojo::MakeStrongBinding( |
| + base::MakeUnique<DisplayCompositor>(gpu_command_service_, |
| + std::move(gpu_memory_buffer_manager), |
| + image_factory, std::move(client_ptr)), |
| + std::move(request)); |
| +} |
| void GpuServiceInternal::DidCreateOffscreenContext(const GURL& active_url) { |
| NOTIMPLEMENTED(); |
| } |
| @@ -145,6 +194,7 @@ void GpuServiceInternal::Initialize(const InitializeCallback& callback) { |
| media_gpu_channel_manager_.reset( |
| new media::MediaGpuChannelManager(gpu_channel_manager_.get())); |
| + |
| callback.Run(gpu_info_); |
| } |