Loader.cpp revision c0ec5e2333b6350480851b8b48f000c78ea3f88a
14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** Copyright 2007, The Android Open Source Project 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License"); 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** you may not use this file except in compliance with the License. 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** You may obtain a copy of the License at 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** http://www.apache.org/licenses/LICENSE-2.0 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS, 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** See the License for the specific language governing permissions and 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** limitations under the License. 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ctype.h> 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h> 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h> 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h> 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <errno.h> 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <dlfcn.h> 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h> 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <dirent.h> 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <cutils/log.h> 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <cutils/properties.h> 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <EGL/egl.h> 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "../glestrace.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "egldefs.h" 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "Loader.h" 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace android { 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * EGL userspace drivers must be provided either: 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * - as a single library: 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * /vendor/lib/egl/libGLES.so 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * - as separate libraries: 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * /vendor/lib/egl/libEGL.so 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * /vendor/lib/egl/libGLESv1_CM.so 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * /vendor/lib/egl/libGLESv2.so 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * The software renderer for the emulator must be provided as a single 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * library at: 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * /system/lib/egl/libGLES_android.so 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * For backward compatibility and to facilitate the transition to 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * this new naming scheme, the loader will additionally look for: 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * /{vendor|system}/lib/egl/lib{GLES | [EGL|GLESv1_CM|GLESv2]}_*.so 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectANDROID_SINGLETON_STATIC_INSTANCE( Loader ) 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* This function is called to check whether we run inside the emulator, 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * and if this is the case whether GLES GPU emulation is supported. 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Returned values are: 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * -1 -> not running inside the emulator 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 0 -> running inside the emulator, but GPU emulation not supported 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 1 -> running inside the emulator, GPU emulation is supported 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * through the "emulation" config. 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectcheckGlesEmulationStatus(void) 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* We're going to check for the following kernel parameters: 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * qemu=1 -> tells us that we run inside the emulator 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * android.qemu.gles=<number> -> tells us the GLES GPU emulation status 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Note that we will return <number> if we find it. This let us support 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * more additionnal emulation modes in the future. 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char prop[PROPERTY_VALUE_MAX]; 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int result = -1; 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* First, check for qemu=1 */ 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project property_get("ro.kernel.qemu",prop,"0"); 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (atoi(prop) != 1) 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* We are in the emulator, get GPU status value */ 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project property_get("ro.kernel.qemu.gles",prop,"0"); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return atoi(prop); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic char const * getProcessCmdline() { 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project long pid = getpid(); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char procPath[128]; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project snprintf(procPath, 128, "/proc/%ld/cmdline", pid); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FILE * file = fopen(procPath, "r"); 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (file) { 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static char cmdline[256]; 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char *str = fgets(cmdline, sizeof(cmdline) - 1, file); 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fclose(file); 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (str) { 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return cmdline; 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NULL; 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLoader::driver_t::driver_t(void* gles) 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso[0] = gles; 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (size_t i=1 ; i<NELEM(dso) ; i++) 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso[i] = 0; 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLoader::driver_t::~driver_t() 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (size_t i=0 ; i<NELEM(dso) ; i++) { 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (dso[i]) { 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dlclose(dso[i]); 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso[i] = 0; 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatus_t Loader::driver_t::set(void* hnd, int32_t api) 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (api) { 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case EGL: 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso[0] = hnd; 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case GLESv1_CM: 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso[1] = hnd; 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case GLESv2: 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso[2] = hnd; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return BAD_INDEX; 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NO_ERROR; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLoader::Loader() 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : getProcAddress(NULL) { 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectLoader::~Loader() { 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GLTrace_stop(); 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void* load_wrapper(const char* path) { 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void* so = dlopen(path, RTLD_NOW | RTLD_LOCAL); 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ALOGE_IF(!so, "dlopen(\"%s\") failed: %s", path, dlerror()); 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return so; 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid* Loader::open(egl_connection_t* cnx) 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void* dso; 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project driver_t* hnd = 0; 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso = load_driver("GLES", cnx, EGL | GLESv1_CM | GLESv2); 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (dso) { 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hnd = new driver_t(dso); 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Always load EGL first 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dso = load_driver("EGL", cnx, EGL); 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (dso) { 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hnd = new driver_t(dso); 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hnd->set( load_driver("GLESv1_CM", cnx, GLESv1_CM), GLESv1_CM ); 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hnd->set( load_driver("GLESv2", cnx, GLESv2), GLESv2 ); 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG_ALWAYS_FATAL_IF(!hnd, "couldn't find an OpenGL ES implementation"); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(__LP64__) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cnx->libEgl = load_wrapper("/system/lib64/libEGL.so"); 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cnx->libGles2 = load_wrapper("/system/lib64/libGLESv2.so"); 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cnx->libGles1 = load_wrapper("/system/lib64/libGLESv1_CM.so"); 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cnx->libEgl = load_wrapper("/system/lib/libEGL.so"); 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cnx->libGles2 = load_wrapper("/system/lib/libGLESv2.so"); 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cnx->libGles1 = load_wrapper("/system/lib/libGLESv1_CM.so"); 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG_ALWAYS_FATAL_IF(!cnx->libEgl, 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "couldn't load system EGL wrapper libraries"); 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG_ALWAYS_FATAL_IF(!cnx->libGles2 || !cnx->libGles1, 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "couldn't load system OpenGL ES wrapper libraries"); 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (void*)hnd; 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatus_t Loader::close(void* driver) 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project driver_t* hnd = (driver_t*)driver; 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete hnd; 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return NO_ERROR; 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid Loader::init_api(void* dso, 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char const * const * api, 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __eglMustCastToProperFunctionPointerType* curr, 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project getProcAddressType getProcAddress) 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const ssize_t SIZE = 256; 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char scrap[SIZE]; 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (*api) { 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char const * name = *api; 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __eglMustCastToProperFunctionPointerType f = 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (__eglMustCastToProperFunctionPointerType)dlsym(dso, name); 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (f == NULL) { 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // couldn't find the entry-point, use eglGetProcAddress() 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = getProcAddress(name); 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (f == NULL) { 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Try without the OES postfix 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ssize_t index = ssize_t(strlen(name)) - 3; 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((index>0 && (index<SIZE-1)) && (!strcmp(name+index, "OES"))) { 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project strncpy(scrap, name, index); 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project scrap[index] = 0; 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)dlsym(dso, scrap); 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //ALOGD_IF(f, "found <%s> instead", scrap); 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (f == NULL) { 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Try with the OES postfix 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ssize_t index = ssize_t(strlen(name)) - 3; 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (index>0 && strcmp(name+index, "OES")) { 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project snprintf(scrap, SIZE, "%sOES", name); 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)dlsym(dso, scrap); 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //ALOGD_IF(f, "found <%s> instead", scrap); 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (f == NULL) { 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //ALOGD("%s", name); 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)gl_unimplemented; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * GL_EXT_debug_label is special, we always report it as 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * supported, it's handled by GLES_trace. If GLES_trace is not 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * enabled, then these are no-ops. 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!strcmp(name, "glInsertEventMarkerEXT")) { 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)gl_noop; 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else if (!strcmp(name, "glPushGroupMarkerEXT")) { 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)gl_noop; 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else if (!strcmp(name, "glPopGroupMarkerEXT")) { 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)gl_noop; 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *curr++ = f; 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project api++; 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *Loader::load_driver(const char* kind, 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project egl_connection_t* cnx, uint32_t mask) 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project class MatchFile { 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static String8 find(const char* kind) { 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project String8 result; 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project String8 pattern; 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pattern.appendFormat("lib%s", kind); 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const char* const searchPaths[] = { 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(__LP64__) 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "/vendor/lib64/egl", 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "/system/lib64/egl" 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "/vendor/lib/egl", 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "/system/lib/egl" 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // first, we search for the exact name of the GLES userspace 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // driver in both locations. 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // i.e.: 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // libGLES.so, or: 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // libEGL.so, libGLESv1_CM.so, libGLESv2.so 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (size_t i=0 ; i<NELEM(searchPaths) ; i++) { 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (find(result, pattern, searchPaths[i], true)) { 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // for compatibility with the old "egl.cfg" naming convention 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // we look for files that match: 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // libGLES_*.so, or: 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // libEGL_*.so, libGLESv1_CM_*.so, libGLESv2_*.so 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pattern.append("_"); 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (size_t i=0 ; i<NELEM(searchPaths) ; i++) { 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (find(result, pattern, searchPaths[i], false)) { 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // we didn't find the driver. gah. 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result.clear(); 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return result; 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static bool find(String8& result, 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const String8& pattern, const char* const search, bool exact) { 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // in the emulator case, we just return the hardcoded name 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // of the software renderer. 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (checkGlesEmulationStatus() == 0) { 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ALOGD("Emulator without GPU support detected. " 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "Fallback to software renderer."); 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(__LP64__) 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result.setTo("/system/lib64/egl/libGLES_android.so"); 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result.setTo("/system/lib/egl/libGLES_android.so"); 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return true; 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (exact) { 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project String8 absolutePath; 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project absolutePath.appendFormat("%s/%s.so", search, pattern.string()); 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!access(absolutePath.string(), R_OK)) { 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result = absolutePath; 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return true; 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DIR* d = opendir(search); 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (d != NULL) { 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct dirent cur; 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct dirent* e; 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (readdir_r(d, &cur, &e) == 0 && e) { 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e->d_type == DT_DIR) { 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project continue; 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!strcmp(e->d_name, "libGLES_android.so")) { 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // always skip the software renderer 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project continue; 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (strstr(e->d_name, pattern.string()) == e->d_name) { 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!strcmp(e->d_name + strlen(e->d_name) - 3, ".so")) { 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result.clear(); 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project result.appendFormat("%s/%s", search, e->d_name); 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project closedir(d); 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return true; 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project closedir(d); 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project String8 absolutePath = MatchFile::find(kind); 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (absolutePath.isEmpty()) { 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // this happens often, we don't want to log an error 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const char* const driver_absolute_path = absolutePath.string(); 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void* dso = dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL); 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (dso == 0) { 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const char* err = dlerror(); 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ALOGE("load_driver(%s): %s", driver_absolute_path, err?err:"unknown"); 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ALOGD("loaded %s", driver_absolute_path); 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (mask & EGL) { 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project getProcAddress = (getProcAddressType)dlsym(dso, "eglGetProcAddress"); 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ALOGE_IF(!getProcAddress, 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project "can't find eglGetProcAddress() in %s", driver_absolute_path); 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project egl_t* egl = &cnx->egl; 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __eglMustCastToProperFunctionPointerType* curr = 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (__eglMustCastToProperFunctionPointerType*)egl; 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char const * const * api = egl_names; 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (*api) { 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char const * name = *api; 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project __eglMustCastToProperFunctionPointerType f = 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (__eglMustCastToProperFunctionPointerType)dlsym(dso, name); 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (f == NULL) { 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // couldn't find the entry-point, use eglGetProcAddress() 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = getProcAddress(name); 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (f == NULL) { 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project f = (__eglMustCastToProperFunctionPointerType)0; 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *curr++ = f; 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project api++; 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (mask & GLESv1_CM) { 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project init_api(dso, gl_names, 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (__eglMustCastToProperFunctionPointerType*) 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &cnx->hooks[egl_connection_t::GLESv1_INDEX]->gl, 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project getProcAddress); 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (mask & GLESv2) { 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project init_api(dso, gl_names, 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (__eglMustCastToProperFunctionPointerType*) 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &cnx->hooks[egl_connection_t::GLESv2_INDEX]->gl, 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project getProcAddress); 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return dso; 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; // namespace android 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ---------------------------------------------------------------------------- 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project