156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall/* 256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Copyright (C) 2011 The Android Open Source Project 356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Licensed under the Apache License, Version 2.0 (the "License"); 556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* you may not use this file except in compliance with the License. 656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* You may obtain a copy of the License at 756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* http://www.apache.org/licenses/LICENSE-2.0 956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 1056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Unless required by applicable law or agreed to in writing, software 1156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* distributed under the License is distributed on an "AS IS" BASIS, 1256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* See the License for the specific language governing permissions and 1456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* limitations under the License. 1556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*/ 1656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 1756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// 1856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// WARNING -------------------------- WARNING 1956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// This code meant to be used for testing purposes only. It is not production 2056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// level quality. 2156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// Use on your own risk !! 2256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// 2356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 2456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <stdio.h> 2556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <stdlib.h> 2656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <string.h> 2756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <dlfcn.h> 2856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "egl_dispatch.h" 2956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "egl_ftable.h" 3056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <cutils/process_name.h> 3156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <cutils/log.h> 3256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ServerConnection.h" 3356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ThreadInfo.h" 3456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <pthread.h> 3556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "gl_wrapper_context.h" 3656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "gl2_wrapper_context.h" 3756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 3856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GLES_EMUL_TARGETS_FILE "/system/etc/gles_emul.cfg" 3956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// implementation libraries; 4056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GLESv1_enc_LIB "/system/lib/libGLESv1_enc.so" 4156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GLESv2_enc_LIB "/system/lib/libGLESv2_enc.so" 4256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GLES_android_LIB "/system/lib/egl/libGLES_android.so" 4356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// driver libraries; 4456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GLESv1_DRIVER "/system/lib/egl/libGLESv1_CM_emul.so" 4556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GLESv2_DRIVER "/system/lib/egl/libGLESv2_emul.so" 4656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 4756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 4856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic struct egl_dispatch *s_dispatch = NULL; 4956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallpthread_once_t dispatchTablesInitialized = PTHREAD_ONCE_INIT; 5056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 5156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic bool s_needEncode = false; 5256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 5356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic gl_wrapper_context_t *g_gl_dispatch = NULL; 5456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic gl2_wrapper_context_t *g_gl2_dispatch = NULL; 5556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 5656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Halltemplate <class T> 5756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallint initApi(const char *driverLibName, const char *implLibName, T **dispatchTable, T *(*accessor)()) 5856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 5956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void *driverLib = dlopen(driverLibName, RTLD_NOW | RTLD_LOCAL); 6056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (driverLib == NULL) { 6156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("failed to load %s : %s\n", driverLibName, dlerror()); 6256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return -1; 6356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 6456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall typedef T *(*createFcn_t)(void *, T *(*accessor)()); 6656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall createFcn_t createFcn; 6756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall createFcn = (createFcn_t) dlsym(driverLib, "createFromLib"); 6856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (createFcn == NULL) { 6956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("failed to load createFromLib constructor function\n"); 7056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return -1; 7156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 7256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 7356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void *implLib = dlopen(implLibName, RTLD_NOW | RTLD_LOCAL); 7456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (implLib == NULL) { 7556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("couldn't open %s", implLibName); 7656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return -2; 7756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 7856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *dispatchTable = createFcn(implLib, accessor); 7956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (*dispatchTable == NULL) { 8056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return -3; 8156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 8256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // XXX - we do close the impl library since it doesn't have data, as far as we concern. 8456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall dlclose(implLib); 8556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // XXX - we do not dlclose the driver library, so its not initialized when 8756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // later loaded by android - is this required? 8856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGD("loading %s into %s complete\n", implLibName, driverLibName); 8956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 9056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 9156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 9256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 9356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic gl_wrapper_context_t *getGLContext() 9456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 9556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return g_gl_dispatch; 9656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 9756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 9856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic gl2_wrapper_context_t *getGL2Context() 9956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 10056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return g_gl2_dispatch; 10156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 10256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 10356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallconst char *getProcName() 10456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 10556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall static const char *procname = NULL; 10656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 10756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (procname == NULL) { 10856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall const char *str = get_process_name(); 10956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (strcmp(str, "unknown") != 0) { 11056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall procname = str; 11156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } else { 11256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // we need to obtain our process name from the command line; 11356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall FILE *fp = fopen("/proc/self/cmdline", "rt"); 11456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (fp == NULL) { 11556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("couldn't open /proc/self/cmdline\n"); 11656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 11756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 11856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 11956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall char line[1000]; 12056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (fgets(line, sizeof(line), fp) == NULL) { 12156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("couldn't read the self cmdline from \n"); 12256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall fclose(fp); 12356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 12456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 12556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall fclose(fp); 12656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 12756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (line[0] == '\0') { 12856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("cmdline is empty\n"); 12956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 13056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 13156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 13256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //obtain the basename; 13356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall line[sizeof(line) - 1] = '\0'; 13456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall char *p = line; 13556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall while (*p != '\0' && 13656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *p != '\t' && 13756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *p != ' ' && 13856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *p != '\n') { 13956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall p++; 14056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 14156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 14256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *p = '\0'; p--; 14356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall while (p > line && *p != '/') p--; 14456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (*p == '/') p++; 14556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall procname = strdup(p); 14656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 14756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 14856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 14956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return procname; 15056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 15156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 15256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 15356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 15456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallbool isNeedEncode() 15556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 15656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall const char *procname = getProcName(); 15756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (procname == NULL) return false; 15856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGD("isNeedEncode? for %s\n", procname); 15956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // check on our whitelist 16056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall FILE *fp = fopen(GLES_EMUL_TARGETS_FILE, "rt"); 16156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (fp == NULL) { 16256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("couldn't open %s\n", GLES_EMUL_TARGETS_FILE); 16356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return false; 16456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 16556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 16656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall char line[100]; 16756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall bool found = false; 16856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall size_t procnameLen = strlen(procname); 16956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 17056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall while (fgets(line, sizeof(line), fp) != NULL) { 17156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (strlen(line) >= procnameLen && 17256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall !strncmp(procname, line, procnameLen)) { 17356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall char c = line[procnameLen]; 17456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (c == '\0' || c == ' ' || c == '\t' || c == '\n') { 17556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall found = true; 17656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGD("should use encoder for %s\n", procname); 17756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 17856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 17956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 18056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 18156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall fclose(fp); 18256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return found; 18356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 18456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 18556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid initDispatchTables() 18656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 18756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 18856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // Load our back-end implementation of EGL/GLES 18956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 19056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGD("Loading egl dispatch for %s\n", getProcName()); 19156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 19256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void *gles_android = dlopen("/system/lib/egl/libGLES_android.so", RTLD_NOW | RTLD_LOCAL); 19356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!gles_android) { 19456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall fprintf(stderr,"FATAL ERROR: Could not load libGLES_android lib\n"); 19556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall exit(-1); 19656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 19756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 19856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 19956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // Load back-end EGL implementation library 20056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 20156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_dispatch = create_egl_dispatch( gles_android ); 20256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!s_dispatch) { 20356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall fprintf(stderr,"FATAL ERROR: Could not create egl dispatch\n"); 20456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall exit(-1); 20556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 20656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 20756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 20856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // initialize gles 20956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 21056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_needEncode = isNeedEncode(); 21156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void *gles_encoder = NULL; 21256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (s_needEncode) { 21356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // initialize a connection to the server, and the GLESv1/v2 encoders; 21456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ServerConnection * connection = ServerConnection::s_getServerConnection(); 21556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (connection == NULL) { 21656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("couldn't create server connection\n"); 21756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_needEncode = false; 21856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 21956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 220