From b439fafa17e000986dce027a0f6cf59cf2c0d644 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 13 Jul 2015 16:04:45 +0900 Subject: [PATCH] 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; -- 2.7.4