[waffle] [PATCH v2 04/10] nacl: rework nacl_dl functions
Tapani
tapani.palli at intel.com
Wed Apr 8 23:47:47 PDT 2015
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
On 03/25/2015 04:22 PM, Emil Velikov wrote:
> This is a direct copy from cgl with the following tweaks
> - s/cgl/nacl/
> - s/cgl_dl_gl_path/NACL_GLES2_LIBRARY/
> - Add move the nacl_prefix function from nacl_platform.c
>
> Doing this allows us to have more consistent codebase and additional
> error messages for the user. As a bonus it squashes a bug where
> waffle_dl_can_open() was setting an error when it shouldn't have.
>
> v2:
> - s/gl_dl/dl_gl/ nacl_platform.* : the latter is used throughout waffle
> - s/cgl_dl_gl_path/NACL_GLES2_LIBRARY/ - missed a couple of references
> - add missing includes - stdio.h, string.h, nacl_container.h
>
> Cc: Tapani Pälli <tapani.palli at intel.com>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>
> Tapani, this update addresses only the compilation goofups. This way
> people can give it a test if interested. v3 will be comming after the
> input of my follow up questions.
>
> How did you structure the files for your test [1] ? All the requirements
> (SOs, etc.) are next to the nexe,nmf,html and Chromium is running with
> --enable-nacl, yet nothing pops up. Your test runs like a charm though :-)
>
> Thanks
> Emil
>
> [1] http://koti.kapsi.fi/~tpalli/nacl/
>
>
> src/waffle/CMakeLists.txt | 1 +
> src/waffle/nacl/nacl_dl.c | 191 ++++++++++++++++++++++++++++++++++++++++
> src/waffle/nacl/nacl_dl.h | 43 +++++++++
> src/waffle/nacl/nacl_platform.c | 86 ++----------------
> src/waffle/nacl/nacl_platform.h | 2 +-
> 5 files changed, 241 insertions(+), 82 deletions(-)
> create mode 100644 src/waffle/nacl/nacl_dl.c
> create mode 100644 src/waffle/nacl/nacl_dl.h
>
> diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
> index ac9b415..758039c 100644
> --- a/src/waffle/CMakeLists.txt
> +++ b/src/waffle/CMakeLists.txt
> @@ -186,6 +186,7 @@ if(waffle_has_nacl)
> nacl/nacl_config.c
> nacl/nacl_context.c
> nacl/nacl_display.c
> + nacl/nacl_dl.c
> nacl/nacl_platform.c
> nacl/nacl_window.c
> )
> diff --git a/src/waffle/nacl/nacl_dl.c b/src/waffle/nacl/nacl_dl.c
> new file mode 100644
> index 0000000..7337122
> --- /dev/null
> +++ b/src/waffle/nacl/nacl_dl.c
> @@ -0,0 +1,191 @@
> +// Copyright 2012-2015 Intel Corporation
> +//
> +// All rights reserved.
> +//
> +// Redistribution and use in source and binary forms, with or without
> +// modification, are permitted provided that the following conditions are met:
> +//
> +// - Redistributions of source code must retain the above copyright notice, this
> +// list of conditions and the following disclaimer.
> +//
> +// - Redistributions in binary form must reproduce the above copyright notice,
> +// this list of conditions and the following disclaimer in the documentation
> +// and/or other materials provided with the distribution.
> +//
> +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +#include <assert.h>
> +#include <dlfcn.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +#include "wcore_error.h"
> +
> +#include "nacl_container.h"
> +#include "nacl_dl.h"
> +#include "nacl_platform.h"
> +
> +
> +static bool
> +nacl_dl_check_enum(int32_t waffle_dl)
> +{
> + switch (waffle_dl) {
> + case WAFFLE_DL_OPENGL:
> + wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
> + "NACL does not support OpenGL");
> + return false;
> + case WAFFLE_DL_OPENGL_ES1:
> + wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
> + "NACL does not support OpenGL ES1");
> + return false;
> + case WAFFLE_DL_OPENGL_ES2:
> + return true;
> + case WAFFLE_DL_OPENGL_ES3:
> + wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
> + "NACL does not support OpenGL ES3");
> + return false;
> + default:
> + assert(false);
> + return false;
> + }
> +}
> +
> +static bool
> +nacl_dl_open(struct nacl_platform *plat)
> +{
> + plat->dl_gl = dlopen(NACL_GLES2_LIBRARY, RTLD_LAZY);
> +
> + if (!plat->dl_gl) {
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> + "dlopen(\"%s\") failed", NACL_GLES2_LIBRARY);
> + return false;
> + }
> +
> + return true;
> +}
> +
> +bool
> +nacl_dl_can_open(struct wcore_platform *wc_plat,
> + int32_t waffle_dl)
> +{
> + struct nacl_platform *plat = nacl_platform(wc_plat);
> + bool ok;
> +
> + WCORE_ERROR_DISABLED({
> + ok = nacl_dl_check_enum(waffle_dl);
> + });
> +
> + if (!ok)
> + return false;
> +
> + if (plat->dl_gl != NULL)
> + return true;
> +
> + WCORE_ERROR_DISABLED({
> + nacl_dl_open(plat);
> + });
> +
> + return plat->dl_gl != NULL;
> +}
> +
> +// Construct a string that maps GL function to NaCl function
> +// by concating given prefix and function name tail from 'src'.
> +static char *
> +nacl_dl_prefix(const char *src, const char *prefix)
> +{
> + if (strncmp(src, "gl", 2) != 0)
> + return NULL;
> +
> + uint32_t len = strlen(src) + strlen(prefix);
> +
> + char *dst = wcore_calloc(len);
> + if (!dst)
> + return NULL;
> +
> + snprintf(dst, len, "%s%s", prefix, src + 2);
> +
> + return dst;
> +}
> +
> +void*
> +nacl_dl_sym(struct wcore_platform *wc_plat,
> + int32_t waffle_dl,
> + const char *name)
> +{
> + struct nacl_platform *plat = nacl_platform(wc_plat);
> +
> + if (!nacl_dl_check_enum(waffle_dl))
> + return NULL;
> +
> + if (plat->dl_gl == NULL)
> + nacl_dl_open(plat);
> +
> + if (plat->dl_gl == NULL)
> + return NULL;
> +
> + char *nacl_name = nacl_dl_prefix(name, "GLES2");
> + if (!nacl_name)
> + return NULL;
> +
> + // Clear any previous error.
> + dlerror();
> +
> + void *sym = dlsym(plat->dl_gl, name);
> +
> + if (sym) {
> + free(nacl_name);
> + return sym;
> + }
> +
> + // dlsym returned NULL. Check if an error occured.
> + const char *error = dlerror();
> + if (error) {
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> + "dlsym(libname=\"%s\", symbol=\"%s\") failed: %s",
> + NACL_GLES2_LIBRARY, nacl_name, error);
> + }
> + free(nacl_name);
> +
> + return NULL;
> +}
> +
> +bool
> +nacl_dl_close(struct wcore_platform *wc_plat)
> +{
> + struct nacl_platform *plat = nacl_platform(wc_plat);
> +
> + int error_code = 0;
> + const char *error_msg = NULL;
> +
> + if (!plat->dl_gl)
> + return true;
> +
> + error_code = dlclose(plat->dl_gl);
> +
> + if (!error_code)
> + return true;
> +
> + error_msg = dlerror();
> +
> + if (error_msg) {
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> + "dlclose(libname=\"%s\") failed: %s",
> + NACL_GLES2_LIBRARY, error_msg);
> + }
> + else {
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> + "dlclose(libname=\"%s\") failed",
> + NACL_GLES2_LIBRARY);
> + }
> +
> + return false;
> +}
> diff --git a/src/waffle/nacl/nacl_dl.h b/src/waffle/nacl/nacl_dl.h
> new file mode 100644
> index 0000000..e7748f3
> --- /dev/null
> +++ b/src/waffle/nacl/nacl_dl.h
> @@ -0,0 +1,43 @@
> +// Copyright 2012-2015 Intel Corporation
> +//
> +// All rights reserved.
> +//
> +// Redistribution and use in source and binary forms, with or without
> +// modification, are permitted provided that the following conditions are met:
> +//
> +// - Redistributions of source code must retain the above copyright notice, this
> +// list of conditions and the following disclaimer.
> +//
> +// - Redistributions in binary form must reproduce the above copyright notice,
> +// this list of conditions and the following disclaimer in the documentation
> +// and/or other materials provided with the distribution.
> +//
> +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +#pragma once
> +
> +#include <stdbool.h>
> +#include <stdint.h>
> +
> +struct wcore_platform;
> +
> +bool
> +nacl_dl_can_open(struct wcore_platform *wc_plat,
> + int32_t waffle_dl);
> +
> +void*
> +nacl_dl_sym(struct wcore_platform *wc_plat,
> + int32_t waffle_dl,
> + const char *name);
> +
> +bool
> +nacl_dl_close(struct wcore_platform *wc_plat);
> diff --git a/src/waffle/nacl/nacl_platform.c b/src/waffle/nacl/nacl_platform.c
> index 22169da..abaf729 100644
> --- a/src/waffle/nacl/nacl_platform.c
> +++ b/src/waffle/nacl/nacl_platform.c
> @@ -26,6 +26,7 @@
> #include <dlfcn.h>
> #include <stdio.h>
>
> +#include "nacl_dl.h"
> #include "nacl_platform.h"
>
> static const struct wcore_platform_vtbl nacl_platform_vtbl;
> @@ -43,91 +44,14 @@ nacl_platform_destroy(struct wcore_platform *wc_self)
>
> nacl_teardown(self->nacl);
>
> - if (self->gl_dl)
> - if (dlclose(self->gl_dl) != 0)
> - wcore_errorf(WAFFLE_ERROR_UNKNOWN, "dlclose failed: %s",
> - dlerror());
> + if (self->dl_gl)
> + ok &= nacl_dl_close(&self->wcore);
>
> free(self);
> return ok;
> }
>
> static bool
> -nacl_platform_dl_can_open(struct wcore_platform *wc_self,
> - int32_t waffle_dl)
> -{
> - struct nacl_platform *self = nacl_platform(wc_self);
> -
> - switch (waffle_dl) {
> - case WAFFLE_DL_OPENGL_ES2:
> - if (!self->gl_dl)
> - self->gl_dl = dlopen(NACL_GLES2_LIBRARY, RTLD_LAZY);
> - break;
> - // API not supported
> - default:
> - return false;
> - }
> -
> - if (!self->gl_dl)
> - wcore_errorf(WAFFLE_ERROR_UNKNOWN, "dlopen failed: %s", dlerror());
> -
> - return self->gl_dl ? true : false;
> -}
> -
> -// Construct a string that maps GL function to NaCl function
> -// by concating given prefix and function name tail from 'src'.
> -static char *
> -nacl_prefix(const char *src, const char *prefix)
> -{
> - if (strncmp(src, "gl", 2) != 0)
> - return NULL;
> -
> - uint32_t len = strlen(src) + strlen(prefix);
> -
> - char *dst = wcore_calloc(len);
> - if (!dst)
> - return NULL;
> -
> - snprintf(dst, len, "%s%s", prefix, src + 2);
> -
> - return dst;
> -}
> -
> -static void*
> -nacl_platform_dl_sym(struct wcore_platform *wc_self,
> - int32_t waffle_dl,
> - const char *name)
> -{
> - struct nacl_platform *self = nacl_platform(wc_self);
> - char *nacl_name = NULL;
> - void *func = NULL;
> -
> - if (!self->gl_dl)
> - if (!nacl_platform_dl_can_open(wc_self, waffle_dl))
> - return false;
> -
> - nacl_name = nacl_prefix(name, "GLES2");
> -
> - if (!nacl_name)
> - return NULL;
> -
> - func = dlsym(self->gl_dl, nacl_name);
> -
> - if (!func) {
> - const char *error = dlerror();
> - if (error) {
> - wcore_errorf(WAFFLE_ERROR_UNKNOWN,
> - "dlsym(libname=\"%s\", symbol=\"%s\") failed: %s",
> - NACL_GLES2_LIBRARY, nacl_name, error);
> - }
> - }
> -
> - free(nacl_name);
> -
> - return func;
> -}
> -
> -static bool
> nacl_platform_make_current(struct wcore_platform *wc_self,
> struct wcore_display *wc_dpy,
> struct wcore_window *wc_window,
> @@ -168,8 +92,8 @@ static const struct wcore_platform_vtbl nacl_platform_vtbl = {
> .destroy = nacl_platform_destroy,
>
> .make_current = nacl_platform_make_current,
> - .dl_can_open = nacl_platform_dl_can_open,
> - .dl_sym = nacl_platform_dl_sym,
> + .dl_can_open = nacl_dl_can_open,
> + .dl_sym = nacl_dl_sym,
>
> .display = {
> .connect = nacl_display_connect,
> diff --git a/src/waffle/nacl/nacl_platform.h b/src/waffle/nacl/nacl_platform.h
> index fa2d364..1a54697 100644
> --- a/src/waffle/nacl/nacl_platform.h
> +++ b/src/waffle/nacl/nacl_platform.h
> @@ -38,7 +38,7 @@
> struct nacl_platform {
> struct wcore_platform wcore;
> struct nacl_container *nacl;
> - void *gl_dl;
> + void *dl_gl;
> };
>
> DEFINE_CONTAINER_CAST_FUNC(nacl_platform,
More information about the waffle
mailing list