On 01/22/2015 11:59 PM, Tapani Pälli wrote: > Patch creates and initializes pp::Graphics3D context for OpenGL ES 2.0. > > Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> > --- > src/waffle/nacl/nacl_container.cpp | 81 > ++++++++++++++++++++++++++++++++++++++ > src/waffle/nacl/nacl_container.h | 8 ++++ > src/waffle/nacl/nacl_context.c | 6 +++ > 3 files changed, 95 insertions(+) > > diff --git a/src/waffle/nacl/nacl_container.cpp > b/src/waffle/nacl/nacl_container.cpp > index 3e8073c..e352da9 100644 > --- a/src/waffle/nacl/nacl_container.cpp > +++ b/src/waffle/nacl/nacl_container.cpp > @@ -24,12 +24,18 @@ > // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > #include "ppapi/cpp/graphics_3d.h" > +#include "ppapi/cpp/instance.h" > +#include "ppapi/cpp/module.h" > #include "nacl_container.h" > > namespace waffle { > > struct nacl_container { > pp::Graphics3D ctx; > + > + bool (*glInitializePPAPI) (PPB_GetInterface); > + void (*glSetCurrentContextPPAPI) (PP_Resource); > + bool (*glTerminatePPAPI) (void); > }; > > static void > @@ -37,6 +43,10 @@ nacl_container_dtor(waffle::nacl_container *nc) > { > if (!nc) > return; > + > + nc->glSetCurrentContextPPAPI(0); > + nc->glTerminatePPAPI(); > + > delete nc; > } > > @@ -51,6 +61,70 @@ nacl_container_ctor() > return nc; > } > > +static bool > +nacl_context_init(waffle::nacl_container *nc, struct nacl_config *cfg) > +{ > + if (!nc) > + return false;
Is it really possible for nc to be null? Should this be an assertion instead? If nc can be null here, what sequence of calls leads to that state? Excuse my questions. I don't fully understand the NaCl backend yet. > + // There is no way currently to pass a pp::Instance for Waffle, so > + // we fetch a map of all instances and if there's only one we select > + // that one, otherwise we fail. > + const pp::Module::InstanceMap instances = > + pp::Module::Get()->current_instances(); > + > + if (instances.size() != 1) { > + wcore_errorf(WAFFLE_ERROR_FATAL, > + "Could not find a pp::Instance for Waffle to use.\n"); ^^^ Don't add the newline to error messages. The wcore_error functions add the newline for you. > + return false; > + } > + > + pp::Instance *pp_instance = instances.begin()->second; > + nc->ctx = pp::Graphics3D(pp_instance, pp::Graphics3D(), cfg->attribs); > + > + // We need to fetch NaCl specific init, makecurrent and terminate > + // functions that communicate with the browser interface. As nacl_config > + // currently supports only ES2, this is hardcoded for ES2. > + void *glapi = dlopen(NACL_GLES2_LIBRARY, RTLD_LAZY); > + if (!glapi) { > + wcore_errorf(WAFFLE_ERROR_FATAL, "dlopen failed: %s", dlerror()); > + return false; > + } > + > +#define RESOLVE(func) \ > + nc->func = (typeof(nc->func)) dlsym(glapi, (#func)); \ > + if (!nc->func) { \ > + wcore_errorf(WAFFLE_ERROR_FATAL, "failed to resolve %s", #func); \ > + return false; \ > + } > + > + RESOLVE(glInitializePPAPI); > + RESOLVE(glSetCurrentContextPPAPI); > + RESOLVE(glTerminatePPAPI); > + > +#undef RESOLVE > + > + dlclose(glapi); > + > + if (!nc->glInitializePPAPI(pp::Module::Get()->get_browser_interface())) { > + wcore_errorf(WAFFLE_ERROR_FATAL, > + "Unable to initialize GL PPAPI!\n"); > + return false; > + } > + > + if (nc->ctx.is_null()) > + return false; > + > + if (!pp_instance->BindGraphics(nc->ctx)) { > + wcore_errorf(WAFFLE_ERROR_FATAL, "Unable to bind 3D context.\n"); The term "3D context" is a little to vague. Please mention NaCl, Pepper, or something similar in the error message. Maybe call it a "NaCl 3D Context", for example. > + nc->ctx = pp::Graphics3D(); > + nc->glSetCurrentContextPPAPI(0); > + return false; > + } > + > + return true; > +} > + > }; // namespace waffle ends > > extern "C" struct nacl_container* > @@ -64,3 +138,10 @@ nacl_teardown(nacl_container *nc) > { > > waffle::nacl_container_dtor(reinterpret_cast<waffle::nacl_container*>(nc)); > } > + > +extern "C" bool > +nacl_context_init(struct nacl_container *nc, struct nacl_config *cfg) > +{ > + return waffle::nacl_context_init( > + reinterpret_cast<waffle::nacl_container*>(nc), cfg); > +} > diff --git a/src/waffle/nacl/nacl_container.h > b/src/waffle/nacl/nacl_container.h > index 61d935c..81472cc 100644 > --- a/src/waffle/nacl/nacl_container.h > +++ b/src/waffle/nacl/nacl_container.h > @@ -25,13 +25,21 @@ > > #ifdef __cplusplus > > +#include <dlfcn.h> > + > extern "C" { > #endif > > +#include "nacl_config.h" > +#include "wcore_error.h" > + > +#define NACL_GLES2_LIBRARY "libppapi_gles2.so" > + > struct nacl_container; > > struct nacl_container *nacl_init(); > void nacl_teardown(struct nacl_container *nc); > +bool nacl_context_init(struct nacl_container *nc, struct nacl_config *cfg); > > #ifdef __cplusplus > }; > diff --git a/src/waffle/nacl/nacl_context.c b/src/waffle/nacl/nacl_context.c > index 2e68a64..e8adeb0 100644 > --- a/src/waffle/nacl/nacl_context.c > +++ b/src/waffle/nacl/nacl_context.c > @@ -47,12 +47,18 @@ nacl_context_create(struct wcore_platform *wc_plat, > struct wcore_context *wc_share_ctx) > { > struct nacl_context *self; > + struct nacl_config *config = nacl_config(wc_config); > + struct nacl_platform *platform = nacl_platform(wc_plat); > bool ok = true; > > self = wcore_calloc(sizeof(*self)); > if (self == NULL) > return NULL; > > + ok = nacl_context_init(platform->nacl, config); > + if (!ok) > + goto error; > + > ok = wcore_context_init(&self->wcore, wc_config); > if (!ok) > goto error; > The base object, wcore_context, should be initialize before the child object, nacl_context. That's the pattern throughout Waffle, and that's how C++ does it too.
signature.asc
Description: OpenPGP digital signature
_______________________________________________ waffle mailing list waffle@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/waffle