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_); |
} |