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#include <stdio.h>
1756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <stdlib.h>
1856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ServerConnection.h"
1956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "TcpStream.h"
2056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "QemuPipeStream.h"
2156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <cutils/log.h>
2256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ThreadInfo.h"
2356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
2456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallgl_client_context_t *ServerConnection::s_getGlContext()
2556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
2656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    EGLThreadInfo *ti = getEGLThreadInfo();
2756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (ti->serverConn) {
2856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return ti->serverConn->m_glEnc;
2956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
3056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return NULL;
3156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
3256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
3356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallgl2_client_context_t *ServerConnection::s_getGl2Context()
3456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
3556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    EGLThreadInfo *ti = getEGLThreadInfo();
3656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (ti->serverConn) {
3756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return ti->serverConn->m_gl2Enc;
3856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
3956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return NULL;
4056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
4156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
4256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallServerConnection *ServerConnection::s_getServerConnection()
4356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
4456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    EGLThreadInfo *ti = getEGLThreadInfo();
4556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (!ti->serverConn)
4656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    {
4756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ti->serverConn = new ServerConnection();
4856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (ti->serverConn->create() < 0) {
4956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            delete ti->serverConn;
5056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ti->serverConn = NULL;
5156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
5256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
5356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return ti->serverConn;
5556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
5656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallServerConnection::ServerConnection() :
5956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_stream(NULL),
6056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glEnc(NULL),
6156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_ut_enc(NULL)
6256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
6356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
6456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
6556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallServerConnection::~ServerConnection()
6656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
6756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    delete m_ut_enc;
6856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    delete m_glEnc;
6956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    delete m_stream;
7056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
7156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
7256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
7356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
7456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallint ServerConnection::create(size_t bufsize,
7556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                             const char *defaultServer)
7656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
7756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    /* XXX: Make configurable through system property */
7856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int useQemuPipe = 1;
7956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (m_stream != NULL) delete(m_stream);
8156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (useQemuPipe) {
8356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        QemuPipeStream*  pipeStream = new QemuPipeStream(bufsize);
8456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (pipeStream->connect() < 0) {
8656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ALOGE("couldn't connect to host server\n");
8756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            delete pipeStream;
8856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            return -1;
8956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
9056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        m_stream = pipeStream;
9156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
9256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    else /* !useQemuPipe */
9356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    {
9456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        TcpStream*  tcpStream = new TcpStream(bufsize);
9556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
9656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        char *s = getenv(ENV_RGL_SERVER);
9756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        char *hostname;
9856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (s == NULL) {
9956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            hostname = strdup(defaultServer);
10056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        } else {
10156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            hostname = strdup(s);
10256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
10356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
10456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (tcpStream->connect(hostname, CODEC_SERVER_PORT) < 0) {
10556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ALOGE("couldn't connect to %s\n", hostname);
10656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            free(hostname);
10756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            delete tcpStream;
10856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            return -1;
10956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
11056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        LOGI("connecting to server %s\n", hostname);
11156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        free(hostname);
11256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
11356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        m_stream = tcpStream;
11456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
11556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
11656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glEnc = new GLEncoder(m_stream);
11756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glEnc->setContextAccessor(s_getGlContext);
11856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
11956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_gl2Enc = new GL2Encoder(m_stream);
12056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_gl2Enc->setContextAccessor(s_getGl2Context);
12156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
12256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_ut_enc = new ut_rendercontrol_encoder_context_t(m_stream);
12356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return 0;
12456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
12556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
126