| 180 | |
| 181 | |
| 182 | static void *loadEGLSymbol(const char *name, bool optional) |
| 183 | { |
| 184 | char *err = NULL; |
| 185 | |
| 186 | if(!__eglGetProcAddress) |
| 187 | { |
| 188 | if(strlen(fconfig.egllib) > 0) |
| 189 | { |
| 190 | dlerror(); // Clear error state |
| 191 | void *dllhnd = _vgl_dlopen(fconfig.egllib, RTLD_LAZY); |
| 192 | err = dlerror(); |
| 193 | if(!dllhnd) |
| 194 | { |
| 195 | vglout.print("[VGL] ERROR: Could not open %s\n", fconfig.egllib); |
| 196 | if(err) vglout.print("[VGL] %s\n", err); |
| 197 | return NULL; |
| 198 | } |
| 199 | egldllhnd = dllhnd; |
| 200 | } |
| 201 | else egldllhnd = RTLD_NEXT; |
| 202 | |
| 203 | dlerror(); // Clear error state |
| 204 | __eglGetProcAddress = |
| 205 | (_eglGetProcAddressType)dlsym(egldllhnd, "eglGetProcAddress"); |
| 206 | err = dlerror(); |
| 207 | |
| 208 | if(!__eglGetProcAddress) |
| 209 | { |
| 210 | vglout.print("[VGL] ERROR: Could not load EGL functions"); |
| 211 | if(strlen(fconfig.egllib) > 0) |
| 212 | vglout.print(" from %s", fconfig.egllib); |
| 213 | vglout.print("\n"); |
| 214 | if(err) vglout.print("[VGL] %s\n", err); |
| 215 | return NULL; |
| 216 | } |
| 217 | } |
| 218 | |
| 219 | void *sym = NULL; |
| 220 | if(!strcmp(name, "eglGetProcAddress")) |
| 221 | sym = (void *)__eglGetProcAddress; |
| 222 | else |
| 223 | { |
| 224 | if(fconfig.dlsymloader) |
| 225 | { |
| 226 | dlerror(); // Clear error state |
| 227 | sym = dlsym(egldllhnd, (char *)name); |
| 228 | err = dlerror(); |
| 229 | } |
| 230 | else |
| 231 | { |
| 232 | sym = (void *)__eglGetProcAddress(name); |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | if(!sym && (fconfig.verbose || !optional)) |
| 237 | { |
| 238 | vglout.print("[VGL] %s: Could not load function \"%s\"", |
| 239 | optional ? "WARNING" : "ERROR", name); |
no test coverage detected