• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "GLEncoder.h"
17 #include "glUtils.h"
18 #include "FixedBuffer.h"
19 #include <cutils/log.h>
20 #include <assert.h>
21 
22 static GLubyte *gVendorString= (GLubyte *) "Android";
23 static GLubyte *gRendererString= (GLubyte *) "Android HW-GLES 1.0";
24 static GLubyte *gVersionString= (GLubyte *) "OpenGL ES-CM 1.0";
25 static GLubyte *gExtensionsString= (GLubyte *) ""; // no extensions at this point;
26 
27 #define DEFINE_AND_VALIDATE_HOST_CONNECTION(ret) \
28     HostConnection *hostCon = HostConnection::get(); \
29     if (!hostCon) { \
30         LOGE("egl: Failed to get host connection\n"); \
31         return ret; \
32     } \
33     renderControl_encoder_context_t *rcEnc = hostCon->rcEncoder(); \
34     if (!rcEnc) { \
35         LOGE("egl: Failed to get renderControl encoder context\n"); \
36         return ret; \
37     }
38 
39 #define SET_ERROR_IF(condition,err) if((condition)) {                            \
40         LOGE("%s:%s:%d GL error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
41         ctx->setError(err);                                    \
42         return;                                                  \
43     }
44 
45 
46 #define RET_AND_SET_ERROR_IF(condition,err,ret) if((condition)) {                \
47         LOGE("%s:%s:%d GL error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
48         ctx->setError(err);                                    \
49         return ret;                                              \
50     }
51 
s_glGetError(void * self)52 GLenum GLEncoder::s_glGetError(void * self)
53 {
54     GLEncoder *ctx = (GLEncoder *)self;
55     GLenum err = ctx->getError();
56     if(err != GL_NO_ERROR) {
57         ctx->setError(GL_NO_ERROR);
58         return err;
59     }
60 
61     return ctx->m_glGetError_enc(self);
62 
63 }
64 
getCompressedTextureFormats()65 GLint * GLEncoder::getCompressedTextureFormats()
66 {
67     if (m_compressedTextureFormats == NULL) {
68         this->glGetIntegerv(this, GL_NUM_COMPRESSED_TEXTURE_FORMATS,
69                             &m_num_compressedTextureFormats);
70         if (m_num_compressedTextureFormats > 0) {
71             // get number of texture formats;
72             m_compressedTextureFormats = new GLint[m_num_compressedTextureFormats];
73             this->glGetCompressedTextureFormats(this, m_num_compressedTextureFormats, m_compressedTextureFormats);
74         }
75     }
76     return m_compressedTextureFormats;
77 }
78 
s_glGetIntegerv(void * self,GLenum param,GLint * ptr)79 void GLEncoder::s_glGetIntegerv(void *self, GLenum param, GLint *ptr)
80 {
81     GLEncoder *ctx = (GLEncoder *)self;
82     assert(ctx->m_state != NULL);
83     if (param == GL_COMPRESSED_TEXTURE_FORMATS) {
84         GLint * compressedTextureFormats = ctx->getCompressedTextureFormats();
85         if (ctx->m_num_compressedTextureFormats > 0 && compressedTextureFormats != NULL) {
86             memcpy(ptr, compressedTextureFormats, ctx->m_num_compressedTextureFormats * sizeof(GLint));
87         }
88     }
89     else if (!ctx->m_state->getClientStateParameter<GLint>(param,ptr)) {
90         ctx->m_glGetIntegerv_enc(self, param, ptr);
91     }
92 }
93 
s_glGetFloatv(void * self,GLenum param,GLfloat * ptr)94 void GLEncoder::s_glGetFloatv(void *self, GLenum param, GLfloat *ptr)
95 {
96     GLEncoder *ctx = (GLEncoder *)self;
97     assert(ctx->m_state != NULL);
98     if (param == GL_COMPRESSED_TEXTURE_FORMATS) {
99         GLint * compressedTextureFormats = ctx->getCompressedTextureFormats();
100         if (ctx->m_num_compressedTextureFormats > 0 && compressedTextureFormats != NULL) {
101             for (int i = 0; i < ctx->m_num_compressedTextureFormats; i++) {
102                 ptr[i] = (GLfloat) compressedTextureFormats[i];
103             }
104         }
105     }
106     else if (!ctx->m_state->getClientStateParameter<GLfloat>(param,ptr)) {
107         ctx->m_glGetFloatv_enc(self, param, ptr);
108     }
109 }
110 
s_glGetFixedv(void * self,GLenum param,GLfixed * ptr)111 void GLEncoder::s_glGetFixedv(void *self, GLenum param, GLfixed *ptr)
112 {
113     GLEncoder *ctx = (GLEncoder *)self;
114     assert(ctx->m_state != NULL);
115     if (param == GL_COMPRESSED_TEXTURE_FORMATS) {
116         GLint * compressedTextureFormats = ctx->getCompressedTextureFormats();
117         if (ctx->m_num_compressedTextureFormats > 0 && compressedTextureFormats != NULL) {
118             for (int i = 0; i < ctx->m_num_compressedTextureFormats; i++) {
119                 ptr[i] =  compressedTextureFormats[i] << 16;
120             }
121         }
122     }
123     else if (!ctx->m_state->getClientStateParameter<GLfixed>(param,ptr)) {
124         ctx->m_glGetFixedv_enc(self, param, ptr);
125     }
126 }
127 
s_glGetBooleanv(void * self,GLenum param,GLboolean * ptr)128 void GLEncoder::s_glGetBooleanv(void *self, GLenum param, GLboolean *ptr)
129 {
130     GLEncoder *ctx = (GLEncoder *)self;
131     assert(ctx->m_state != NULL);
132     if (param == GL_COMPRESSED_TEXTURE_FORMATS) {
133         // ignore the command, although we should have generated a GLerror;
134     }
135     else if (!ctx->m_state->getClientStateParameter<GLboolean>(param,ptr)) {
136         ctx->m_glGetBooleanv_enc(self, param, ptr);
137     }
138 }
139 
s_glGetPointerv(void * self,GLenum param,GLvoid ** params)140 void GLEncoder::s_glGetPointerv(void * self, GLenum param, GLvoid **params)
141 {
142     GLEncoder * ctx = (GLEncoder *) self;
143     assert(ctx->m_state != NULL);
144     ctx->m_state->getClientStatePointer(param,params);
145 }
146 
s_glFlush(void * self)147 void GLEncoder::s_glFlush(void *self)
148 {
149     GLEncoder *ctx = (GLEncoder *)self;
150     ctx->m_glFlush_enc(self);
151     ctx->m_stream->flush();
152 }
153 
s_glGetString(void * self,GLenum name)154 const GLubyte *GLEncoder::s_glGetString(void *self, GLenum name)
155 {
156     GLubyte *retval =  (GLubyte *) "";
157     switch(name) {
158     case GL_VENDOR:
159         retval = gVendorString;
160         break;
161     case GL_RENDERER:
162         retval = gRendererString;
163         break;
164     case GL_VERSION:
165         retval = gVersionString;
166         break;
167     case GL_EXTENSIONS:
168         retval = gExtensionsString;
169         break;
170     }
171     return retval;
172 }
173 
s_glPixelStorei(void * self,GLenum param,GLint value)174 void GLEncoder::s_glPixelStorei(void *self, GLenum param, GLint value)
175 {
176     GLEncoder *ctx = (GLEncoder *)self;
177     ctx->m_glPixelStorei_enc(ctx, param, value);
178     LOG_ASSERT(ctx->m_state, "GLEncoder::s_glPixelStorei");
179     ctx->m_state->setPixelStore(param, value);
180 }
181 
s_glVertexPointer(void * self,int size,GLenum type,GLsizei stride,const void * data)182 void GLEncoder::s_glVertexPointer(void *self, int size, GLenum type, GLsizei stride, const void *data)
183 {
184     GLEncoder *ctx = (GLEncoder *)self;
185     assert(ctx->m_state != NULL);
186     ctx->m_state->setState(GLClientState::VERTEX_LOCATION, size, type, false, stride, data);
187 }
188 
s_glNormalPointer(void * self,GLenum type,GLsizei stride,const void * data)189 void GLEncoder::s_glNormalPointer(void *self, GLenum type, GLsizei stride, const void *data)
190 {
191     GLEncoder *ctx = (GLEncoder *)self;
192     assert(ctx->m_state != NULL);
193     ctx->m_state->setState(GLClientState::NORMAL_LOCATION, 3, type, false, stride, data);
194 }
195 
s_glColorPointer(void * self,int size,GLenum type,GLsizei stride,const void * data)196 void GLEncoder::s_glColorPointer(void *self, int size, GLenum type, GLsizei stride, const void *data)
197 {
198     GLEncoder *ctx = (GLEncoder *)self;
199     assert(ctx->m_state != NULL);
200     ctx->m_state->setState(GLClientState::COLOR_LOCATION, size, type, false, stride, data);
201 }
202 
s_glPointsizePointer(void * self,GLenum type,GLsizei stride,const void * data)203 void GLEncoder::s_glPointsizePointer(void *self, GLenum type, GLsizei stride, const void *data)
204 {
205     GLEncoder *ctx = (GLEncoder *)self;
206     assert(ctx->m_state != NULL);
207     ctx->m_state->setState(GLClientState::POINTSIZE_LOCATION, 1, type, false, stride, data);
208 }
209 
s_glClientActiveTexture(void * self,GLenum texture)210 void GLEncoder::s_glClientActiveTexture(void *self, GLenum texture)
211 {
212     GLEncoder *ctx = (GLEncoder *)self;
213     assert(ctx->m_state != NULL);
214     ctx->m_state->setActiveTexture(texture - GL_TEXTURE0);
215 }
216 
s_glTexcoordPointer(void * self,int size,GLenum type,GLsizei stride,const void * data)217 void GLEncoder::s_glTexcoordPointer(void *self, int size, GLenum type, GLsizei stride, const void *data)
218 {
219     GLEncoder *ctx = (GLEncoder *)self;
220     assert(ctx->m_state != NULL);
221     int loc = ctx->m_state->getLocation(GL_TEXTURE_COORD_ARRAY);
222     ctx->m_state->setState(loc, size, type, false, stride, data);
223 }
224 
s_glMatrixIndexPointerOES(void * self,int size,GLenum type,GLsizei stride,const void * data)225 void GLEncoder::s_glMatrixIndexPointerOES(void *self, int size, GLenum type, GLsizei stride, const void * data)
226 {
227     GLEncoder *ctx = (GLEncoder *)self;
228     assert(ctx->m_state != NULL);
229     int loc = ctx->m_state->getLocation(GL_MATRIX_INDEX_ARRAY_OES);
230     ctx->m_state->setState(loc, size, type, false, stride, data);
231 }
232 
s_glWeightPointerOES(void * self,int size,GLenum type,GLsizei stride,const void * data)233 void GLEncoder::s_glWeightPointerOES(void * self, int size, GLenum type, GLsizei stride, const void * data)
234 {
235     GLEncoder *ctx = (GLEncoder *)self;
236     assert(ctx->m_state != NULL);
237     int loc = ctx->m_state->getLocation(GL_WEIGHT_ARRAY_OES);
238     ctx->m_state->setState(loc, size, type, false, stride, data);
239 }
240 
s_glEnableClientState(void * self,GLenum state)241 void GLEncoder::s_glEnableClientState(void *self, GLenum state)
242 {
243     GLEncoder *ctx = (GLEncoder *) self;
244     assert(ctx->m_state != NULL);
245     int loc = ctx->m_state->getLocation(state);
246     ctx->m_state->enable(loc, 1);
247 }
248 
s_glDisableClientState(void * self,GLenum state)249 void GLEncoder::s_glDisableClientState(void *self, GLenum state)
250 {
251     GLEncoder *ctx = (GLEncoder *) self;
252     assert(ctx->m_state != NULL);
253     int loc = ctx->m_state->getLocation(state);
254     ctx->m_state->enable(loc, 0);
255 }
256 
s_glIsEnabled(void * self,GLenum cap)257 GLboolean GLEncoder::s_glIsEnabled(void *self, GLenum cap)
258 {
259     GLEncoder *ctx = (GLEncoder *) self;
260     assert(ctx->m_state != NULL);
261     int loc = ctx->m_state->getLocation(cap);
262     const GLClientState::VertexAttribState *state = ctx->m_state->getState(loc);
263 
264     if (state!=NULL)
265       return state->enabled;
266 
267     return ctx->m_glIsEnabled_enc(self,cap);
268 }
269 
s_glBindBuffer(void * self,GLenum target,GLuint id)270 void GLEncoder::s_glBindBuffer(void *self, GLenum target, GLuint id)
271 {
272     GLEncoder *ctx = (GLEncoder *) self;
273     assert(ctx->m_state != NULL);
274     ctx->m_state->bindBuffer(target, id);
275     // TODO set error state if needed;
276     ctx->m_glBindBuffer_enc(self, target, id);
277 }
278 
s_glBufferData(void * self,GLenum target,GLsizeiptr size,const GLvoid * data,GLenum usage)279 void GLEncoder::s_glBufferData(void * self, GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
280 {
281     GLEncoder *ctx = (GLEncoder *) self;
282     GLuint bufferId = ctx->m_state->getBuffer(target);
283     SET_ERROR_IF(bufferId==0, GL_INVALID_OPERATION);
284     SET_ERROR_IF(size<0, GL_INVALID_VALUE);
285 
286     ctx->m_shared->updateBufferData(bufferId, size, (void*)data);
287     ctx->m_glBufferData_enc(self, target, size, data, usage);
288 }
289 
s_glBufferSubData(void * self,GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid * data)290 void GLEncoder::s_glBufferSubData(void * self, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data)
291 {
292     GLEncoder *ctx = (GLEncoder *) self;
293     GLuint bufferId = ctx->m_state->getBuffer(target);
294     SET_ERROR_IF(bufferId==0, GL_INVALID_OPERATION);
295 
296     GLenum res = ctx->m_shared->subUpdateBufferData(bufferId, offset, size, (void*)data);
297     SET_ERROR_IF(res, res);
298 
299     ctx->m_glBufferSubData_enc(self, target, offset, size, data);
300 }
301 
s_glDeleteBuffers(void * self,GLsizei n,const GLuint * buffers)302 void GLEncoder::s_glDeleteBuffers(void * self, GLsizei n, const GLuint * buffers)
303 {
304     GLEncoder *ctx = (GLEncoder *) self;
305     SET_ERROR_IF(n<0, GL_INVALID_VALUE);
306     for (int i=0; i<n; i++) {
307         ctx->m_shared->deleteBufferData(buffers[i]);
308         ctx->m_glDeleteBuffers_enc(self,1,&buffers[i]);
309     }
310 }
311 
sendVertexData(unsigned int first,unsigned int count)312 void GLEncoder::sendVertexData(unsigned int first, unsigned int count)
313 {
314     assert(m_state != NULL);
315     for (int i = 0; i < GLClientState::LAST_LOCATION; i++) {
316         bool enableDirty;
317         const GLClientState::VertexAttribState *state = m_state->getStateAndEnableDirty(i, &enableDirty);
318 
319         // do not process if state not valid
320         if (!state) continue;
321 
322         // do not send disable state if state was already disabled
323         if (!enableDirty && !state->enabled) continue;
324 
325         if ( i >= GLClientState::TEXCOORD0_LOCATION &&
326             i <= GLClientState::TEXCOORD7_LOCATION ) {
327             m_glClientActiveTexture_enc(this, GL_TEXTURE0 + i - GLClientState::TEXCOORD0_LOCATION);
328         }
329 
330         if (state->enabled) {
331 
332             if (enableDirty)
333                 m_glEnableClientState_enc(this, state->glConst);
334 
335             unsigned int datalen = state->elementSize * count;
336             int stride = state->stride;
337             if (stride == 0) stride = state->elementSize;
338             int firstIndex = stride * first;
339 
340             if (state->bufferObject == 0) {
341 
342                 switch(i) {
343                 case GLClientState::VERTEX_LOCATION:
344                     this->glVertexPointerData(this, state->size, state->type, state->stride,
345                                               (unsigned char *)state->data + firstIndex, datalen);
346                     break;
347                 case GLClientState::NORMAL_LOCATION:
348                     this->glNormalPointerData(this, state->type, state->stride,
349                                               (unsigned char *)state->data + firstIndex, datalen);
350                     break;
351                 case GLClientState::COLOR_LOCATION:
352                     this->glColorPointerData(this, state->size, state->type, state->stride,
353                                              (unsigned char *)state->data + firstIndex, datalen);
354                     break;
355                 case GLClientState::TEXCOORD0_LOCATION:
356                 case GLClientState::TEXCOORD1_LOCATION:
357                 case GLClientState::TEXCOORD2_LOCATION:
358                 case GLClientState::TEXCOORD3_LOCATION:
359                 case GLClientState::TEXCOORD4_LOCATION:
360                 case GLClientState::TEXCOORD5_LOCATION:
361                 case GLClientState::TEXCOORD6_LOCATION:
362                 case GLClientState::TEXCOORD7_LOCATION:
363                     this->glTexCoordPointerData(this, i - GLClientState::TEXCOORD0_LOCATION, state->size, state->type, state->stride,
364                                                 (unsigned char *)state->data + firstIndex, datalen);
365                     break;
366                 case GLClientState::POINTSIZE_LOCATION:
367                     this->glPointSizePointerData(this, state->type, state->stride,
368                                                  (unsigned char *) state->data + firstIndex, datalen);
369                     break;
370                 case GLClientState::WEIGHT_LOCATION:
371                     this->glWeightPointerData(this, state->size, state->type, state->stride,
372                                               (unsigned char * ) state->data + firstIndex, datalen);
373                     break;
374                 case GLClientState::MATRIXINDEX_LOCATION:
375                     this->glMatrixIndexPointerData(this, state->size, state->type, state->stride,
376                                                   (unsigned char *)state->data + firstIndex, datalen);
377                     break;
378                 }
379             } else {
380                 this->m_glBindBuffer_enc(this, GL_ARRAY_BUFFER, state->bufferObject);
381 
382                 switch(i) {
383                 case GLClientState::VERTEX_LOCATION:
384                     this->glVertexPointerOffset(this, state->size, state->type, state->stride,
385                                                 (GLuint)state->data + firstIndex);
386                     break;
387                 case GLClientState::NORMAL_LOCATION:
388                     this->glNormalPointerOffset(this, state->type, state->stride,
389                                                 (GLuint) state->data + firstIndex);
390                     break;
391                 case GLClientState::POINTSIZE_LOCATION:
392                     this->glPointSizePointerOffset(this, state->type, state->stride,
393                                                    (GLuint) state->data + firstIndex);
394                     break;
395                 case GLClientState::COLOR_LOCATION:
396                     this->glColorPointerOffset(this, state->size, state->type, state->stride,
397                                                (GLuint) state->data + firstIndex);
398                     break;
399                 case GLClientState::TEXCOORD0_LOCATION:
400                 case GLClientState::TEXCOORD1_LOCATION:
401                 case GLClientState::TEXCOORD2_LOCATION:
402                 case GLClientState::TEXCOORD3_LOCATION:
403                 case GLClientState::TEXCOORD4_LOCATION:
404                 case GLClientState::TEXCOORD5_LOCATION:
405                 case GLClientState::TEXCOORD6_LOCATION:
406                 case GLClientState::TEXCOORD7_LOCATION:
407                     this->glTexCoordPointerOffset(this, state->size, state->type, state->stride,
408                                                   (GLuint) state->data + firstIndex);
409                     break;
410                 case GLClientState::WEIGHT_LOCATION:
411                     this->glWeightPointerOffset(this,state->size,state->type,state->stride,
412                                                 (GLuint)state->data+firstIndex);
413                     break;
414                 case GLClientState::MATRIXINDEX_LOCATION:
415                     this->glMatrixIndexPointerOffset(this,state->size,state->type,state->stride,
416                                               (GLuint)state->data+firstIndex);
417                     break;
418                 }
419                 this->m_glBindBuffer_enc(this, GL_ARRAY_BUFFER, m_state->currentArrayVbo());
420             }
421         } else {
422             this->m_glDisableClientState_enc(this, state->glConst);
423         }
424     }
425 }
426 
s_glDrawArrays(void * self,GLenum mode,GLint first,GLsizei count)427 void GLEncoder::s_glDrawArrays(void *self, GLenum mode, GLint first, GLsizei count)
428 {
429     GLEncoder *ctx = (GLEncoder *)self;
430 
431     ctx->sendVertexData(first, count);
432     ctx->m_glDrawArrays_enc(ctx, mode, /*first*/ 0, count);
433 }
434 
s_glDrawElements(void * self,GLenum mode,GLsizei count,GLenum type,const void * indices)435 void GLEncoder::s_glDrawElements(void *self, GLenum mode, GLsizei count, GLenum type, const void *indices)
436 {
437 
438     GLEncoder *ctx = (GLEncoder *)self;
439     assert(ctx->m_state != NULL);
440     SET_ERROR_IF(count<0, GL_INVALID_VALUE);
441 
442     bool has_immediate_arrays = false;
443     bool has_indirect_arrays = false;
444 
445     for (int i = 0; i < GLClientState::LAST_LOCATION; i++) {
446         const GLClientState::VertexAttribState *state = ctx->m_state->getState(i);
447         if (state->enabled) {
448             if (state->bufferObject != 0) {
449                 has_indirect_arrays = true;
450             } else {
451                 has_immediate_arrays = true;
452             }
453         }
454     }
455 
456     if (!has_immediate_arrays && !has_indirect_arrays) {
457         LOGE("glDrawElements: no data bound to the command - ignoring\n");
458         return;
459     }
460 
461     bool adjustIndices = true;
462     if (ctx->m_state->currentIndexVbo() != 0) {
463         if (!has_immediate_arrays) {
464             ctx->sendVertexData(0, count);
465             ctx->m_glBindBuffer_enc(self, GL_ELEMENT_ARRAY_BUFFER, ctx->m_state->currentIndexVbo());
466             ctx->glDrawElementsOffset(ctx, mode, count, type, (GLuint)indices);
467             adjustIndices = false;
468         } else {
469             BufferData * buf = ctx->m_shared->getBufferData(ctx->m_state->currentIndexVbo());
470             ctx->m_glBindBuffer_enc(self, GL_ELEMENT_ARRAY_BUFFER, 0);
471             indices = (void*)((GLintptr)buf->m_fixedBuffer.ptr() + (GLintptr)indices);
472         }
473     }
474     if (adjustIndices) {
475         void *adjustedIndices = (void*)indices;
476         int minIndex = 0, maxIndex = 0;
477 
478         switch(type) {
479         case GL_BYTE:
480         case GL_UNSIGNED_BYTE:
481             GLUtils::minmax<unsigned char>((unsigned char *)indices, count, &minIndex, &maxIndex);
482             if (minIndex != 0) {
483                 adjustedIndices =  ctx->m_fixedBuffer.alloc(glSizeof(type) * count);
484                 GLUtils::shiftIndices<unsigned char>((unsigned char *)indices,
485                                                  (unsigned char *)adjustedIndices,
486                                                  count, -minIndex);
487             }
488             break;
489         case GL_SHORT:
490         case GL_UNSIGNED_SHORT:
491             GLUtils::minmax<unsigned short>((unsigned short *)indices, count, &minIndex, &maxIndex);
492             if (minIndex != 0) {
493                 adjustedIndices = ctx->m_fixedBuffer.alloc(glSizeof(type) * count);
494                 GLUtils::shiftIndices<unsigned short>((unsigned short *)indices,
495                                                  (unsigned short *)adjustedIndices,
496                                                  count, -minIndex);
497             }
498             break;
499         default:
500             LOGE("unsupported index buffer type %d\n", type);
501         }
502         if (has_indirect_arrays || 1) {
503             ctx->sendVertexData(minIndex, maxIndex - minIndex + 1);
504             ctx->glDrawElementsData(ctx, mode, count, type, adjustedIndices,
505                                       count * glSizeof(type));
506             // XXX - OPTIMIZATION (see the other else branch) should be implemented
507             if(!has_indirect_arrays) {
508                 //LOGD("unoptimized drawelements !!!\n");
509             }
510         } else {
511             // we are all direct arrays and immidate mode index array -
512             // rebuild the arrays and the index array;
513             LOGE("glDrawElements: direct index & direct buffer data - will be implemented in later versions;\n");
514         }
515     }
516 }
517 
GLEncoder(IOStream * stream)518 GLEncoder::GLEncoder(IOStream *stream) : gl_encoder_context_t(stream)
519 {
520     m_initialized = false;
521     m_state = NULL;
522     m_error = GL_NO_ERROR;
523     m_num_compressedTextureFormats = 0;
524     m_compressedTextureFormats = NULL;
525     // overrides;
526     m_glFlush_enc = set_glFlush(s_glFlush);
527     m_glPixelStorei_enc = set_glPixelStorei(s_glPixelStorei);
528     m_glVertexPointer_enc = set_glVertexPointer(s_glVertexPointer);
529     m_glNormalPointer_enc = set_glNormalPointer(s_glNormalPointer);
530     m_glColorPointer_enc = set_glColorPointer(s_glColorPointer);
531     m_glPointSizePointerOES_enc = set_glPointSizePointerOES(s_glPointsizePointer);
532     m_glClientActiveTexture_enc = set_glClientActiveTexture(s_glClientActiveTexture);
533     m_glTexCoordPointer_enc = set_glTexCoordPointer(s_glTexcoordPointer);
534     m_glMatrixIndexPointerOES_enc = set_glMatrixIndexPointerOES(s_glMatrixIndexPointerOES);
535     m_glWeightPointerOES_enc = set_glWeightPointerOES(s_glWeightPointerOES);
536 
537     m_glGetIntegerv_enc = set_glGetIntegerv(s_glGetIntegerv);
538     m_glGetFloatv_enc = set_glGetFloatv(s_glGetFloatv);
539     m_glGetBooleanv_enc = set_glGetBooleanv(s_glGetBooleanv);
540     m_glGetFixedv_enc = set_glGetFixedv(s_glGetFixedv);
541     m_glGetPointerv_enc = set_glGetPointerv(s_glGetPointerv);
542 
543     m_glBindBuffer_enc = set_glBindBuffer(s_glBindBuffer);
544     m_glBufferData_enc = set_glBufferData(s_glBufferData);
545     m_glBufferSubData_enc = set_glBufferSubData(s_glBufferSubData);
546     m_glDeleteBuffers_enc = set_glDeleteBuffers(s_glDeleteBuffers);
547 
548     m_glEnableClientState_enc = set_glEnableClientState(s_glEnableClientState);
549     m_glDisableClientState_enc = set_glDisableClientState(s_glDisableClientState);
550     m_glIsEnabled_enc = set_glIsEnabled(s_glIsEnabled);
551     m_glDrawArrays_enc = set_glDrawArrays(s_glDrawArrays);
552     m_glDrawElements_enc = set_glDrawElements(s_glDrawElements);
553     set_glGetString(s_glGetString);
554     set_glFinish(s_glFinish);
555     m_glGetError_enc = set_glGetError(s_glGetError);
556 
557 }
558 
~GLEncoder()559 GLEncoder::~GLEncoder()
560 {
561     delete [] m_compressedTextureFormats;
562 }
563 
pixelDataSize(GLsizei width,GLsizei height,GLenum format,GLenum type,int pack)564 size_t GLEncoder::pixelDataSize(GLsizei width, GLsizei height, GLenum format, GLenum type, int pack)
565 {
566     assert(m_state != NULL);
567     return m_state->pixelDataSize(width, height, format, type, pack);
568 }
569 
s_glFinish(void * self)570 void GLEncoder::s_glFinish(void *self)
571 {
572     GLEncoder *ctx = (GLEncoder *)self;
573     ctx->glFinishRoundTrip(self);
574 }
575 
576