11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <stdio.h>
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string>
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "mojo/examples/sample_app/gles2_client_impl.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/c/system/main.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_delegate.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/cpp/application/application_runner.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/system/core.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/system/macros.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/utility/run_loop.h"
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/services/public/interfaces/gpu/gpu.mojom.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/interfaces/native_viewport/native_viewport.mojom.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace examples {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SampleApp : public mojo::ApplicationDelegate,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  public mojo::NativeViewportClient {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SampleApp() {}
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~SampleApp() {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(darin): Fix shutdown so we don't need to leak this.
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MOJO_ALLOW_UNUSED GLES2ClientImpl* leaked = gles2_client_.release();
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Initialize(mojo::ApplicationImpl* app) MOJO_OVERRIDE {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    app->ConnectToService("mojo:mojo_native_viewport_service", &viewport_);
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    viewport_.set_client(this);
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // TODO(jamesr): Should be mojo:mojo_gpu_service
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    app->ConnectToService("mojo:mojo_native_viewport_service", &gpu_service_);
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    mojo::SizePtr size(mojo::Size::New());
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size->width = 800;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size->height = 600;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    viewport_->Create(size.Pass());
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    viewport_->Show();
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void OnCreated(uint64_t native_viewport_id) MOJO_OVERRIDE {
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    mojo::SizePtr size = mojo::Size::New();
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    size->width = 800;
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    size->height = 600;
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    mojo::CommandBufferPtr command_buffer;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(jamesr): Output to a surface instead.
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    gpu_service_->CreateOnscreenGLES2Context(
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        native_viewport_id, size.Pass(), Get(&command_buffer));
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gles2_client_.reset(new GLES2ClientImpl(command_buffer.Pass()));
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void OnDestroyed() MOJO_OVERRIDE { mojo::RunLoop::current()->Quit(); }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnBoundsChanged(mojo::SizePtr bounds) MOJO_OVERRIDE {
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(bounds);
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (gles2_client_)
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gles2_client_->SetSize(*bounds);
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnEvent(mojo::EventPtr event,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       const mojo::Callback<void()>& callback) MOJO_OVERRIDE {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(event);
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (event->location_data && event->location_data->in_view_location)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gles2_client_->HandleInputEvent(*event);
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    callback.Run();
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<GLES2ClientImpl> gles2_client_;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  mojo::NativeViewportPtr viewport_;
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mojo::GpuPtr gpu_service_;
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SampleApp);
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace examples
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)MojoResult MojoMain(MojoHandle shell_handle) {
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mojo::ApplicationRunner runner(new examples::SampleApp);
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return runner.Run(shell_handle);
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
87