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 "RenderThread.h" 17 #include "RenderControl.h" 18 #include "ThreadInfo.h" 19 #include "ReadBuffer.h" 20 #include "TimeUtils.h" 21 #include "GLDispatch.h" 22 #include "GL2Dispatch.h" 23 #include "EGLDispatch.h" 24 #include "FrameBuffer.h" 25 26 #define STREAM_BUFFER_SIZE 4*1024*1024 27 28 RenderThread::RenderThread() : 29 osUtils::Thread(), 30 m_stream(NULL), 31 m_finished(false) 32 { 33 } 34 35 RenderThread::~RenderThread() 36 { 37 delete m_stream; 38 } 39 40 RenderThread *RenderThread::create(IOStream *p_stream) 41 { 42 RenderThread *rt = new RenderThread(); 43 if (!rt) { 44 return NULL; 45 } 46 47 rt->m_stream = p_stream; 48 49 return rt; 50 } 51 52 int RenderThread::Main() 53 { 54 RenderThreadInfo tInfo; 55 56 // 57 // initialize decoders 58 // 59 tInfo.m_glDec.initGL( gl_dispatch_get_proc_func, NULL ); 60 tInfo.m_gl2Dec.initGL( gl2_dispatch_get_proc_func, NULL ); 61 initRenderControlContext( &m_rcDec ); 62 63 ReadBuffer readBuf(m_stream, STREAM_BUFFER_SIZE); 64 65 int stats_totalBytes = 0; 66 long long stats_t0 = GetCurrentTimeMS(); 67 68 // 69 // open dump file if RENDER_DUMP_DIR is defined 70 // 71 const char *dump_dir = getenv("RENDERER_DUMP_DIR"); 72 FILE *dumpFP = NULL; 73 if (dump_dir) { 74 size_t bsize = strlen(dump_dir) + 32; 75 char *fname = new char[bsize]; 76 snprintf(fname,bsize,"%s/stream_%p", dump_dir, this); 77 dumpFP = fopen(fname, "wb"); 78 if (!dumpFP) { 79 fprintf(stderr,"Warning: stream dump failed to open file %s\n",fname); 80 } 81 delete [] fname; 82 } 83 84 while (1) { 85 86 int stat = readBuf.getData(); 87 if (stat <= 0) { 88 break; 89 } 90 91 // 92 // log received bandwidth statistics 93 // 94 stats_totalBytes += readBuf.validData(); 95 long long dt = GetCurrentTimeMS() - stats_t0; 96 if (dt > 1000) { 97 float dts = (float)dt / 1000.0f; 98 //printf("Used Bandwidth %5.3f MB/s\n", ((float)stats_totalBytes / dts) / (1024.0f*1024.0f)); 99 stats_totalBytes = 0; 100 stats_t0 = GetCurrentTimeMS(); 101 } 102 103 // 104 // dump stream to file if needed 105 // 106 if (dumpFP) { 107 int skip = readBuf.validData() - stat; 108 fwrite(readBuf.buf()+skip, 1, readBuf.validData()-skip, dumpFP); 109 fflush(dumpFP); 110 } 111 112 bool progress; 113 do { 114 progress = false; 115 116 // 117 // try to process some of the command buffer using the GLESv1 decoder 118 // 119 size_t last = tInfo.m_glDec.decode(readBuf.buf(), readBuf.validData(), m_stream); 120 if (last > 0) { 121 progress = true; 122 readBuf.consume(last); 123 } 124 125 // 126 // try to process some of the command buffer using the GLESv2 decoder 127 // 128 last = tInfo.m_gl2Dec.decode(readBuf.buf(), readBuf.validData(), m_stream); 129 if (last > 0) { 130 progress = true; 131 readBuf.consume(last); 132 } 133 134 // 135 // try to process some of the command buffer using the 136 // renderControl decoder 137 // 138 last = m_rcDec.decode(readBuf.buf(), readBuf.validData(), m_stream); 139 if (last > 0) { 140 readBuf.consume(last); 141 progress = true; 142 } 143 144 } while( progress ); 145 146 } 147 148 if (dumpFP) { 149 fclose(dumpFP); 150 } 151 152 // 153 // Release references to the current thread's context/surfaces if any 154 // 155 FrameBuffer::getFB()->bindContext(0, 0, 0); 156 if (tInfo.currContext || tInfo.currDrawSurf || tInfo.currReadSurf) { 157 fprintf(stderr, "ERROR: RenderThread exiting with current context/surfaces\n"); 158 } 159 160 // 161 // flag that this thread has finished execution 162 m_finished = true; 163 164 return 0; 165 } 166