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