Re: [waffle] [PATCH v2 8/8] nacl: add implementation for waffle_dl_sym

2015-02-12 Thread Emil Velikov
On 9 February 2015 at 13:24, Tapani Pälli tapani.pa...@intel.com wrote:
 v2: use wcore_calloc, code cleanup (Emil Velikov)
 open dll only once in can_open (Chad Versace)

 Signed-off-by: Tapani Pälli tapani.pa...@intel.com
 ---
  src/waffle/nacl/nacl_platform.c | 69 
 +++--
  src/waffle/nacl/nacl_platform.h |  1 +
  2 files changed, 68 insertions(+), 2 deletions(-)

 diff --git a/src/waffle/nacl/nacl_platform.c b/src/waffle/nacl/nacl_platform.c
 index c4fefe5..22169da 100644
 --- a/src/waffle/nacl/nacl_platform.c
 +++ b/src/waffle/nacl/nacl_platform.c
 @@ -43,6 +43,11 @@ 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());
 +
  free(self);
  return ok;
  }
 @@ -51,7 +56,41 @@ static bool
  nacl_platform_dl_can_open(struct wcore_platform *wc_self,
int32_t waffle_dl)
  {
 -return false;
 +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*
 @@ -59,7 +98,33 @@ nacl_platform_dl_sym(struct wcore_platform *wc_self,
   int32_t waffle_dl,
   const char *name)
  {
 -return NULL;
 +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))
I'm sorry boring this again but - doing this will not set the correct
error on WAFFLE_DL_OPENGL_ES3.

 +return false;
return NULL;

Cheers,
Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH v2 8/8] nacl: add implementation for waffle_dl_sym

2015-02-12 Thread Tapani Pälli



On 02/12/2015 01:02 PM, Emil Velikov wrote:

On 9 February 2015 at 13:24, Tapani Pälli tapani.pa...@intel.com wrote:

v2: use wcore_calloc, code cleanup (Emil Velikov)
 open dll only once in can_open (Chad Versace)

Signed-off-by: Tapani Pälli tapani.pa...@intel.com
---
  src/waffle/nacl/nacl_platform.c | 69 +++--
  src/waffle/nacl/nacl_platform.h |  1 +
  2 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/src/waffle/nacl/nacl_platform.c b/src/waffle/nacl/nacl_platform.c
index c4fefe5..22169da 100644
--- a/src/waffle/nacl/nacl_platform.c
+++ b/src/waffle/nacl/nacl_platform.c
@@ -43,6 +43,11 @@ 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());
+
  free(self);
  return ok;
  }
@@ -51,7 +56,41 @@ static bool
  nacl_platform_dl_can_open(struct wcore_platform *wc_self,
int32_t waffle_dl)
  {
-return false;
+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*
@@ -59,7 +98,33 @@ nacl_platform_dl_sym(struct wcore_platform *wc_self,
   int32_t waffle_dl,
   const char *name)
  {
-return NULL;
+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))

I'm sorry boring this again but - doing this will not set the correct
error on WAFFLE_DL_OPENGL_ES3.


Thanks for pointing this out. I've been now busy with some bugs but I'll 
promise to fix this.




+return false;

return NULL;

Cheers,
Emil




// Tapani
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


[waffle] [PATCH v2 8/8] nacl: add implementation for waffle_dl_sym

2015-02-09 Thread Tapani Pälli
v2: use wcore_calloc, code cleanup (Emil Velikov)
open dll only once in can_open (Chad Versace)

Signed-off-by: Tapani Pälli tapani.pa...@intel.com
---
 src/waffle/nacl/nacl_platform.c | 69 +++--
 src/waffle/nacl/nacl_platform.h |  1 +
 2 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/src/waffle/nacl/nacl_platform.c b/src/waffle/nacl/nacl_platform.c
index c4fefe5..22169da 100644
--- a/src/waffle/nacl/nacl_platform.c
+++ b/src/waffle/nacl/nacl_platform.c
@@ -43,6 +43,11 @@ 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());
+
 free(self);
 return ok;
 }
@@ -51,7 +56,41 @@ static bool
 nacl_platform_dl_can_open(struct wcore_platform *wc_self,
   int32_t waffle_dl)
 {
-return false;
+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*
@@ -59,7 +98,33 @@ nacl_platform_dl_sym(struct wcore_platform *wc_self,
  int32_t waffle_dl,
  const char *name)
 {
-return NULL;
+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
diff --git a/src/waffle/nacl/nacl_platform.h b/src/waffle/nacl/nacl_platform.h
index ba58de5..fa2d364 100644
--- a/src/waffle/nacl/nacl_platform.h
+++ b/src/waffle/nacl/nacl_platform.h
@@ -38,6 +38,7 @@
 struct nacl_platform {
 struct wcore_platform wcore;
 struct nacl_container *nacl;
+void *gl_dl;
 };
 
 DEFINE_CONTAINER_CAST_FUNC(nacl_platform,
-- 
2.1.0

___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle