instance object takes care of everything for us.legacy
@@ -71,9 +71,9 @@ d3d9_sources = \ | |||||
if USE_NACL | if USE_NACL | ||||
nacl_sources = \ | nacl_sources = \ | ||||
platform/nacl/naclapp.cpp platform/nacl/naclapp.h \ | |||||
platform/nacl/nacl_instance.cpp platform/nacl/nacl_instance.h \ | |||||
platform/nacl/nacl_module.cpp \ | |||||
platform/nacl/nacl-app.cpp platform/nacl/nacl-app.h \ | |||||
platform/nacl/nacl-instance.cpp platform/nacl/nacl-instance.h \ | |||||
platform/nacl/nacl-module.cpp \ | |||||
platform/nacl/opengl_context.cpp platform/nacl/opengl_context.h \ | platform/nacl/opengl_context.cpp platform/nacl/opengl_context.h \ | ||||
platform/nacl/opengl_context_ptrs.h | platform/nacl/opengl_context_ptrs.h | ||||
endif | endif | ||||
@@ -20,7 +20,7 @@ | |||||
#elif defined _XBOX | #elif defined _XBOX | ||||
# include "platform/xbox/xboxapp.h" | # include "platform/xbox/xboxapp.h" | ||||
#elif defined __native_client__ | #elif defined __native_client__ | ||||
# include "platform/nacl/naclapp.h" | |||||
# include "platform/nacl/nacl-app.h" | |||||
#elif defined __ANDROID__ | #elif defined __ANDROID__ | ||||
# include "platform/android/androidapp.h" | # include "platform/android/androidapp.h" | ||||
#elif defined HAVE_GLES_2X | #elif defined HAVE_GLES_2X | ||||
@@ -12,15 +12,10 @@ | |||||
# include "config.h" | # include "config.h" | ||||
#endif | #endif | ||||
#if defined __native_client__ | |||||
# include <ppapi/cpp/instance.h> | |||||
# include <ppapi/cpp/module.h> | |||||
# include <ppapi/cpp/var.h> | |||||
#endif | |||||
#include "core.h" | #include "core.h" | ||||
#include "lolgl.h" | |||||
#include "naclapp.h" | |||||
#include "nacl-app.h" | |||||
#include "nacl-instance.h" | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -45,6 +40,7 @@ private: | |||||
NaClApp::NaClApp(char const *title, ivec2 res, float fps) : | NaClApp::NaClApp(char const *title, ivec2 res, float fps) : | ||||
data(new NaClAppData()) | data(new NaClAppData()) | ||||
{ | { | ||||
Ticker::Setup(fps); | |||||
#if defined __native_client__ | #if defined __native_client__ | ||||
#endif | #endif | ||||
} | } | ||||
@@ -56,14 +52,13 @@ void NaClApp::ShowPointer(bool show) | |||||
void NaClApp::Run() | void NaClApp::Run() | ||||
{ | { | ||||
while (!Ticker::Finished()) | |||||
{ | |||||
/* Tick the renderer, show the frame and clamp to desired framerate. */ | |||||
Ticker::TickDraw(); | |||||
#if defined __native_client__ | #if defined __native_client__ | ||||
NaClInstance::MainSignal(); | |||||
#endif | #endif | ||||
} | |||||
/* Wait forever */ | |||||
Queue<int, 1> q; | |||||
q.Pop(); | |||||
} | } | ||||
NaClApp::~NaClApp() | NaClApp::~NaClApp() |
@@ -10,7 +10,6 @@ | |||||
#include <cstdio> | #include <cstdio> | ||||
#include <cstring> | #include <cstring> | ||||
#include <string> | #include <string> | ||||
#include <vector> | |||||
#include <ppapi/cpp/rect.h> | #include <ppapi/cpp/rect.h> | ||||
#include <ppapi/cpp/size.h> | #include <ppapi/cpp/size.h> | ||||
@@ -20,9 +19,8 @@ | |||||
#include <ppapi/cpp/input_event.h> | #include <ppapi/cpp/input_event.h> | ||||
#include "core.h" | #include "core.h" | ||||
#include "debug/quad.h" | |||||
#include "platform/nacl/nacl_instance.h" | |||||
#include "platform/nacl/nacl-instance.h" | |||||
#include "platform/nacl/opengl_context.h" | #include "platform/nacl/opengl_context.h" | ||||
/* One of these wrappers will be overridden by the user's version */ | /* One of these wrappers will be overridden by the user's version */ | ||||
@@ -46,7 +44,7 @@ NaClInstance::NaClInstance(PP_Instance instance) | |||||
NaClInstance::~NaClInstance() | NaClInstance::~NaClInstance() | ||||
{ | { | ||||
// Destroy the cube view while GL context is current. | // Destroy the cube view while GL context is current. | ||||
opengl_context_->MakeContextCurrent(this); | |||||
m_opengl_ctx->MakeContextCurrent(this); | |||||
} | } | ||||
static double const DELTA_MS = 1000.0 / 60.0; | static double const DELTA_MS = 1000.0 / 60.0; | ||||
@@ -84,17 +82,23 @@ void NaClInstance::TickCallback(void* data, int32_t result) | |||||
} | } | ||||
} | } | ||||
Mutex NaClInstance::main_mutex; | |||||
Queue<NaClInstance::Args *, 1> NaClInstance::main_queue; | |||||
bool NaClInstance::Init(uint32_t argc, | bool NaClInstance::Init(uint32_t argc, | ||||
const char* /* argn */[], | const char* /* argn */[], | ||||
const char* argv[]) | const char* argv[]) | ||||
{ | { | ||||
Ticker::Setup(60.0f); | |||||
/* Call the user's main() function. FIXME: run it in a thread */ | |||||
/* Ensure only one NaClInstance does Init() at the same time. */ | |||||
main_mutex.Lock(); | |||||
char *env[] = { NULL }; | char *env[] = { NULL }; | ||||
lol_nacl_main(); | |||||
lol_nacl_main(argc, const_cast<char **>(argv)); | |||||
lol_nacl_main(argc, const_cast<char **>(argv), (char **)env); | |||||
Args arglist(argc, const_cast<char **>(argv), const_cast<char **>(env)); | |||||
main_queue.Push(&arglist); | |||||
m_main_thread = new Thread(MainRun, NULL); | |||||
/* Push so that only MainSignal() can unblock us */ | |||||
main_queue.Push(NULL); | |||||
main_queue.Push(NULL); | |||||
main_mutex.Unlock(); | |||||
// My timer callback | // My timer callback | ||||
pp::Module::Get()->core()->CallOnMainThread( | pp::Module::Get()->core()->CallOnMainThread( | ||||
@@ -107,11 +111,23 @@ bool NaClInstance::Init(uint32_t argc, | |||||
return true; | return true; | ||||
} | } | ||||
void NaClInstance::RunMain(uint32_t argc, | |||||
const char* /* argn */[], | |||||
const char* argv[]) | |||||
void * NaClInstance::MainRun(void *data) | |||||
{ | { | ||||
Args *arglist = main_queue.Pop(); | |||||
/* Call the user's main() function. One of these will work. */ | |||||
lol_nacl_main(); | |||||
lol_nacl_main(arglist->m_argc, arglist->m_argv); | |||||
lol_nacl_main(arglist->m_argc, arglist->m_argv, arglist->m_env); | |||||
return NULL; | |||||
} | |||||
void NaClInstance::MainSignal() | |||||
{ | |||||
/* FIXME: find something more elegant. */ | |||||
main_queue.Pop(); | |||||
main_queue.Pop(); | |||||
} | } | ||||
void NaClInstance::HandleMessage(const pp::Var& message) | void NaClInstance::HandleMessage(const pp::Var& message) | ||||
@@ -129,11 +145,11 @@ void NaClInstance::DidChangeView(const pp::Rect& position, const pp::Rect& clip) | |||||
m_size = ivec2(position.size().width(), position.size().height()); | m_size = ivec2(position.size().width(), position.size().height()); | ||||
if (opengl_context_ == NULL) | |||||
opengl_context_.reset(new OpenGLContext(this)); | |||||
opengl_context_->InvalidateContext(this); | |||||
opengl_context_->ResizeContext(position.size()); | |||||
if (!opengl_context_->MakeContextCurrent(this)) | |||||
if (m_opengl_ctx == NULL) | |||||
m_opengl_ctx.reset(new OpenGLContext(this)); | |||||
m_opengl_ctx->InvalidateContext(this); | |||||
m_opengl_ctx->ResizeContext(position.size()); | |||||
if (!m_opengl_ctx->MakeContextCurrent(this)) | |||||
return; | return; | ||||
Video::Setup(m_size); | Video::Setup(m_size); | ||||
@@ -151,7 +167,7 @@ bool NaClInstance::HandleInputEvent(const pp::InputEvent& event) | |||||
Input::UnsetMouseButton(pp::MouseInputEvent(event).GetButton()); | Input::UnsetMouseButton(pp::MouseInputEvent(event).GetButton()); | ||||
break; | break; | ||||
case PP_INPUTEVENT_TYPE_MOUSEMOVE: | case PP_INPUTEVENT_TYPE_MOUSEMOVE: | ||||
Input::SetMousePos(ivec2(pp::MouseInputEvent(event).GetPosition().x(), opengl_context_->GetSize().height() - 1 - pp::MouseInputEvent(event).GetPosition().y())); | |||||
Input::SetMousePos(ivec2(pp::MouseInputEvent(event).GetPosition().x(), m_opengl_ctx->GetSize().height() - 1 - pp::MouseInputEvent(event).GetPosition().y())); | |||||
break; | break; | ||||
default: | default: | ||||
break; | break; | ||||
@@ -161,12 +177,12 @@ bool NaClInstance::HandleInputEvent(const pp::InputEvent& event) | |||||
void NaClInstance::DrawSelf() | void NaClInstance::DrawSelf() | ||||
{ | { | ||||
if (opengl_context_ == NULL) | |||||
if (m_opengl_ctx == NULL) | |||||
return; | return; | ||||
opengl_context_->MakeContextCurrent(this); | |||||
m_opengl_ctx->MakeContextCurrent(this); | |||||
Ticker::TickDraw(); | Ticker::TickDraw(); | ||||
opengl_context_->FlushContext(); | |||||
m_opengl_ctx->FlushContext(); | |||||
} | } | ||||
} // namespace lol | } // namespace lol |
@@ -0,0 +1,78 @@ | |||||
// Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||||
// Use of this source code is governed by a BSD-style license that can be | |||||
// found in the LICENSE file. | |||||
#ifndef EXAMPLES_TUMBLER_TUMBLER_H_ | |||||
#define EXAMPLES_TUMBLER_TUMBLER_H_ | |||||
#include <ppapi/cpp/instance.h> | |||||
#include <ppapi/c/ppb_gamepad.h> | |||||
#include "platform/nacl/opengl_context.h" | |||||
#include "platform/nacl/opengl_context_ptrs.h" | |||||
#include "input/input.h" | |||||
namespace lol { | |||||
class NaClInstance : public pp::Instance | |||||
{ | |||||
public: | |||||
explicit NaClInstance(PP_Instance instance); | |||||
// The dtor makes the 3D context current before deleting the cube view, then | |||||
// destroys the 3D context both in the module and in the browser. | |||||
virtual ~NaClInstance(); | |||||
// Called by the browser when the NaCl module is loaded and all ready to go. | |||||
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]); | |||||
// Called whenever the in-browser window changes size. | |||||
virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip); | |||||
// Called by the browser to handle the postMessage() call in Javascript. | |||||
virtual void HandleMessage(const pp::Var& message); | |||||
// Bind and publish the module's methods to JavaScript. | |||||
//void InitializeMethods(ScriptingBridge* bridge); | |||||
// Called to draw the contents of the module's browser area. | |||||
virtual bool HandleInputEvent(const pp::InputEvent& event); | |||||
void DrawSelf(); | |||||
/* Communication with the application object */ | |||||
static void MainSignal(); | |||||
private: | |||||
SharedOpenGLContext m_opengl_ctx; | |||||
ivec2 m_size; | |||||
static void TickCallback(void* data, int32_t result); | |||||
static void * MainRun(void *data); | |||||
/* Gamepad support */ | |||||
PPB_Gamepad const *m_pad_interface; | |||||
Array<Stick *> m_sticks; | |||||
/* Communication with the application object */ | |||||
struct Args | |||||
{ | |||||
Args(int argc, char **argv, char **env) | |||||
: m_argc(argc), m_argv(argv), m_env(env) {} | |||||
Args() {} | |||||
int m_argc; | |||||
char **m_argv; | |||||
char **m_env; | |||||
}; | |||||
static Mutex main_mutex; | |||||
static Queue<Args *, 1> main_queue; | |||||
Thread *m_main_thread; | |||||
}; | |||||
} // namespace lol | |||||
#endif // EXAMPLES_TUMBLER_TUMBLER_H_ |
@@ -11,9 +11,9 @@ | |||||
#include <ppapi/gles2/gl2ext_ppapi.h> | #include <ppapi/gles2/gl2ext_ppapi.h> | ||||
#include "core.h" | #include "core.h" | ||||
#include "lolgl.h" | |||||
#include "lolgl.h" /* needed for GL_TRUE */ | |||||
#include "platform/nacl/nacl_instance.h" | |||||
#include "platform/nacl/nacl-instance.h" | |||||
/// The Module class. The browser calls the CreateInstance() method to create | /// The Module class. The browser calls the CreateInstance() method to create | ||||
/// an instance of your NaCl module on the web page. The browser creates a new | /// an instance of your NaCl module on the web page. The browser creates a new |
@@ -1,63 +0,0 @@ | |||||
// Copyright (c) 2011 The Native Client Authors. All rights reserved. | |||||
// Use of this source code is governed by a BSD-style license that can be | |||||
// found in the LICENSE file. | |||||
#ifndef EXAMPLES_TUMBLER_TUMBLER_H_ | |||||
#define EXAMPLES_TUMBLER_TUMBLER_H_ | |||||
#include <ppapi/cpp/instance.h> | |||||
#include <ppapi/c/ppb_gamepad.h> | |||||
#include "platform/nacl/opengl_context.h" | |||||
#include "platform/nacl/opengl_context_ptrs.h" | |||||
#include "input/input.h" | |||||
namespace lol { | |||||
class NaClInstance : public pp::Instance { | |||||
public: | |||||
explicit NaClInstance(PP_Instance instance); | |||||
// The dtor makes the 3D context current before deleting the cube view, then | |||||
// destroys the 3D context both in the module and in the browser. | |||||
virtual ~NaClInstance(); | |||||
// Called by the browser when the NaCl module is loaded and all ready to go. | |||||
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]); | |||||
// Called whenever the in-browser window changes size. | |||||
virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip); | |||||
// Called by the browser to handle the postMessage() call in Javascript. | |||||
virtual void HandleMessage(const pp::Var& message); | |||||
// Bind and publish the module's methods to JavaScript. | |||||
//void InitializeMethods(ScriptingBridge* bridge); | |||||
// Called to draw the contents of the module's browser area. | |||||
virtual bool HandleInputEvent(const pp::InputEvent& event); | |||||
void DrawSelf(); | |||||
SharedOpenGLContext opengl_context_; | |||||
ivec2 m_size; | |||||
private: | |||||
static void TickCallback(void* data, int32_t result); | |||||
static void CallIntMainWrappers(int argc, char const* argn[]); | |||||
static void CallVoidMainWrappers(int argc, char const* argn[]); | |||||
static void RunMain(uint32_t argc, const char* argn[], const char* argv[]); | |||||
/* Gamepad support */ | |||||
PPB_Gamepad const *m_pad_interface; | |||||
Array<Stick *> m_sticks; | |||||
}; | |||||
} // namespace lol | |||||
#endif // EXAMPLES_TUMBLER_TUMBLER_H_ |
@@ -69,7 +69,7 @@ class OpenGLContext : public pp::Graphics3DClient { | |||||
} | } | ||||
/// The PP_Resource needed to make GLES2 calls through the Pepper interface. | /// The PP_Resource needed to make GLES2 calls through the Pepper interface. | ||||
const PP_Resource gl_context() const { | |||||
PP_Resource gl_context() const { | |||||
return context_.pp_resource(); | return context_.pp_resource(); | ||||
} | } | ||||