[waffle] [PATCH 04/10] nacl: rework nacl_dl functions
Tapani
tapani.palli at intel.com
Wed Mar 25 03:36:58 PDT 2015
On 03/25/2015 08:10 AM, Tapani wrote:
> 2 small things below ..
>
Found some more, there is no dl_gl in nacl_platform struct, it is gl_dl,
also no ‘nacl_dl_gl_path’ so this won't compile. Also <stdio.h> include
needs to be added for snprintf usage.
> On 03/24/2015 05:56 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.
>>
>> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
>> ---
>> src/waffle/CMakeLists.txt | 1 +
>> src/waffle/nacl/nacl_dl.c | 188
>> ++++++++++++++++++++++++++++++++++++++++
>> src/waffle/nacl/nacl_dl.h | 43 +++++++++
>> src/waffle/nacl/nacl_platform.c | 84 +-----------------
>> 4 files changed, 236 insertions(+), 80 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..63e3aaf
>> --- /dev/null
>> +++ b/src/waffle/nacl/nacl_dl.c
>> @@ -0,0 +1,188 @@
>> +// 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 "wcore_error.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");
>
> I don't see much value in in these messages, we only have 1 api that
> returns true. If really wanted then just have default that prints the
> error using wcore_enum_to_string() for the waffle_dl.
>
>> + 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);
>
> Would be cool to have the dlerror() message here.
>
>> + 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_dl_gl_path, error_msg);
>> + }
>> + else {
>> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
>> + "dlclose(libname=\"%s\") failed",
>> + nacl_dl_gl_path);
>> + }
>> +
>> + 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..ffc8e09 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;
>> @@ -44,90 +45,13 @@ 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());
>> + 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,
>
> _______________________________________________
> waffle mailing list
> waffle at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/waffle
More information about the waffle
mailing list