jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b439fafa17e000986dce027a0f6cf59cf2c0d644

commit b439fafa17e000986dce027a0f6cf59cf2c0d644
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Jul 13 16:04:45 2015 +0900

    Evas GL: Fix internal function pointer
    
    evas_gl_native_context_get is an internal function
    passed around from an evas engine to evas_gl so that we can
    implement evasglCreateImageForContext without exposing
    any evas engine internal structure to evas_gl.
    
    It's all a ittle bit ugly but the previous solution with
    dlsym(DEFAULT) didn't work.
---
 src/lib/evas/canvas/evas_gl.c                      | 24 +++++++++++-----------
 src/lib/evas/include/evas_private.h                |  2 +-
 src/modules/evas/engines/gl_common/evas_gl_core.c  |  9 ++++----
 src/modules/evas/engines/gl_common/evas_gl_core.h  |  2 +-
 src/modules/evas/engines/gl_generic/evas_engine.c  |  5 +++--
 .../evas/engines/software_generic/evas_engine.c    |  4 ++--
 6 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/src/lib/evas/canvas/evas_gl.c b/src/lib/evas/canvas/evas_gl.c
index 1552e59..68ac0ec 100644
--- a/src/lib/evas/canvas/evas_gl.c
+++ b/src/lib/evas/canvas/evas_gl.c
@@ -326,6 +326,15 @@ evas_gl_surface_destroy(Evas_GL *evas_gl, Evas_GL_Surface 
*surf)
    surf = NULL;
 }
 
+// Internal function - called from evas_gl_core.c
+static void *
+evas_gl_native_context_get(void *context)
+{
+   Evas_GL_Context *ctx = context;
+   if (!ctx) return NULL;
+   return ctx->data;
+}
+
 EAPI Evas_GL_Context *
 evas_gl_context_version_create(Evas_GL *evas_gl, Evas_GL_Context *share_ctx,
                                Evas_GL_Context_Version version)
@@ -356,10 +365,9 @@ evas_gl_context_version_create(Evas_GL *evas_gl, 
Evas_GL_Context *share_ctx,
 
    // Call engine->gl_create_context
    ctx->version = version;
-   if (share_ctx)
-     ctx->data = 
evas_gl->evas->engine.func->gl_context_create(evas_gl->evas->engine.data.output,
 share_ctx->data, version);
-   else
-     ctx->data = 
evas_gl->evas->engine.func->gl_context_create(evas_gl->evas->engine.data.output,
 NULL, version);
+   ctx->data = evas_gl->evas->engine.func->gl_context_create
+         (evas_gl->evas->engine.data.output, share_ctx ? share_ctx->data : 
NULL,
+          version, &evas_gl_native_context_get);
 
    // Set a few variables
    if (!ctx->data)
@@ -644,11 +652,3 @@ evas_gl_surface_query(Evas_GL *evas_gl, Evas_GL_Surface 
*surface, int attribute,
    return evas_gl->evas->engine.func->gl_surface_query
          (evas_gl->evas->engine.data.output, surface->data, attribute, value);
 }
-
-// Internal function - called from evas_gl_core.c
-EAPI void *
-_evas_gl_native_context_get(Evas_GL_Context *ctx)
-{
-   if (!ctx) return NULL;
-   return ctx->data;
-}
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 04b59ef..ecb8b8c 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1370,7 +1370,7 @@ struct _Evas_Func
    void *(*gl_surface_create)            (void *data, void *config, int w, int 
h);
    void *(*gl_pbuffer_surface_create)    (void *data, void *config, int w, int 
h, int const *attrib_list);
    int  (*gl_surface_destroy)            (void *data, void *surface);
-   void *(*gl_context_create)            (void *data, void *share_context, int 
version);
+   void *(*gl_context_create)            (void *data, void *share_context, int 
version, void *(*native_context_get)(void *ctx));
    int  (*gl_context_destroy)            (void *data, void *context);
    int  (*gl_make_current)               (void *data, void *surface, void 
*context);
    const char *(*gl_string_query)        (void *data, int name);
diff --git a/src/modules/evas/engines/gl_common/evas_gl_core.c 
b/src/modules/evas/engines/gl_common/evas_gl_core.c
index 7ebee74..33ef45a 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_core.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_core.c
@@ -1681,9 +1681,6 @@ evgl_engine_init(void *eng_data, const EVGL_Interface 
*efunc)
      }
    DBG("TLS KEY created: %d", evgl_engine->resource_key);
 
