[waffle] [PATCH 3/7] nacl: add implementation for waffle_context_create
Chad Versace
chad.versace at intel.com
Mon Feb 2 15:16:23 PST 2015
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.palli at 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 884 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/waffle/attachments/20150202/0eae39e8/attachment.sig>
More information about the waffle
mailing list