From: Igor Mitsyanko Date: Thu, 18 Oct 2012 08:45:27 +0000 (+0400) Subject: YaGL: make GLES drivers initialization OS agnostic X-Git-Tag: TizenStudio_2.0_p2.3~1199^2~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e077302348505f506b4543a3cb2cc610e9982478;p=sdk%2Femulator%2Fqemu.git YaGL: make GLES drivers initialization OS agnostic Introduce function to acquire symbols from openGL library OS-specific way. This is needed because only EGL OS-specific backend (glx, wgl e.t.c.) knows how function addresses should be retreived. Signed-off-by: Igor Mitsyanko --- diff --git a/hw/yagl_drivers/egl_glx/yagl_egl_glx.c b/hw/yagl_drivers/egl_glx/yagl_egl_glx.c index 70260e0..7ce3083 100644 --- a/hw/yagl_drivers/egl_glx/yagl_egl_glx.c +++ b/hw/yagl_drivers/egl_glx/yagl_egl_glx.c @@ -637,3 +637,26 @@ fail: return NULL; } + +void *yagl_egl_glx_procaddr_get(struct yagl_dyn_lib *dyn_lib, + const char *sym_name) +{ + PFNGLXGETPROCADDRESSPROC get_address = NULL; + void *ret_func = NULL; + + get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress"); + + if (!get_address) { + get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB"); + } + + if (get_address) { + ret_func = (void *)get_address((const GLubyte *)sym_name); + } + + if (!ret_func) { + ret_func = yagl_dyn_lib_get_sym(dyn_lib, sym_name); + } + + return ret_func; +} diff --git a/hw/yagl_drivers/gles1_ogl/yagl_gles1_ogl.c b/hw/yagl_drivers/gles1_ogl/yagl_gles1_ogl.c index 61c89e6..96035b6 100644 --- a/hw/yagl_drivers/gles1_ogl/yagl_gles1_ogl.c +++ b/hw/yagl_drivers/gles1_ogl/yagl_gles1_ogl.c @@ -8,7 +8,6 @@ #include "yagl_process.h" #include "yagl_thread.h" #include "yagl_tls.h" -#include static YAGL_DEFINE_TLS(struct yagl_thread_state*, gles1_ogl_ts); @@ -238,7 +237,6 @@ static void yagl_gles1_ogl_destroy(struct yagl_gles1_driver *driver) struct yagl_gles1_driver *yagl_gles1_ogl_create(struct yagl_dyn_lib *dyn_lib) { struct yagl_gles1_ogl *gles1_ogl = NULL; - PFNGLXGETPROCADDRESSPROC get_address = NULL; struct yagl_gles_ogl *gles_ogl = NULL; YAGL_LOG_FUNC_ENTER_NPT(yagl_gles1_ogl_create, NULL); @@ -253,12 +251,6 @@ struct yagl_gles1_driver *yagl_gles1_ogl_create(struct yagl_dyn_lib *dyn_lib) goto fail; } - get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress"); - - if (!get_address) { - get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB"); - } - YAGL_GLES_OGL_GET_PROC(gles1_ogl, glAlphaFunc); YAGL_GLES_OGL_GET_PROC(gles1_ogl, glColor4f); YAGL_GLES_OGL_GET_PROC(gles1_ogl, glDepthRangef); diff --git a/hw/yagl_drivers/gles2_ogl/yagl_gles2_ogl.c b/hw/yagl_drivers/gles2_ogl/yagl_gles2_ogl.c index 28487f3..6abc299 100644 --- a/hw/yagl_drivers/gles2_ogl/yagl_gles2_ogl.c +++ b/hw/yagl_drivers/gles2_ogl/yagl_gles2_ogl.c @@ -8,7 +8,6 @@ #include "yagl_process.h" #include "yagl_thread.h" #include "yagl_tls.h" -#include static YAGL_DEFINE_TLS(struct yagl_thread_state*, gles2_ogl_ts); @@ -313,7 +312,6 @@ static void yagl_gles2_ogl_destroy(struct yagl_gles2_driver *driver) struct yagl_gles2_driver *yagl_gles2_ogl_create(struct yagl_dyn_lib *dyn_lib) { struct yagl_gles2_ogl *gles2_ogl = NULL; - PFNGLXGETPROCADDRESSPROC get_address = NULL; struct yagl_gles_ogl *gles_ogl = NULL; YAGL_LOG_FUNC_ENTER_NPT(yagl_gles2_ogl_create, NULL); @@ -328,12 +326,6 @@ struct yagl_gles2_driver *yagl_gles2_ogl_create(struct yagl_dyn_lib *dyn_lib) goto fail; } - get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress"); - - if (!get_address) { - get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB"); - } - YAGL_GLES_OGL_GET_PROC(gles2_ogl, glAttachShader); YAGL_GLES_OGL_GET_PROC(gles2_ogl, glBindAttribLocation); YAGL_GLES_OGL_GET_PROC(gles2_ogl, glBlendColor); diff --git a/hw/yagl_drivers/gles_ogl/yagl_gles_ogl.c b/hw/yagl_drivers/gles_ogl/yagl_gles_ogl.c index 998e866..f82beac 100644 --- a/hw/yagl_drivers/gles_ogl/yagl_gles_ogl.c +++ b/hw/yagl_drivers/gles_ogl/yagl_gles_ogl.c @@ -4,7 +4,6 @@ #include "yagl_log.h" #include "yagl_dyn_lib.h" #include "yagl_process.h" -#include struct yagl_gles_ogl { @@ -270,18 +269,11 @@ struct yagl_gles_ogl *yagl_gles_ogl_create(struct yagl_dyn_lib *dyn_lib) { struct yagl_gles_ogl *gles_ogl; - PFNGLXGETPROCADDRESSPROC get_address = NULL; YAGL_LOG_FUNC_ENTER_NPT(yagl_gles_ogl_create, NULL); gles_ogl = g_malloc0(sizeof(*gles_ogl)); - get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddress"); - - if (!get_address) { - get_address = yagl_dyn_lib_get_sym(dyn_lib, "glXGetProcAddressARB"); - } - YAGL_GLES_OGL_GET_PROC(gles_ogl, glActiveTexture); YAGL_GLES_OGL_GET_PROC(gles_ogl, glBindBuffer); YAGL_GLES_OGL_GET_PROC(gles_ogl, glBindTexture); diff --git a/hw/yagl_drivers/gles_ogl/yagl_gles_ogl_macros.h b/hw/yagl_drivers/gles_ogl/yagl_gles_ogl_macros.h index eaf5d2e..1d29ac5 100644 --- a/hw/yagl_drivers/gles_ogl/yagl_gles_ogl_macros.h +++ b/hw/yagl_drivers/gles_ogl/yagl_gles_ogl_macros.h @@ -161,16 +161,11 @@ static void driver_type##_##func(struct obj_type *driver_ps, arg0_type arg0, arg #define YAGL_GLES_OGL_GET_PROC(driver, func) \ do { \ - if (get_address) { \ - *(void**)(&driver->func) = get_address((const GLubyte*)#func); \ - } \ + *(void**)(&driver->func) = yagl_dyn_lib_procaddr_get(dyn_lib, #func); \ if (!driver->func) { \ - *(void**)(&driver->func) = yagl_dyn_lib_get_sym(dyn_lib, #func); \ - if (!driver->func) { \ - YAGL_LOG_ERROR("Unable to get symbol: %s", \ - yagl_dyn_lib_get_error(dyn_lib)); \ - goto fail; \ - } \ + YAGL_LOG_ERROR("Unable to get symbol: %s", \ + yagl_dyn_lib_get_error(dyn_lib)); \ + goto fail; \ } \ } while (0) diff --git a/hw/yagl_dyn_lib.h b/hw/yagl_dyn_lib.h index 5fd96be..66cec08 100644 --- a/hw/yagl_dyn_lib.h +++ b/hw/yagl_dyn_lib.h @@ -17,4 +17,19 @@ void *yagl_dyn_lib_get_sym(struct yagl_dyn_lib *dyn_lib, const char* sym_name); const char *yagl_dyn_lib_get_error(struct yagl_dyn_lib *dyn_lib); +#ifdef CONFIG_YAGL_EGL_GLX + +void *yagl_egl_glx_procaddr_get(struct yagl_dyn_lib *dyn_lib, + const char *sym_name); + +static inline void *yagl_dyn_lib_procaddr_get(struct yagl_dyn_lib *dyn_lib, + const char *sym_name) +{ + return yagl_egl_glx_procaddr_get(dyn_lib, sym_name); +} + +#else +#error Unknown EGL backend +#endif + #endif