| Index: services/ui/ws/window_server.cc
|
| diff --git a/services/ui/ws/window_server.cc b/services/ui/ws/window_server.cc
|
| index b589f61554d4d335f741ecd7f77f81022a9082f6..f4d960a65c3c858f7f588d525afbef07bb726961 100644
|
| --- a/services/ui/ws/window_server.cc
|
| +++ b/services/ui/ws/window_server.cc
|
| @@ -56,11 +56,10 @@ WindowServer::WindowServer(WindowServerDelegate* delegate)
|
| next_wm_change_id_(0),
|
| gpu_proxy_(new GpuServiceProxy(this)),
|
| window_manager_window_tree_factory_set_(this, &user_id_tracker_),
|
| - display_compositor_client_binding_(this),
|
| - display_compositor_(new DisplayCompositor(
|
| - display_compositor_client_binding_.CreateInterfacePtrAndBind())) {
|
| + display_compositor_client_binding_(this) {
|
| user_id_tracker_.AddObserver(this);
|
| OnUserIdAdded(user_id_tracker_.active_id());
|
| + display_compositor_request_ = mojo::GetProxy(&display_compositor_);
|
| }
|
|
|
| WindowServer::~WindowServer() {
|
| @@ -496,8 +495,6 @@ WindowTree* WindowServer::GetCurrentDragLoopInitiator() {
|
| }
|
|
|
| void WindowServer::OnDisplayReady(Display* display, bool is_first) {
|
| - if (gpu_channel_)
|
| - display->platform_display()->OnGpuChannelEstablished(gpu_channel_);
|
| if (is_first)
|
| delegate_->OnFirstDisplayReady();
|
| }
|
| @@ -512,7 +509,7 @@ WindowManagerState* WindowServer::GetWindowManagerStateForUser(
|
| user_id);
|
| }
|
|
|
| -ui::DisplayCompositor* WindowServer::GetDisplayCompositor() {
|
| +cc::mojom::DisplayCompositor* WindowServer::GetDisplayCompositor() {
|
| return display_compositor_.get();
|
| }
|
|
|
| @@ -745,12 +742,22 @@ void WindowServer::OnTransientWindowRemoved(ServerWindow* window,
|
| }
|
| }
|
|
|
| -void WindowServer::OnGpuChannelEstablished(
|
| - scoped_refptr<gpu::GpuChannelHost> gpu_channel) {
|
| - gpu_channel_ = std::move(gpu_channel);
|
| - const std::set<Display*>& displays = display_manager()->displays();
|
| - for (auto* display : displays)
|
| - display->platform_display()->OnGpuChannelEstablished(gpu_channel_);
|
| +void WindowServer::OnGpuServiceInitialized() {
|
| + // TODO(fsamuel): Currently we: 1. create the gpu service, 2. we initialize
|
| + // GL and then 3. we request a display compositor interface after
|
| + // initialization. A display compositor interface can be created at any time,
|
| + // even prior to completing initialization. If initialization crashes the GPU
|
| + // process, then we will still get a connection error on the
|
| + // |display_compositor_client_binding_| binding. We should investigate doing
|
| + // this in parallel with initialization in the future.
|
| + // The display compositor gets its own thread in mus-gpu. The gpu service,
|
| + // where GL commands are processed resides on its own thread. Various
|
| + // components of the display compositor such as Display, ResourceProvider,
|
| + // and GLRenderer block on sync tokens from other command buffers. Thus,
|
| + // the gpu service must live on a separate thread.
|
| + gpu_proxy_->CreateDisplayCompositor(
|
| + std::move(display_compositor_request_),
|
| + display_compositor_client_binding_.CreateInterfacePtrAndBind());
|
| // TODO(kylechar): When gpu channel is removed, this can instead happen
|
| // earlier, after GpuServiceProxy::OnInitialized().
|
| delegate_->StartDisplayInit();
|
|
|