1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #include "HostConnection.h" 17 #include "TcpStream.h" 18 #include "QemuPipeStream.h" 19 #include "ThreadInfo.h" 20 #include <cutils/log.h> 21 #include "GLEncoder.h" 22 #include "GL2Encoder.h" 23 24 #define STREAM_BUFFER_SIZE 4*1024*1024 25 #define STREAM_PORT_NUM 22468 26 27 /* Set to 1 to use a QEMU pipe, or 0 for a TCP connection */ 28 #define USE_QEMU_PIPE 1 29 30 HostConnection::HostConnection() : 31 m_stream(NULL), 32 m_glEnc(NULL), 33 m_gl2Enc(NULL), 34 m_rcEnc(NULL) 35 { 36 } 37 38 HostConnection::~HostConnection() 39 { 40 delete m_stream; 41 delete m_glEnc; 42 delete m_gl2Enc; 43 delete m_rcEnc; 44 } 45 46 HostConnection *HostConnection::get() 47 { 48 /* TODO: Make this configurable with a system property */ 49 const int useQemuPipe = USE_QEMU_PIPE; 50 51 // Get thread info 52 EGLThreadInfo *tinfo = getEGLThreadInfo(); 53 if (!tinfo) { 54 return NULL; 55 } 56 57 if (tinfo->hostConn == NULL) { 58 HostConnection *con = new HostConnection(); 59 if (NULL == con) { 60 return NULL; 61 } 62 63 if (useQemuPipe) { 64 QemuPipeStream *stream = new QemuPipeStream(STREAM_BUFFER_SIZE); 65 if (!stream) { 66 ALOGE("Failed to create QemuPipeStream for host connection!!!\n"); 67 delete con; 68 return NULL; 69 } 70 if (stream->connect() < 0) { 71 ALOGE("Failed to connect to host (QemuPipeStream)!!!\n"); 72 delete stream; 73 delete con; 74 return NULL; 75 } 76 con->m_stream = stream; 77 } 78 else /* !useQemuPipe */ 79 { 80 TcpStream *stream = new TcpStream(STREAM_BUFFER_SIZE); 81 if (!stream) { 82 ALOGE("Failed to create TcpStream for host connection!!!\n"); 83 delete con; 84 return NULL; 85 } 86 87 if (stream->connect("10.0.2.2", STREAM_PORT_NUM) < 0) { 88 ALOGE("Failed to connect to host (TcpStream)!!!\n"); 89 delete stream; 90 delete con; 91 return NULL; 92 } 93 con->m_stream = stream; 94 } 95 96 // send zero 'clientFlags' to the host. 97 unsigned int *pClientFlags = 98 (unsigned int *)con->m_stream->allocBuffer(sizeof(unsigned int)); 99 *pClientFlags = 0; 100 con->m_stream->commitBuffer(sizeof(unsigned int)); 101 102 ALOGD("HostConnection::get() New Host Connection established %p, tid %d\n", con, gettid()); 103 tinfo->hostConn = con; 104 } 105 106 return tinfo->hostConn; 107 } 108 109 GLEncoder *HostConnection::glEncoder() 110 { 111 if (!m_glEnc) { 112 m_glEnc = new GLEncoder(m_stream); 113 DBG("HostConnection::glEncoder new encoder %p, tid %d", m_glEnc, gettid()); 114 m_glEnc->setContextAccessor(s_getGLContext); 115 } 116 return m_glEnc; 117 } 118 119 GL2Encoder *HostConnection::gl2Encoder() 120 { 121 if (!m_gl2Enc) { 122 m_gl2Enc = new GL2Encoder(m_stream); 123 DBG("HostConnection::gl2Encoder new encoder %p, tid %d", m_gl2Enc, gettid()); 124 m_gl2Enc->setContextAccessor(s_getGL2Context); 125 } 126 return m_gl2Enc; 127 } 128 129 renderControl_encoder_context_t *HostConnection::rcEncoder() 130 { 131 if (!m_rcEnc) { 132 m_rcEnc = new renderControl_encoder_context_t(m_stream); 133 } 134 return m_rcEnc; 135 } 136 137 gl_client_context_t *HostConnection::s_getGLContext() 138 { 139 EGLThreadInfo *ti = getEGLThreadInfo(); 140 if (ti->hostConn) { 141 return ti->hostConn->m_glEnc; 142 } 143 return NULL; 144 } 145 146 gl2_client_context_t *HostConnection::s_getGL2Context() 147 { 148 EGLThreadInfo *ti = getEGLThreadInfo(); 149 if (ti->hostConn) { 150 return ti->hostConn->m_gl2Enc; 151 } 152 return NULL; 153 } 154