[waffle] nacl backend

Tapani Pälli tapani.palli at intel.com
Tue Dec 9 04:15:17 PST 2014


Hi;

I'm currently working on a NaCl backend for Waffle, I wanted to ask for 
opinions or comments on my current approach. First of all I'm using some 
c++ in the nacl backend code but AFAIK everything of this can be 
converted to c if c++ is absolutely not wanted.

The work can be divided in to 2 main objectives. First is building 
waffle itself with nacl toolchain and second is to provide a NaCl 
backend so that we can render in to browser.


1. Building


User needs to provide path to nacl_sdk and nacl_version (for example 
pepper_38). Maybe will need further additions like the target 
architecture selection (which is currently just hardcoded). For 
toolchain I've selected 'glibc' as waffle requires dlopen() and c99 
support which were not possible when using 'pnacl-clang'. Almost 
everything builds fine, only failures happen for examples and unit-tests 
for different reasons (for example fork() or usleep() are not supported 
+ some other symbols caused problems). I've just disabled these for now 
in cmakefiles when nacl is selected and made my own gl_basic_nacl 
example which copies the gl_basic test behavior. I'm slowly migrating it 
to be just like gl_basic but with some minimal changes.

(Known issue: currently waffle nacl links against 'libppapi_gles2.so' 
but this is only because currently glInitializePPAPI() and 
glSetCurrentContextPPAPI() happen before context creation, I'll be 
fixing this soon)


2. Backend

Waffle using application is responsible for creating a pp::Instance, 
either by creating a class or via "PPAPI_SIMPLE_REGISTER_MAIN(main)" 
type of wrapper where it gets created behind the scenes. Currently there 
is no interface to pass this instance to waffle so the backend seeks it 
out by inspecting a pp::Module::InstanceMap that lists all current 
instances. In the typical case of running waffle app there is only one 
(?) and that is selected. Then Waffle creates a pp::Graphics3D context. 
When app queries gl functions via waffle_dl_sym, nacl backend dlopens 
'libppapi_gles2.so' and searches for GL functions, function names are 
automatically prefixed by the backend because nacl GLES2 library naming 
scheme is prefixed with 'GLES2', for example 'glClear' is 'GLES2Clear'. 
Swapbuffers is somewhat complicated as it is asynchronous and app might 
go and queue another swap before first one finished. When I have a solid 
solution for this I'm planning to post a set of 'WIP patches', maybe 
just the build system changes at first.

Any comments appreciated;

If you feel like testing this, I've pushed a snapshot here:
http://cgit.freedesktop.org/~tpalli/waffle/log/?h=snapshot


Thanks;

// Tapani


More information about the waffle mailing list