11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/service/mailbox_manager.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/application/application_runner_chromium.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/c/system/main.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/application/application_connection.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/application/application_delegate.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/application/interface_factory_impl.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/native_viewport/gpu_impl.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/native_viewport/native_viewport_impl.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gl/gl_share_group.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gl/gl_surface.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace mojo { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass NativeViewportAppDelegate 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public ApplicationDelegate, 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public InterfaceFactory<NativeViewport>, 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public InterfaceFactory<Gpu>, 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public InterfaceFactory<NativeViewportConfig> { 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NativeViewportAppDelegate() 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : share_group_(new gfx::GLShareGroup), 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mailbox_manager_(new gpu::gles2::MailboxManager), 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_test_(false), 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_headless_(false), 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_initialized_(false) {} 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~NativeViewportAppDelegate() {} 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class NativeViewportConfigImpl : public InterfaceImpl<NativeViewportConfig> { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NativeViewportConfigImpl(NativeViewportAppDelegate* app_delegate) 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : app_delegate_(app_delegate) {} 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void UseTestConfig( 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Callback<void()>& callback) OVERRIDE { 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci app_delegate_->is_test_ = true; 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void UseHeadlessConfig( 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Callback<void()>& callback) OVERRIDE { 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci app_delegate_->is_headless_ = true; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NativeViewportAppDelegate* app_delegate_; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ApplicationDelegate implementation. 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Initialize(ApplicationImpl* application) OVERRIDE { 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci app_ = application; 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool ConfigureIncomingConnection( 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mojo::ApplicationConnection* connection) OVERRIDE { 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection->AddService<NativeViewport>(this); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection->AddService<Gpu>(this); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection->AddService<NativeViewportConfig>(this); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // InterfaceFactory<NativeViewport> implementation. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Create(ApplicationConnection* connection, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<NativeViewport> request) OVERRIDE { 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(COMPONENT_BUILD) 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!is_initialized_) { 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (is_test_) 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::GLSurface::InitializeOneOffForTests(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::GLSurface::InitializeOneOff(); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_initialized_ = true; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BindToRequest(new NativeViewportImpl(app_, is_headless_), &request); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // InterfaceFactory<Gpu> implementation. 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Create(ApplicationConnection* connection, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<Gpu> request) OVERRIDE { 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BindToRequest(new GpuImpl(share_group_.get(), mailbox_manager_.get()), 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &request); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // InterfaceFactory<NVTestConfig> implementation. 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Create(ApplicationConnection* connection, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<NativeViewportConfig> request) OVERRIDE { 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BindToRequest(new NativeViewportConfigImpl(this), &request); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ApplicationImpl* app_; 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<gfx::GLShareGroup> share_group_; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_test_; 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_headless_; 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_initialized_; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(NativeViewportAppDelegate); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMojoResult MojoMain(MojoHandle shell_handle) { 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mojo::ApplicationRunnerChromium runner(new mojo::NativeViewportAppDelegate); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci runner.set_message_loop_type(base::MessageLoop::TYPE_UI); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return runner.Run(shell_handle); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 111