Skip to content

Commit

Permalink
Add FrameSinkMnagerClientBinding Class
Browse files Browse the repository at this point in the history
FrameSinkManagerClientBinding holds the mojo connection between FrameSinkManager
and FrameSinkManagerClient. It is owned by WindowServer.

Service::OnStart creates a FrameSinkManagerClientBinding object before passing
it to the WindowServer.

FrameSinkManagerClientBinding hides the mojo interface pointer from WindowServer
and allows us to unit test WindowServer. Unit tests will be implemented in a
separate CL.

Bug: 698026
Change-Id: I2dfa634709186ca3b5e64be9ecf6040fa9e9826d
Reviewed-on: https://chromium-review.googlesource.com/521823
Reviewed-by: Scott Violet <sky@chromium.org>
Reviewed-by: Fady Samuel <fsamuel@chromium.org>
Commit-Queue: Xingyu Zhang <staraz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#477018}
  • Loading branch information
staraz authored and Commit Bot committed Jun 5, 2017
1 parent a23aa8a commit f4731b4
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 7 deletions.
5 changes: 5 additions & 0 deletions services/ui/service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "services/ui/ws/display_binding.h"
#include "services/ui/ws/display_creation_config.h"
#include "services/ui/ws/display_manager.h"
#include "services/ui/ws/frame_sink_manager_client_binding.h"
#include "services/ui/ws/gpu_host.h"
#include "services/ui/ws/user_activity_monitor.h"
#include "services/ui/ws/user_display_manager.h"
Expand Down Expand Up @@ -200,6 +201,10 @@ void Service::OnStart() {
input_device_server_.RegisterAsObserver();

window_server_.reset(new ws::WindowServer(this));
std::unique_ptr<ws::FrameSinkManagerClientBinding> frame_sink_manager =
base::MakeUnique<ws::FrameSinkManagerClientBinding>(
window_server_.get(), window_server_->gpu_host());
window_server_->SetFrameSinkManager(std::move(frame_sink_manager));

ime_server_.Init(context()->connector(), test_config_);

Expand Down
2 changes: 2 additions & 0 deletions services/ui/ws/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ static_library("lib") {
"focus_controller_observer.h",
"frame_generator.cc",
"frame_generator.h",
"frame_sink_manager_client_binding.cc",
"frame_sink_manager_client_binding.h",
"gpu_client.cc",
"gpu_client.h",
"gpu_host.cc",
Expand Down
66 changes: 66 additions & 0 deletions services/ui/ws/frame_sink_manager_client_binding.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/ui/ws/frame_sink_manager_client_binding.h"

#include "services/ui/ws/gpu_host.h"

namespace ui {
namespace ws {

FrameSinkManagerClientBinding::FrameSinkManagerClientBinding(
cc::mojom::FrameSinkManagerClient* frame_sink_manager_client,
GpuHost* gpu_host)
: frame_sink_manager_client_binding_(frame_sink_manager_client) {
gpu_host->CreateFrameSinkManager(
mojo::MakeRequest(&frame_sink_manager_),
frame_sink_manager_client_binding_.CreateInterfacePtrAndBind());
}

FrameSinkManagerClientBinding::~FrameSinkManagerClientBinding() = default;

void FrameSinkManagerClientBinding::CreateRootCompositorFrameSink(
const cc::FrameSinkId& frame_sink_id,
gpu::SurfaceHandle surface_handle,
cc::mojom::MojoCompositorFrameSinkAssociatedRequest request,
cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
cc::mojom::MojoCompositorFrameSinkClientPtr client,
cc::mojom::DisplayPrivateAssociatedRequest display_private_request) {
frame_sink_manager_->CreateRootCompositorFrameSink(
frame_sink_id, surface_handle, std::move(request),
std::move(private_request), std::move(client),
std::move(display_private_request));
}

void FrameSinkManagerClientBinding::CreateCompositorFrameSink(
const cc::FrameSinkId& frame_sink_id,
cc::mojom::MojoCompositorFrameSinkRequest request,
cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
cc::mojom::MojoCompositorFrameSinkClientPtr client) {
frame_sink_manager_->CreateCompositorFrameSink(
frame_sink_id, std::move(request), std::move(private_request),
std::move(client));
}

void FrameSinkManagerClientBinding::RegisterFrameSinkHierarchy(
const cc::FrameSinkId& parent_frame_sink_id,
const cc::FrameSinkId& child_frame_sink_id) {
frame_sink_manager_->RegisterFrameSinkHierarchy(parent_frame_sink_id,
child_frame_sink_id);
}

void FrameSinkManagerClientBinding::UnregisterFrameSinkHierarchy(
const cc::FrameSinkId& parent_frame_sink_id,
const cc::FrameSinkId& child_frame_sink_id) {
frame_sink_manager_->UnregisterFrameSinkHierarchy(parent_frame_sink_id,
child_frame_sink_id);
}

void FrameSinkManagerClientBinding::DropTemporaryReference(
const cc::SurfaceId& surface_id) {
frame_sink_manager_->DropTemporaryReference(surface_id);
}

} // namespace ws
} // namespace ui
62 changes: 62 additions & 0 deletions services/ui/ws/frame_sink_manager_client_binding.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SERVICES_UI_WS_FRAME_SINK_MANAGER_CLIENT_BINDING_H_
#define SERVICES_UI_WS_FRAME_SINK_MANAGER_CLIENT_BINDING_H_

#include "base/macros.h"
#include "cc/ipc/frame_sink_manager.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"

namespace ui {
namespace ws {

class GpuHost;
class WindowServer;

// FrameSinkManagerClientBinding manages the binding between a WindowServer and
// its FrameSinkManager. FrameSinkManagerClientBinding exists so that a mock
// implementation of FrameSinkManager can be injected for tests. WindowServer
// owns its associated FrameSinkManagerClientBinding.
class FrameSinkManagerClientBinding : public cc::mojom::FrameSinkManager {
public:
FrameSinkManagerClientBinding(
cc::mojom::FrameSinkManagerClient* frame_sink_manager_client,
GpuHost* gpu_host);
~FrameSinkManagerClientBinding() override;

private:
// cc::mojom::FrameSinkManager:
void CreateRootCompositorFrameSink(
const cc::FrameSinkId& frame_sink_id,
gpu::SurfaceHandle surface_handle,
cc::mojom::MojoCompositorFrameSinkAssociatedRequest request,
cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
cc::mojom::MojoCompositorFrameSinkClientPtr client,
cc::mojom::DisplayPrivateAssociatedRequest display_private_request)
override;
void CreateCompositorFrameSink(
const cc::FrameSinkId& frame_sink_id,
cc::mojom::MojoCompositorFrameSinkRequest request,
cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request,
cc::mojom::MojoCompositorFrameSinkClientPtr client) override;
void RegisterFrameSinkHierarchy(
const cc::FrameSinkId& parent_frame_sink_id,
const cc::FrameSinkId& child_frame_sink_id) override;
void UnregisterFrameSinkHierarchy(
const cc::FrameSinkId& parent_frame_sink_id,
const cc::FrameSinkId& child_frame_sink_id) override;
void DropTemporaryReference(const cc::SurfaceId& surface_id) override;

mojo::Binding<cc::mojom::FrameSinkManagerClient>
frame_sink_manager_client_binding_;
cc::mojom::FrameSinkManagerPtr frame_sink_manager_;

DISALLOW_COPY_AND_ASSIGN(FrameSinkManagerClientBinding);
};

} // namespace ws
} // namespace ui

#endif // SERVICES_UI_WS_FRAME_SINK_MANAGER_CLIENT_BINDING_H_
5 changes: 5 additions & 0 deletions services/ui/ws/test_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "services/ui/ws/display_binding.h"
#include "services/ui/ws/display_creation_config.h"
#include "services/ui/ws/display_manager.h"
#include "services/ui/ws/frame_sink_manager_client_binding.h"
#include "services/ui/ws/window_manager_access_policy.h"
#include "services/ui/ws/window_manager_window_tree_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
Expand Down Expand Up @@ -552,6 +553,10 @@ WindowServerTestHelper::WindowServerTestHelper()
message_loop_ = base::MakeUnique<base::MessageLoop>();
PlatformDisplay::set_factory_for_testing(&platform_display_factory_);
window_server_ = base::MakeUnique<WindowServer>(&window_server_delegate_);
std::unique_ptr<FrameSinkManagerClientBinding> frame_sink_manager =
base::MakeUnique<FrameSinkManagerClientBinding>(
window_server_.get(), window_server_->gpu_host());
window_server_->SetFrameSinkManager(std::move(frame_sink_manager));
window_server_delegate_.set_window_server(window_server_.get());
}

Expand Down
9 changes: 5 additions & 4 deletions services/ui/ws/window_server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,9 @@ WindowServer::WindowServer(WindowServerDelegate* delegate)
next_wm_change_id_(0),
gpu_host_(new GpuHost(this)),
window_manager_window_tree_factory_set_(this, &user_id_tracker_),
frame_sink_manager_client_binding_(this),
display_creation_config_(DisplayCreationConfig::UNKNOWN) {
user_id_tracker_.AddObserver(this);
OnUserIdAdded(user_id_tracker_.active_id());
gpu_host_->CreateFrameSinkManager(
mojo::MakeRequest(&frame_sink_manager_),
frame_sink_manager_client_binding_.CreateInterfacePtrAndBind());
}

WindowServer::~WindowServer() {
Expand All @@ -103,6 +99,11 @@ void WindowServer::SetDisplayCreationConfig(DisplayCreationConfig config) {
display_manager_->OnDisplayCreationConfigSet();
}

void WindowServer::SetFrameSinkManager(
std::unique_ptr<cc::mojom::FrameSinkManager> frame_sink_manager) {
frame_sink_manager_ = std::move(frame_sink_manager);
}

ServerWindow* WindowServer::CreateServerWindow(
const WindowId& id,
const std::map<std::string, std::vector<uint8_t>>& properties) {
Expand Down
10 changes: 7 additions & 3 deletions services/ui/ws/window_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ class WindowServer : public ServerWindowDelegate,
return display_creation_config_;
}

// Pass the FrameSinkManager to WindowServer. This is needed because
// FrameSinkManagerClientBinding (the FrameSinkManager implementation being
// used) requires WindowServer's GpuHost to create.
void SetFrameSinkManager(
std::unique_ptr<cc::mojom::FrameSinkManager> frame_sink_manager);

// Creates a new ServerWindow. The return value is owned by the caller, but
// must be destroyed before WindowServer.
ServerWindow* CreateServerWindow(
Expand Down Expand Up @@ -397,9 +403,7 @@ class WindowServer : public ServerWindowDelegate,
cc::SurfaceId root_surface_id_;

// Provides interfaces to create and manage FrameSinks.
mojo::Binding<cc::mojom::FrameSinkManagerClient>
frame_sink_manager_client_binding_;
cc::mojom::FrameSinkManagerPtr frame_sink_manager_;
std::unique_ptr<cc::mojom::FrameSinkManager> frame_sink_manager_;

DisplayCreationConfig display_creation_config_;

Expand Down

0 comments on commit f4731b4

Please sign in to comment.