• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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