Native Client | |
================================================================================ | |
Requirements: | |
* Native Client SDK (https://developer.chrome.com/native-client), | |
(tested with Pepper version 33 or higher). | |
The SDL backend for Chrome's Native Client has been tested only with the PNaCl | |
toolchain, which generates binaries designed to run on ARM and x86_32/64 | |
platforms. This does not mean it won't work with the other toolchains! | |
================================================================================ | |
Building SDL for NaCl | |
================================================================================ | |
Set up the right environment variables (see naclbuild.sh), then configure SDL with: | |
configure --host=pnacl --prefix some/install/destination | |
Then "make". | |
As an example of how to create a deployable app a Makefile project is provided | |
in test/nacl/Makefile, which includes some monkey patching of the common.mk file | |
provided by NaCl, without which linking properly to SDL won't work (the search | |
path can't be modified externally, so the linker won't find SDL's binaries unless | |
you dump them into the SDK path, which is inconvenient). | |
Also provided in test/nacl is the required support file, such as index.html, | |
manifest.json, etc. | |
SDL apps for NaCl run on a worker thread using the ppapi_simple infrastructure. | |
This allows for blocking calls on all the relevant systems (OpenGL ES, filesystem), | |
hiding the asynchronous nature of the browser behind the scenes...which is not the | |
same as making it disappear! | |
================================================================================ | |
Running tests | |
================================================================================ | |
Due to the nature of NaCl programs, building and running SDL tests is not as | |
straightforward as one would hope. The script naclbuild.sh in build-scripts | |
automates the process and should serve as a guide for users of SDL trying to build | |
their own applications. | |
Basic usage: | |
./naclbuild.sh path/to/pepper/toolchain (i.e. ~/naclsdk/pepper_35) | |
This will build testgles2.c by default. | |
If you want to build a different test, for example testrendercopyex.c: | |
SOURCES=~/sdl/SDL/test/testrendercopyex.c ./naclbuild.sh ~/naclsdk/pepper_35 | |
Once the build finishes, you have to serve the contents with a web server (the | |
script will give you instructions on how to do that with Python). | |
================================================================================ | |
RWops and nacl_io | |
================================================================================ | |
SDL_RWops work transparently with nacl_io. Two functions control the mount points: | |
int mount(const char* source, const char* target, | |
const char* filesystemtype, | |
unsigned long mountflags, const void *data); | |
int umount(const char *target); | |
For convenience, SDL will by default mount an httpfs tree at / before calling | |
the app's main function. Such setting can be overridden by calling: | |
umount("/"); | |
And then mounting a different filesystem at / | |
It's important to consider that the asynchronous nature of file operations on a | |
browser is hidden from the application, effectively providing the developer with | |
a set of blocking file operations just like you get in a regular desktop | |
environment, which eases the job of porting to Native Client, but also introduces | |
a set of challenges of its own, in particular when big file sizes and slow | |
connections are involved. | |
For more information on how nacl_io and mount points work, see: | |
https://developer.chrome.com/native-client/devguide/coding/nacl_io | |
https://src.chromium.org/chrome/trunk/src/native_client_sdk/src/libraries/nacl_io/nacl_io.h | |
To be able to save into the directory "/save/" (like backup of game) : | |
mount("", "/save", "html5fs", 0, "type=PERSISTENT"); | |
And add to manifest.json : | |
"permissions": [ | |
"unlimitedStorage" | |
] | |
================================================================================ | |
TODO - Known Issues | |
================================================================================ | |
* Testing of all systems with a real application (something other than SDL's tests) | |
* Key events don't seem to work properly | |