1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/message_loop/message_loop.h"
6 #include "gpu/command_buffer/service/mailbox_manager.h"
7 #include "mojo/application/application_runner_chromium.h"
8 #include "mojo/public/c/system/main.h"
9 #include "mojo/public/cpp/application/application_connection.h"
10 #include "mojo/public/cpp/application/application_delegate.h"
11 #include "mojo/public/cpp/application/interface_factory_impl.h"
12 #include "mojo/services/native_viewport/gpu_impl.h"
13 #include "mojo/services/native_viewport/native_viewport_impl.h"
14 #include "ui/gl/gl_share_group.h"
15 #include "ui/gl/gl_surface.h"
16
17 namespace mojo {
18
19 class NativeViewportAppDelegate
20 : public ApplicationDelegate,
21 public InterfaceFactory<NativeViewport>,
22 public InterfaceFactory<Gpu>,
23 public InterfaceFactory<NativeViewportConfig> {
24 public:
NativeViewportAppDelegate()25 NativeViewportAppDelegate()
26 : share_group_(new gfx::GLShareGroup),
27 mailbox_manager_(new gpu::gles2::MailboxManager),
28 is_test_(false),
29 is_headless_(false),
30 is_initialized_(false) {}
~NativeViewportAppDelegate()31 virtual ~NativeViewportAppDelegate() {}
32
33 private:
34 class NativeViewportConfigImpl : public InterfaceImpl<NativeViewportConfig> {
35 public:
NativeViewportConfigImpl(NativeViewportAppDelegate * app_delegate)36 NativeViewportConfigImpl(NativeViewportAppDelegate* app_delegate)
37 : app_delegate_(app_delegate) {}
38
UseTestConfig(const Callback<void ()> & callback)39 virtual void UseTestConfig(
40 const Callback<void()>& callback) OVERRIDE {
41 app_delegate_->is_test_ = true;
42 callback.Run();
43 }
44
UseHeadlessConfig(const Callback<void ()> & callback)45 virtual void UseHeadlessConfig(
46 const Callback<void()>& callback) OVERRIDE {
47 app_delegate_->is_headless_ = true;
48 callback.Run();
49 }
50
51 private:
52 NativeViewportAppDelegate* app_delegate_;
53 };
54
55 // ApplicationDelegate implementation.
Initialize(ApplicationImpl * application)56 virtual void Initialize(ApplicationImpl* application) OVERRIDE {
57 app_ = application;
58 }
59
ConfigureIncomingConnection(mojo::ApplicationConnection * connection)60 virtual bool ConfigureIncomingConnection(
61 mojo::ApplicationConnection* connection) OVERRIDE {
62 connection->AddService<NativeViewport>(this);
63 connection->AddService<Gpu>(this);
64 connection->AddService<NativeViewportConfig>(this);
65 return true;
66 }
67
68 // InterfaceFactory<NativeViewport> implementation.
Create(ApplicationConnection * connection,InterfaceRequest<NativeViewport> request)69 virtual void Create(ApplicationConnection* connection,
70 InterfaceRequest<NativeViewport> request) OVERRIDE {
71 #if !defined(COMPONENT_BUILD)
72 if (!is_initialized_) {
73 if (is_test_)
74 gfx::GLSurface::InitializeOneOffForTests();
75 else
76 gfx::GLSurface::InitializeOneOff();
77 is_initialized_ = true;
78 }
79 #endif
80 BindToRequest(new NativeViewportImpl(app_, is_headless_), &request);
81 }
82
83 // InterfaceFactory<Gpu> implementation.
Create(ApplicationConnection * connection,InterfaceRequest<Gpu> request)84 virtual void Create(ApplicationConnection* connection,
85 InterfaceRequest<Gpu> request) OVERRIDE {
86 BindToRequest(new GpuImpl(share_group_.get(), mailbox_manager_.get()),
87 &request);
88 }
89
90 // InterfaceFactory<NVTestConfig> implementation.
Create(ApplicationConnection * connection,InterfaceRequest<NativeViewportConfig> request)91 virtual void Create(ApplicationConnection* connection,
92 InterfaceRequest<NativeViewportConfig> request) OVERRIDE {
93 BindToRequest(new NativeViewportConfigImpl(this), &request);
94 }
95
96 ApplicationImpl* app_;
97 scoped_refptr<gfx::GLShareGroup> share_group_;
98 scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_;
99 bool is_test_;
100 bool is_headless_;
101 bool is_initialized_;
102 DISALLOW_COPY_AND_ASSIGN(NativeViewportAppDelegate);
103 };
104 }
105
MojoMain(MojoHandle shell_handle)106 MojoResult MojoMain(MojoHandle shell_handle) {
107 mojo::ApplicationRunnerChromium runner(new mojo::NativeViewportAppDelegate);
108 runner.set_message_loop_type(base::MessageLoop::TYPE_UI);
109 return runner.Run(shell_handle);
110 }
111