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