-   // Link to evas_gl.c (this doesn't look great)
-   glsym_evas_gl_native_context_get = dlsym(RTLD_DEFAULT, 
"_evas_gl_native_context_get");
-
    evgl_engine->safe_extensions = eina_hash_string_small_new(NULL);
 
    // Surface Caps
@@ -2073,11 +2070,15 @@ evgl_surface_destroy(void *eng_data, EVGL_Surface *sfc)
 
 void *
 evgl_context_create(void *eng_data, EVGL_Context *share_ctx,
-                    Evas_GL_Context_Version version)
+                    Evas_GL_Context_Version version,
+                    void *(*native_context_get)(void *))
 {
    EVGL_Context *ctx   = NULL;
    EVGL_Resource *rsc  = NULL;
 
+   // A little bit ugly. But it works even when dlsym(DEFAULT) doesn't work.
+   glsym_evas_gl_native_context_get = native_context_get;
+
    // Check the input
    if (!evgl_engine)
      {
diff --git a/src/modules/evas/engines/gl_common/evas_gl_core.h 
b/src/modules/evas/engines/gl_common/evas_gl_core.h
index 43d32a6..cf2b325 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_core.h
+++ b/src/modules/evas/engines/gl_common/evas_gl_core.h
@@ -58,7 +58,7 @@ EVGL_Engine *evgl_engine_init(void *eng_data, const 
EVGL_Interface *efunc);
 void        *evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, 
int h);
 void        *evgl_pbuffer_surface_create(void *eng_data, Evas_GL_Config *cfg, 
int w, int h, const int *attrib_list);
 int          evgl_surface_destroy(void *eng_data, EVGL_Surface *sfc);
-void        *evgl_context_create(void *eng_data, EVGL_Context *share_ctx, 
Evas_GL_Context_Version version);
+void        *evgl_context_create(void *eng_data, EVGL_Context *share_ctx, 
Evas_GL_Context_Version version, void *(*native_context_get)(void *));
 int          evgl_context_destroy(void *eng_data, EVGL_Context *ctx);
 int          evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context 
*ctx);
 
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c 
b/src/modules/evas/engines/gl_generic/evas_engine.c
index 497eba8..280a5f3 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -1423,12 +1423,13 @@ eng_gl_surface_destroy(void *data, void *surface)
 }
 
 static void *
-eng_gl_context_create(void *data, void *share_context, int version)
+eng_gl_context_create(void *data, void *share_context, int version,
+                      void *(*native_context_get)(void *))
 {
    EVGL_Context  *sctx = (EVGL_Context *)share_context;
 
    EVGLINIT(data, NULL);
-   return evgl_context_create(data, sctx, version);
+   return evgl_context_create(data, sctx, version, native_context_get);
 }
 
 static int
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c 
b/src/modules/evas/engines/software_generic/evas_engine.c
index acbf988..aedd80e 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -2937,8 +2937,8 @@ eng_gl_surface_destroy(void *data EINA_UNUSED, void 
*surface)
 }
 
 static void *
-eng_gl_context_create(void *data EINA_UNUSED, void *share_context,
-                      int version)
+eng_gl_context_create(void *data EINA_UNUSED, void *share_context, int version,
+                      void *(*native_context_get)(void *) EINA_UNUSED)
 {
 #ifdef EVAS_GL
    Render_Engine_GL_Context *ctx;

-- 


Reply via email to