blob: 18c4cb3fdc7236df73cd5d6b34aa5328c6a180a9 [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// Copyright 2013 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 <stdio.h>
6#include <string>
7
8#include "base/bind.h"
James Robinson91b812b2015-01-28 17:13:54 -08009#include "base/memory/scoped_ptr.h"
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010010#include "examples/spinning_cube/gles2_client_impl.h"
James Robinson646469d2014-10-03 15:33:28 -070011#include "mojo/public/c/system/main.h"
12#include "mojo/public/cpp/application/application_connection.h"
13#include "mojo/public/cpp/application/application_delegate.h"
14#include "mojo/public/cpp/application/application_impl.h"
15#include "mojo/public/cpp/application/application_runner.h"
16#include "mojo/public/cpp/system/core.h"
17#include "mojo/public/cpp/system/macros.h"
18#include "mojo/public/cpp/utility/run_loop.h"
Colin Blundellecff1e72014-12-10 22:16:07 +010019#include "mojo/services/gpu/public/interfaces/gpu.mojom.h"
Colin Blundell45b7fba2014-12-10 21:48:15 +010020#include "mojo/services/native_viewport/public/interfaces/native_viewport.mojom.h"
James Robinson646469d2014-10-03 15:33:28 -070021
22namespace examples {
23
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010024class SpinningCubeApp : public mojo::ApplicationDelegate,
Viet-Trung Luu641ca6d2015-07-07 15:17:48 -070025 public mojo::NativeViewportEventDispatcher {
James Robinson646469d2014-10-03 15:33:28 -070026 public:
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010027 SpinningCubeApp() : dispatcher_binding_(this) {}
James Robinson646469d2014-10-03 15:33:28 -070028
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010029 ~SpinningCubeApp() override {
James Robinson646469d2014-10-03 15:33:28 -070030 // TODO(darin): Fix shutdown so we don't need to leak this.
James Robinsone2ac7e82014-10-15 13:21:59 -070031 mojo_ignore_result(gles2_client_.release());
James Robinson646469d2014-10-03 15:33:28 -070032 }
33
Scott Violetc947ecc2014-10-28 16:49:51 -070034 void Initialize(mojo::ApplicationImpl* app) override {
James Robinson24218d72014-10-20 16:18:41 -070035 app->ConnectToService("mojo:native_viewport_service", &viewport_);
Viet-Trung Luu641ca6d2015-07-07 15:17:48 -070036 viewport_.set_connection_error_handler(
37 [this]() { OnViewportConnectionError(); });
James Robinson646469d2014-10-03 15:33:28 -070038
Scott Violetc947ecc2014-10-28 16:49:51 -070039 SetEventDispatcher();
40
James Robinson646469d2014-10-03 15:33:28 -070041 mojo::SizePtr size(mojo::Size::New());
42 size->width = 800;
43 size->height = 600;
Ian Fischerf66f4372015-06-09 16:50:28 -070044
45 auto requested_configuration = mojo::SurfaceConfiguration::New();
46 requested_configuration->depth_bits = 16;
47
James Robinson187e1fa2015-03-04 15:49:53 -080048 viewport_->Create(
49 size.Clone(),
Ian Fischerf66f4372015-06-09 16:50:28 -070050 requested_configuration.Pass(),
James Robinson187e1fa2015-03-04 15:49:53 -080051 base::Bind(&SpinningCubeApp::OnMetricsChanged, base::Unretained(this)));
James Robinson646469d2014-10-03 15:33:28 -070052 viewport_->Show();
James Robinson187e1fa2015-03-04 15:49:53 -080053 mojo::ContextProviderPtr onscreen_context_provider;
54 viewport_->GetContextProvider(GetProxy(&onscreen_context_provider));
55
56 gles2_client_.reset(new GLES2ClientImpl(onscreen_context_provider.Pass()));
57 gles2_client_->SetSize(*size);
James Robinson646469d2014-10-03 15:33:28 -070058 }
59
James Robinson91b812b2015-01-28 17:13:54 -080060 void OnMetricsChanged(mojo::ViewportMetricsPtr metrics) {
Adam Barth9329c442015-01-09 21:56:43 -080061 assert(metrics);
James Robinson187e1fa2015-03-04 15:49:53 -080062 gles2_client_->SetSize(*metrics->size);
James Robinson91b812b2015-01-28 17:13:54 -080063 viewport_->RequestMetrics(
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010064 base::Bind(&SpinningCubeApp::OnMetricsChanged, base::Unretained(this)));
James Robinson646469d2014-10-03 15:33:28 -070065 }
66
Scott Violetc947ecc2014-10-28 16:49:51 -070067 void OnEvent(mojo::EventPtr event,
68 const mojo::Callback<void()>& callback) override {
James Robinson646469d2014-10-03 15:33:28 -070069 assert(event);
Scott Violetb5698882015-03-23 14:33:21 -070070 if (event->pointer_data.get())
James Robinson646469d2014-10-03 15:33:28 -070071 gles2_client_->HandleInputEvent(*event);
72 callback.Run();
73 }
74
75 private:
Scott Violetc947ecc2014-10-28 16:49:51 -070076 void SetEventDispatcher() {
James Robinson91b812b2015-01-28 17:13:54 -080077 mojo::NativeViewportEventDispatcherPtr ptr;
78 dispatcher_binding_.Bind(GetProxy(&ptr));
79 viewport_->SetEventDispatcher(ptr.Pass());
Scott Violetc947ecc2014-10-28 16:49:51 -070080 }
81
Viet-Trung Luu641ca6d2015-07-07 15:17:48 -070082 void OnViewportConnectionError() { mojo::RunLoop::current()->Quit(); }
James Robinson91b812b2015-01-28 17:13:54 -080083
James Robinson646469d2014-10-03 15:33:28 -070084 scoped_ptr<GLES2ClientImpl> gles2_client_;
85 mojo::NativeViewportPtr viewport_;
James Robinson187e1fa2015-03-04 15:49:53 -080086 mojo::ContextProviderPtr onscreen_context_provider_;
James Robinson91b812b2015-01-28 17:13:54 -080087 mojo::Binding<NativeViewportEventDispatcher> dispatcher_binding_;
James Robinson646469d2014-10-03 15:33:28 -070088
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010089 DISALLOW_COPY_AND_ASSIGN(SpinningCubeApp);
James Robinson646469d2014-10-03 15:33:28 -070090};
91
92} // namespace examples
93
Mitch Rudominer963aa772015-04-03 08:22:46 -070094MojoResult MojoMain(MojoHandle application_request) {
Przemyslaw Pietrzkiewicz69171512015-03-02 11:45:56 +010095 mojo::ApplicationRunner runner(new examples::SpinningCubeApp);
Mitch Rudominer963aa772015-04-03 08:22:46 -070096 return runner.Run(application_request);
James Robinson646469d2014-10-03 15:33:28 -070097}