9 #include "coregl_internal.h"
10 #include "coregl_export.h"
14 int driver_gl_version = COREGL_GLAPI_2;
15 static int api_gl_version = COREGL_GLAPI_2;
17 #ifndef _COREGL_VENDOR_EGL_LIB_PATH
18 #define _COREGL_VENDOR_EGL_LIB_PATH "/usr/lib/driver/libEGL.so" /* DEFAULT EGL PATH */
21 #ifndef _COREGL_VENDOR_GL_LIB_PATH
22 #define _COREGL_VENDOR_GL_LIB_PATH "/usr/lib/driver/libGLESv2.so" /* DEFAULT GL PATH */
25 // Symbol definition for real
26 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
27 #include "headers/sym.h"
31 get_env_setting(const char *name)
34 static char *fp_default = "\0";
35 fp_env = getenv(name);
36 if (fp_env == NULL) fp_env = fp_default;
41 cleanup_current_thread_state()
43 GLThreadState *tstate = NULL;
45 tstate = get_current_thread_state();
48 COREGL_LOG("[COREGL] de-init thread state \n");
49 deinit_modules_tstate(tstate);
50 remove_from_general_trace_list(&thread_trace_list, tstate);
55 set_current_thread_state(NULL);
59 init_new_thread_state()
62 GLThreadState *tstate = NULL;
64 tstate = get_current_thread_state();
67 tstate = (GLThreadState *)calloc(1, sizeof(GLThreadState));
68 tstate->thread_id = get_current_thread();
69 add_to_general_trace_list(&thread_trace_list, tstate);
71 init_modules_tstate(tstate);
72 set_current_thread_state(tstate);
84 COREGL_ERR("GL symbol missing! Check client version!\n");
87 #define FINDSYM(libhandle, getproc, dst, sym) \
88 if(api_gl_version <= driver_gl_version) { \
89 if (!dst || (void *)dst == (void *)_sym_missing) \
90 if (getproc) dst = (__typeof__(dst))getproc(sym); \
91 if (!dst || (void *)dst == (void *)_sym_missing) \
92 dst = (__typeof__(dst))dlsym(libhandle, sym); \
93 if (!dst) dst = (__typeof__(dst))_sym_missing;\
100 #define _COREGL_START_API(version) api_gl_version = version;
101 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
102 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) \
103 FINDSYM(egl_lib_handle, _sym_eglGetProcAddress, _sym_##FUNC_NAME, #FUNC_NAME);
104 #define _COREGL_EXT_SYMBOL_ALIAS(FUNC_NAME, ALIAS_NAME) \
105 FINDSYM(egl_lib_handle, _sym_eglGetProcAddress, _sym_##ALIAS_NAME, #FUNC_NAME);
107 #include "headers/sym_egl.h"
109 #undef _COREGL_EXT_SYMBOL_ALIAS
110 #undef _COREGL_SYMBOL
111 #undef _COREGL_START_API
112 #undef _COREGL_END_API
121 #define _COREGL_START_API(version) api_gl_version = version;
122 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
123 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) \
124 FINDSYM(gl_lib_handle, _sym_eglGetProcAddress, _sym_##FUNC_NAME, #FUNC_NAME);
125 #define _COREGL_EXT_SYMBOL_ALIAS(FUNC_NAME, ALIAS_NAME) \
126 FINDSYM(gl_lib_handle, _sym_eglGetProcAddress, _sym_##ALIAS_NAME, #FUNC_NAME);
128 #include "headers/sym_gl.h"
130 #undef _COREGL_EXT_SYMBOL_ALIAS
131 #undef _COREGL_SYMBOL
132 #undef _COREGL_START_API
133 #undef _COREGL_END_API
141 COREGL_API void coregl_symbol_exported()
143 COREGL_ERR("\E[40;31;1mInvalid library link! (Check linkage of libCOREGL)\E[0m\n");
149 //------------------------------------------------//
150 // Open EGL Library as EGL is separate
151 egl_lib_handle = dlopen(_COREGL_VENDOR_EGL_LIB_PATH, RTLD_LAZY | RTLD_LOCAL);
152 if (!egl_lib_handle) {
153 COREGL_ERR("\E[40;31;1m%s\E[0m\n\n", dlerror());
154 COREGL_ERR("\E[40;31;1mInvalid library link! (Check linkage of libCOREGL -> %s)\E[0m\n",
155 _COREGL_VENDOR_EGL_LIB_PATH);
159 // test for invalid linking egl
160 if (dlsym(egl_lib_handle, "coregl_symbol_exported")) {
161 COREGL_ERR("\E[40;31;1mInvalid library link! (Check linkage of libCOREGL -> %s)\E[0m\n",
162 _COREGL_VENDOR_EGL_LIB_PATH);
166 // use gl_lib handle for GL symbols
167 gl_lib_handle = dlopen(_COREGL_VENDOR_GL_LIB_PATH, RTLD_LAZY | RTLD_LOCAL);
168 if (!gl_lib_handle) {
169 COREGL_ERR("\E[40;31;1m%s\E[0m\n\n", dlerror());
170 COREGL_ERR("\E[40;31;1mInvalid library link! (Check linkage of libCOREGL -> %s)\E[0m\n",
171 _COREGL_VENDOR_GL_LIB_PATH);
175 // test for invalid linking gl
176 if (dlsym(gl_lib_handle, "coregl_symbol_exported")) {
177 COREGL_ERR("\E[40;31;1mInvalid library link! (Check linkage of libCOREGL -> %s)\E[0m\n",
178 _COREGL_VENDOR_GL_LIB_PATH);
182 // test for a GLES 3.0 symbol
183 if (dlsym(gl_lib_handle, "glBindProgramPipeline")) {
184 COREGL_LOG("[CoreGL] Driver GL version 3.1 \n");
185 driver_gl_version = COREGL_GLAPI_31;
186 } else if (dlsym(gl_lib_handle, "glReadBuffer")) {
187 COREGL_LOG("[CoreGL] Driver GL version 3.0 \n");
188 driver_gl_version = COREGL_GLAPI_3;
190 COREGL_LOG("[CoreGL] Driver GL version 2.0 \n");
193 //------------------------------------------------//
195 if (!_glue_sym_init()) return 0;
196 if (!_gl_sym_init()) return 0;
204 if (egl_lib_handle) dlclose(egl_lib_handle);
205 if (gl_lib_handle) dlclose(gl_lib_handle);
213 COREGL_LOG("[CoreGL] <%d> (%s) Library initializing...", getpid(),
214 _COREGL_COMPILE_DATE);
216 if (!_gl_lib_init()) return 0;
220 COREGL_LOG(" -> Completed\n");
227 __attribute__((destructor))
231 if (export_initialized != 0) {