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 "GLEncoder.h"
1756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "glUtils.h"
1856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "FixedBuffer.h"
1956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <cutils/log.h>
2056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <assert.h>
2156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
2256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#ifndef MIN
2356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define MIN(a, b) ((a) < (b) ? (a) : (b))
2456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#endif
2556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
2656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic GLubyte *gVendorString= (GLubyte *) "Android";
2756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic GLubyte *gRendererString= (GLubyte *) "Android HW-GLES 1.0";
2856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic GLubyte *gVersionString= (GLubyte *) "OpenGL ES-CM 1.0";
2956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic GLubyte *gExtensionsString= (GLubyte *) ""; // no extensions at this point;
3056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
3156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define SET_ERROR_IF(condition,err) if((condition)) {                            \
3256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ALOGE("%s:%s:%d GL error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
3356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->setError(err);                                    \
3456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return;                                                  \
3556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
3656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
3756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
3856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define RET_AND_SET_ERROR_IF(condition,err,ret) if((condition)) {                \
3956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ALOGE("%s:%s:%d GL error 0x%x\n", __FILE__, __FUNCTION__, __LINE__, err); \
4056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->setError(err);                                    \
4156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return ret;                                              \
4256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
4356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
4456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallGLenum GLEncoder::s_glGetError(void * self)
4556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
4656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
4756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum err = ctx->getError();
4856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if(err != GL_NO_ERROR) {
4956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->setError(GL_NO_ERROR);
5056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return err;
5156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
5256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return ctx->m_glGetError_enc(self);
5456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
5656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
5756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallGLint * GLEncoder::getCompressedTextureFormats()
5856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
5956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (m_compressedTextureFormats == NULL) {
6056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        this->glGetIntegerv(this, GL_NUM_COMPRESSED_TEXTURE_FORMATS,
6156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                            &m_num_compressedTextureFormats);
6256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (m_num_compressedTextureFormats > 0) {
6356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // get number of texture formats;
6456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            m_compressedTextureFormats = new GLint[m_num_compressedTextureFormats];
6556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            this->glGetCompressedTextureFormats(this, m_num_compressedTextureFormats, m_compressedTextureFormats);
6656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
6756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
6856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return m_compressedTextureFormats;
6956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
7056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
7156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetIntegerv(void *self, GLenum param, GLint *ptr)
7256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
7356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
7456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
7556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
7656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
7756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch (param) {
7856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_COMPRESSED_TEXTURE_FORMATS: {
7956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint * compressedTextureFormats = ctx->getCompressedTextureFormats();
8056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (ctx->m_num_compressedTextureFormats > 0 &&
8156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                compressedTextureFormats != NULL) {
8256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            memcpy(ptr, compressedTextureFormats,
8356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                   ctx->m_num_compressedTextureFormats * sizeof(GLint));
8456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
8556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
8656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
8756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
8856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_MAX_TEXTURE_UNITS:
8956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetIntegerv_enc(self, param, ptr);
9056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = MIN(*ptr, GLClientState::MAX_TEXTURE_UNITS);
9156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
9256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
9356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_2D:
9456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = state->getBoundTexture(GL_TEXTURE_2D);
9556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
9656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
9756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_EXTERNAL_OES:
9856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = state->getBoundTexture(GL_TEXTURE_EXTERNAL_OES);
9956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
10056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
10156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    default:
10256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!state->getClientStateParameter<GLint>(param,ptr)) {
10356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glGetIntegerv_enc(self, param, ptr);
10456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
10556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
10656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
10756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
10856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
10956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetFloatv(void *self, GLenum param, GLfloat *ptr)
11056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
11156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
11256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
11356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
11456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
11556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch (param) {
11656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_COMPRESSED_TEXTURE_FORMATS: {
11756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint * compressedTextureFormats = ctx->getCompressedTextureFormats();
11856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (ctx->m_num_compressedTextureFormats > 0 &&
11956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                compressedTextureFormats != NULL) {
12056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            for (int i = 0; i < ctx->m_num_compressedTextureFormats; i++) {
12156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ptr[i] = (GLfloat) compressedTextureFormats[i];
12256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
12356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
12456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
12556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
12656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
12756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_MAX_TEXTURE_UNITS:
12856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetFloatv_enc(self, param, ptr);
12956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = MIN(*ptr, (GLfloat)GLClientState::MAX_TEXTURE_UNITS);
13056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
13156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
13256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_2D:
13356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = (GLfloat)state->getBoundTexture(GL_TEXTURE_2D);
13456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
13556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
13656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_EXTERNAL_OES:
13756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = (GLfloat)state->getBoundTexture(GL_TEXTURE_EXTERNAL_OES);
13856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
13956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
14056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    default:
14156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!state->getClientStateParameter<GLfloat>(param,ptr)) {
14256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glGetFloatv_enc(self, param, ptr);
14356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
14456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
14556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
14656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
14756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
14856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetFixedv(void *self, GLenum param, GLfixed *ptr)
14956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
15056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
15156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
15256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
15356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
15456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch (param) {
15556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_COMPRESSED_TEXTURE_FORMATS: {
15656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint * compressedTextureFormats = ctx->getCompressedTextureFormats();
15756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (ctx->m_num_compressedTextureFormats > 0 &&
15856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                compressedTextureFormats != NULL) {
15956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            for (int i = 0; i < ctx->m_num_compressedTextureFormats; i++) {
16056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ptr[i] =  compressedTextureFormats[i] << 16;
16156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
16256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
16356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
16456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
16556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
16656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_MAX_TEXTURE_UNITS:
16756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetFixedv_enc(self, param, ptr);
16856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = MIN(*ptr, GLClientState::MAX_TEXTURE_UNITS << 16);
16956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
17056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
17156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_2D:
17256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = state->getBoundTexture(GL_TEXTURE_2D) << 16;
17356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
17456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
17556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_EXTERNAL_OES:
17656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = state->getBoundTexture(GL_TEXTURE_EXTERNAL_OES) << 16;
17756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
17856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
17956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    default:
18056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!state->getClientStateParameter<GLfixed>(param,ptr)) {
18156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glGetFixedv_enc(self, param, ptr);
18256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
18356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
18456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
18556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
18656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
18756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetBooleanv(void *self, GLenum param, GLboolean *ptr)
18856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
18956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
19056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
19156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
19256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
19356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch (param) {
19456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_COMPRESSED_TEXTURE_FORMATS: {
19556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLint* compressedTextureFormats = ctx->getCompressedTextureFormats();
19656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (ctx->m_num_compressedTextureFormats > 0 &&
19756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                compressedTextureFormats != NULL) {
19856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            for (int i = 0; i < ctx->m_num_compressedTextureFormats; i++) {
19956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ptr[i] = compressedTextureFormats[i] != 0 ? GL_TRUE : GL_FALSE;
20056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
20156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
20256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
20356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
20456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
20556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_2D:
20656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = state->getBoundTexture(GL_TEXTURE_2D) != 0 ? GL_TRUE : GL_FALSE;
20756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
20856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
20956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_BINDING_EXTERNAL_OES:
21056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *ptr = state->getBoundTexture(GL_TEXTURE_EXTERNAL_OES) != 0
21156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ? GL_TRUE : GL_FALSE;
21256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
21356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
21456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    default:
21556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!state->getClientStateParameter<GLboolean>(param,ptr)) {
21656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glGetBooleanv_enc(self, param, ptr);
21756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
21856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
21956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
22056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
22156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
22256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetPointerv(void * self, GLenum param, GLvoid **params)
22356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
22456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder * ctx = (GLEncoder *) self;
22556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
22656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->getClientStatePointer(param,params);
22756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
22856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
22956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glFlush(void *self)
23056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
23156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
23256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glFlush_enc(self);
23356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_stream->flush();
23456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
23556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
23656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallconst GLubyte *GLEncoder::s_glGetString(void *self, GLenum name)
23756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
23856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLubyte *retval =  (GLubyte *) "";
23956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch(name) {
24056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_VENDOR:
24156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        retval = gVendorString;
24256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
24356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_RENDERER:
24456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        retval = gRendererString;
24556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
24656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_VERSION:
24756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        retval = gVersionString;
24856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
24956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_EXTENSIONS:
25056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        retval = gExtensionsString;
25156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
25256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
25356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return retval;
25456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
25556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
25656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glPixelStorei(void *self, GLenum param, GLint value)
25756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
25856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
25956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glPixelStorei_enc(ctx, param, value);
26056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ALOG_ASSERT(ctx->m_state, "GLEncoder::s_glPixelStorei");
26156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setPixelStore(param, value);
26256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
26356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
26456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glVertexPointer(void *self, int size, GLenum type, GLsizei stride, const void *data)
26556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
26656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
26756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
26856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(GLClientState::VERTEX_LOCATION, size, type, false, stride, data);
26956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
27056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
27156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glNormalPointer(void *self, GLenum type, GLsizei stride, const void *data)
27256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
27356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
27456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
27556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(GLClientState::NORMAL_LOCATION, 3, type, false, stride, data);
27656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
27756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
27856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glColorPointer(void *self, int size, GLenum type, GLsizei stride, const void *data)
27956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
28056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
28156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
28256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(GLClientState::COLOR_LOCATION, size, type, false, stride, data);
28356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
28456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
28556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glPointsizePointer(void *self, GLenum type, GLsizei stride, const void *data)
28656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
28756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
28856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
28956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(GLClientState::POINTSIZE_LOCATION, 1, type, false, stride, data);
29056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
29156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
29256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glClientActiveTexture(void *self, GLenum texture)
29356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
29456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
29556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
29656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setActiveTexture(texture - GL_TEXTURE0);
29756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
29856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
29956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexcoordPointer(void *self, int size, GLenum type, GLsizei stride, const void *data)
30056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
30156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
30256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
30356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int loc = ctx->m_state->getLocation(GL_TEXTURE_COORD_ARRAY);
30456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(loc, size, type, false, stride, data);
30556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
30656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
30756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glMatrixIndexPointerOES(void *self, int size, GLenum type, GLsizei stride, const void * data)
30856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
30956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
31056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
31156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int loc = ctx->m_state->getLocation(GL_MATRIX_INDEX_ARRAY_OES);
31256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(loc, size, type, false, stride, data);
31356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
31456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
31556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glWeightPointerOES(void * self, int size, GLenum type, GLsizei stride, const void * data)
31656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
31756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
31856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
31956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int loc = ctx->m_state->getLocation(GL_WEIGHT_ARRAY_OES);
32056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->setState(loc, size, type, false, stride, data);
32156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
32256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
32356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glEnableClientState(void *self, GLenum state)
32456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
32556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
32656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
32756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int loc = ctx->m_state->getLocation(state);
32856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->enable(loc, 1);
32956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
33056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
33156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glDisableClientState(void *self, GLenum state)
33256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
33356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
33456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
33556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int loc = ctx->m_state->getLocation(state);
33656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->enable(loc, 0);
33756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
33856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
33956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallGLboolean GLEncoder::s_glIsEnabled(void *self, GLenum cap)
34056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
34156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
34256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
34356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    int loc = ctx->m_state->getLocation(cap);
34456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState::VertexAttribState *state = ctx->m_state->getState(loc);
34556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
34656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (state!=NULL)
34756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall      return state->enabled;
34856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
34956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return ctx->m_glIsEnabled_enc(self,cap);
35056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
35156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
35256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glBindBuffer(void *self, GLenum target, GLuint id)
35356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
35456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
35556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
35656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_state->bindBuffer(target, id);
35756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    // TODO set error state if needed;
35856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glBindBuffer_enc(self, target, id);
35956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
36056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
36156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glBufferData(void * self, GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
36256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
36356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
36456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLuint bufferId = ctx->m_state->getBuffer(target);
36556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF(bufferId==0, GL_INVALID_OPERATION);
36656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF(size<0, GL_INVALID_VALUE);
36756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
36856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_shared->updateBufferData(bufferId, size, (void*)data);
36956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glBufferData_enc(self, target, size, data, usage);
37056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
37156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
37256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glBufferSubData(void * self, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data)
37356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
37456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
37556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLuint bufferId = ctx->m_state->getBuffer(target);
37656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF(bufferId==0, GL_INVALID_OPERATION);
37756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
37856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum res = ctx->m_shared->subUpdateBufferData(bufferId, offset, size, (void*)data);
37956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF(res, res);
38056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
38156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glBufferSubData_enc(self, target, offset, size, data);
38256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
38356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
38456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glDeleteBuffers(void * self, GLsizei n, const GLuint * buffers)
38556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
38656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *) self;
38756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF(n<0, GL_INVALID_VALUE);
38856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    for (int i=0; i<n; i++) {
38956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_shared->deleteBufferData(buffers[i]);
39056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glDeleteBuffers_enc(self,1,&buffers[i]);
39156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
39256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
39356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
39456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::sendVertexData(unsigned int first, unsigned int count)
39556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
39656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(m_state != NULL);
39756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    for (int i = 0; i < GLClientState::LAST_LOCATION; i++) {
39856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        bool enableDirty;
39956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        const GLClientState::VertexAttribState *state = m_state->getStateAndEnableDirty(i, &enableDirty);
40056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
40156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        // do not process if state not valid
40256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!state) continue;
40356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
40456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        // do not send disable state if state was already disabled
40556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!enableDirty && !state->enabled) continue;
40656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
40756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if ( i >= GLClientState::TEXCOORD0_LOCATION &&
40856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            i <= GLClientState::TEXCOORD7_LOCATION ) {
40956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            m_glClientActiveTexture_enc(this, GL_TEXTURE0 + i - GLClientState::TEXCOORD0_LOCATION);
41056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
41156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
41256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (state->enabled) {
41356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
41456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (enableDirty)
41556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                m_glEnableClientState_enc(this, state->glConst);
41656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
41756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            unsigned int datalen = state->elementSize * count;
41856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            int stride = state->stride;
41956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (stride == 0) stride = state->elementSize;
42056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            int firstIndex = stride * first;
42156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
42256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (state->bufferObject == 0) {
42356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
42456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                switch(i) {
42556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::VERTEX_LOCATION:
42656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glVertexPointerData(this, state->size, state->type, state->stride,
42756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                              (unsigned char *)state->data + firstIndex, datalen);
42856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
42956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::NORMAL_LOCATION:
43056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glNormalPointerData(this, state->type, state->stride,
43156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                              (unsigned char *)state->data + firstIndex, datalen);
43256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
43356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::COLOR_LOCATION:
43456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glColorPointerData(this, state->size, state->type, state->stride,
43556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                             (unsigned char *)state->data + firstIndex, datalen);
43656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
43756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD0_LOCATION:
43856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD1_LOCATION:
43956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD2_LOCATION:
44056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD3_LOCATION:
44156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD4_LOCATION:
44256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD5_LOCATION:
44356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD6_LOCATION:
44456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD7_LOCATION:
44556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glTexCoordPointerData(this, i - GLClientState::TEXCOORD0_LOCATION, state->size, state->type, state->stride,
44656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                (unsigned char *)state->data + firstIndex, datalen);
44756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
44856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::POINTSIZE_LOCATION:
44956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glPointSizePointerData(this, state->type, state->stride,
45056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                 (unsigned char *) state->data + firstIndex, datalen);
45156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
45256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::WEIGHT_LOCATION:
45356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glWeightPointerData(this, state->size, state->type, state->stride,
45456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                              (unsigned char * ) state->data + firstIndex, datalen);
45556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
45656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::MATRIXINDEX_LOCATION:
45756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glMatrixIndexPointerData(this, state->size, state->type, state->stride,
45856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                  (unsigned char *)state->data + firstIndex, datalen);
45956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
46056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                }
46156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            } else {
46256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                this->m_glBindBuffer_enc(this, GL_ARRAY_BUFFER, state->bufferObject);
46356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
46456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                switch(i) {
46556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::VERTEX_LOCATION:
46656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glVertexPointerOffset(this, state->size, state->type, state->stride,
46756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                (GLuint)state->data + firstIndex);
46856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
46956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::NORMAL_LOCATION:
47056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glNormalPointerOffset(this, state->type, state->stride,
47156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                (GLuint) state->data + firstIndex);
47256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
47356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::POINTSIZE_LOCATION:
47456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glPointSizePointerOffset(this, state->type, state->stride,
47556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                   (GLuint) state->data + firstIndex);
47656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
47756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::COLOR_LOCATION:
47856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glColorPointerOffset(this, state->size, state->type, state->stride,
47956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                               (GLuint) state->data + firstIndex);
48056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
48156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD0_LOCATION:
48256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD1_LOCATION:
48356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD2_LOCATION:
48456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD3_LOCATION:
48556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD4_LOCATION:
48656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD5_LOCATION:
48756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD6_LOCATION:
48856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::TEXCOORD7_LOCATION:
48956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glTexCoordPointerOffset(this, state->size, state->type, state->stride,
49056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                  (GLuint) state->data + firstIndex);
49156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
49256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::WEIGHT_LOCATION:
49356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glWeightPointerOffset(this,state->size,state->type,state->stride,
49456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                (GLuint)state->data+firstIndex);
49556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
49656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                case GLClientState::MATRIXINDEX_LOCATION:
49756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    this->glMatrixIndexPointerOffset(this,state->size,state->type,state->stride,
49856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                              (GLuint)state->data+firstIndex);
49956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    break;
50056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                }
50156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                this->m_glBindBuffer_enc(this, GL_ARRAY_BUFFER, m_state->currentArrayVbo());
50256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
50356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        } else {
50456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            this->m_glDisableClientState_enc(this, state->glConst);
50556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
50656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
50756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
50856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
50956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glDrawArrays(void *self, GLenum mode, GLint first, GLsizei count)
51056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
51156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
51256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
51356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->sendVertexData(first, count);
51456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glDrawArrays_enc(ctx, mode, /*first*/ 0, count);
51556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
51656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
51756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glDrawElements(void *self, GLenum mode, GLsizei count, GLenum type, const void *indices)
51856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
51956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
52056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
52156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(ctx->m_state != NULL);
52256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF(count<0, GL_INVALID_VALUE);
52356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
52456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool has_immediate_arrays = false;
52556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool has_indirect_arrays = false;
52656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
52756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    for (int i = 0; i < GLClientState::LAST_LOCATION; i++) {
52856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        const GLClientState::VertexAttribState *state = ctx->m_state->getState(i);
52956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (state->enabled) {
53056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (state->bufferObject != 0) {
53156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                has_indirect_arrays = true;
53256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            } else {
53356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                has_immediate_arrays = true;
53456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
53556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
53656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
53756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
53856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (!has_immediate_arrays && !has_indirect_arrays) {
53956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ALOGE("glDrawElements: no data bound to the command - ignoring\n");
54056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return;
54156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
54256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
54356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    bool adjustIndices = true;
54456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (ctx->m_state->currentIndexVbo() != 0) {
54556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (!has_immediate_arrays) {
54656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->sendVertexData(0, count);
54756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glBindBuffer_enc(self, GL_ELEMENT_ARRAY_BUFFER, ctx->m_state->currentIndexVbo());
54856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->glDrawElementsOffset(ctx, mode, count, type, (GLuint)indices);
54956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            adjustIndices = false;
55056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        } else {
55156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            BufferData * buf = ctx->m_shared->getBufferData(ctx->m_state->currentIndexVbo());
55256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glBindBuffer_enc(self, GL_ELEMENT_ARRAY_BUFFER, 0);
55356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            indices = (void*)((GLintptr)buf->m_fixedBuffer.ptr() + (GLintptr)indices);
55456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
55556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
55656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (adjustIndices) {
55756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        void *adjustedIndices = (void*)indices;
55856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        int minIndex = 0, maxIndex = 0;
55956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
56056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        switch(type) {
56156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        case GL_BYTE:
56256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        case GL_UNSIGNED_BYTE:
56356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GLUtils::minmax<unsigned char>((unsigned char *)indices, count, &minIndex, &maxIndex);
56456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (minIndex != 0) {
56556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                adjustedIndices =  ctx->m_fixedBuffer.alloc(glSizeof(type) * count);
56656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                GLUtils::shiftIndices<unsigned char>((unsigned char *)indices,
56756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                 (unsigned char *)adjustedIndices,
56856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                 count, -minIndex);
56956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
57056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            break;
57156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        case GL_SHORT:
57256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        case GL_UNSIGNED_SHORT:
57356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GLUtils::minmax<unsigned short>((unsigned short *)indices, count, &minIndex, &maxIndex);
57456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (minIndex != 0) {
57556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                adjustedIndices = ctx->m_fixedBuffer.alloc(glSizeof(type) * count);
57656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                GLUtils::shiftIndices<unsigned short>((unsigned short *)indices,
57756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                 (unsigned short *)adjustedIndices,
57856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                                 count, -minIndex);
57956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
58056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            break;
58156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        default:
58256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ALOGE("unsupported index buffer type %d\n", type);
58356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
58456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (has_indirect_arrays || 1) {
58556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->sendVertexData(minIndex, maxIndex - minIndex + 1);
58656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->glDrawElementsData(ctx, mode, count, type, adjustedIndices,
58756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                                      count * glSizeof(type));
58856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // XXX - OPTIMIZATION (see the other else branch) should be implemented
58956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if(!has_indirect_arrays) {
59056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                //ALOGD("unoptimized drawelements !!!\n");
59156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
59256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        } else {
59356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // we are all direct arrays and immidate mode index array -
59456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // rebuild the arrays and the index array;
59556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ALOGE("glDrawElements: direct index & direct buffer data - will be implemented in later versions;\n");
59656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
59756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
59856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
59956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
60056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glActiveTexture(void* self, GLenum texture)
60156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
60256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
60356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
60456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum err;
60556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
60656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if ((err = state->setActiveTextureUnit(texture)) != GL_NO_ERROR) {
60756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ALOGE("%s:%s:%d GL error %#x\n", __FILE__, __FUNCTION__, __LINE__, err);
60856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->setError(err);
60956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return;
61056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
61156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
61256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glActiveTexture_enc(ctx, texture);
61356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
61456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
61556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glBindTexture(void* self, GLenum target, GLuint texture)
61656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
61756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
61856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
61956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum err;
62056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
62156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLboolean firstUse;
62256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if ((err = state->bindTexture(target, texture, &firstUse)) != GL_NO_ERROR) {
62356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ALOGE("%s:%s:%d GL error %#x\n", __FILE__, __FUNCTION__, __LINE__, err);
62456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->setError(err);
62556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return;
62656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
62756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
62856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES) {
62956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glBindTexture_enc(ctx, target, texture);
63056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return;
63156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
63256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
63356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum priorityTarget = state->getPriorityEnabledTarget(GL_TEXTURE_2D);
63456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
63556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_EXTERNAL_OES && firstUse) {
63656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        // set TEXTURE_EXTERNAL_OES default states which differ from TEXTURE_2D
63756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glBindTexture_enc(ctx, GL_TEXTURE_2D, texture);
63856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteri_enc(ctx, GL_TEXTURE_2D,
63956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                GL_TEXTURE_MIN_FILTER, GL_LINEAR);
64056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteri_enc(ctx, GL_TEXTURE_2D,
64156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
64256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteri_enc(ctx, GL_TEXTURE_2D,
64356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
64456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
64556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (target != priorityTarget) {
64656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glBindTexture_enc(ctx, GL_TEXTURE_2D,
64756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    state->getBoundTexture(GL_TEXTURE_2D));
64856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
64956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
65056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
65156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == priorityTarget) {
65256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glBindTexture_enc(ctx, GL_TEXTURE_2D, texture);
65356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
65456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
65556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
65656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glDeleteTextures(void* self, GLsizei n, const GLuint* textures)
65756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
65856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
65956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
66056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
66156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    state->deleteTextures(n, textures);
66256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->m_glDeleteTextures_enc(ctx, n, textures);
66356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
66456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
66556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glDisable(void* self, GLenum cap)
66656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
66756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
66856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
66956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
67056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (cap == GL_TEXTURE_2D || cap == GL_TEXTURE_EXTERNAL_OES) {
67156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum prevTarget = state->getPriorityEnabledTarget(GL_INVALID_ENUM);
67256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        state->disableTextureTarget(cap);
67356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum currTarget = state->getPriorityEnabledTarget(GL_INVALID_ENUM);
67456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
67556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (prevTarget != currTarget) {
67656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (currTarget == GL_INVALID_ENUM) {
67756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ctx->m_glDisable_enc(ctx, GL_TEXTURE_2D);
67856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                currTarget = GL_TEXTURE_2D;
67956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
68056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // maintain the invariant that when TEXTURE_EXTERNAL_OES is
68156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // disabled, the TEXTURE_2D binding is active, even if
68256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            // TEXTURE_2D is also disabled.
68356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glBindTexture_enc(ctx, GL_TEXTURE_2D,
68456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    state->getBoundTexture(currTarget));
68556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
68656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
68756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
68856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glDisable_enc(ctx, cap);
68956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
69056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
69156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
69256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glEnable(void* self, GLenum cap)
69356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
69456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
69556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLClientState* state = ctx->m_state;
69656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
69756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (cap == GL_TEXTURE_2D || cap == GL_TEXTURE_EXTERNAL_OES) {
69856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum prevTarget = state->getPriorityEnabledTarget(GL_INVALID_ENUM);
69956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        state->enableTextureTarget(cap);
70056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum currTarget = state->getPriorityEnabledTarget(GL_INVALID_ENUM);
70156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
70256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (prevTarget != currTarget) {
70356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (prevTarget == GL_INVALID_ENUM) {
70456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ctx->m_glEnable_enc(ctx, GL_TEXTURE_2D);
70556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
70656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            if (currTarget == GL_TEXTURE_EXTERNAL_OES) {
70756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                ctx->m_glBindTexture_enc(ctx, GL_TEXTURE_2D,
70856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                        state->getBoundTexture(currTarget));
70956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            }
71056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
71156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
71256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
71356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glEnable_enc(ctx, cap);
71456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
71556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
71656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
71756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetTexParameterfv(void* self,
71856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, GLfloat* params)
71956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
72056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
72156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
72256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
72356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
72456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
72556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetTexParameterfv_enc(ctx, GL_TEXTURE_2D, pname, params);
72656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
72756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
72856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetTexParameterfv_enc(ctx, target, pname, params);
72956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
73056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
73156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
73256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetTexParameteriv(void* self,
73356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, GLint* params)
73456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
73556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
73656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
73756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
73856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch (pname) {
73956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
74056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        *params = 1;
74156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
74256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
74356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    default:
74456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
74556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->override2DTextureTarget(target);
74656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glGetTexParameteriv_enc(ctx, GL_TEXTURE_2D, pname, params);
74756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->restore2DTextureTarget();
74856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        } else {
74956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            ctx->m_glGetTexParameteriv_enc(ctx, target, pname, params);
75056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        }
75156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        break;
75256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
75356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
75456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
75556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glGetTexParameterxv(void* self,
75656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, GLfixed* params)
75756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
75856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
75956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
76056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
76156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
76256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
76356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetTexParameterxv_enc(ctx, GL_TEXTURE_2D, pname, params);
76456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
76556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
76656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glGetTexParameterxv_enc(ctx, target, pname, params);
76756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
76856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
76956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
77056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic bool isValidTextureExternalParam(GLenum pname, GLenum param)
77156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
77256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    switch (pname) {
77356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_MIN_FILTER:
77456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_MAG_FILTER:
77556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return param == GL_NEAREST || param == GL_LINEAR;
77656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
77756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_WRAP_S:
77856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_TEXTURE_WRAP_T:
77956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return param == GL_CLAMP_TO_EDGE;
78056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
78156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    case GL_GENERATE_MIPMAP:
78256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return param == GL_FALSE;
78356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
78456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    default:
78556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        return true;
78656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
78756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
78856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
78956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexParameterf(void* self,
79056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, GLfloat param)
79156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
79256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
79356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
79456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
79556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF((target == GL_TEXTURE_EXTERNAL_OES &&
79656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            !isValidTextureExternalParam(pname, (GLenum)param)),
79756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GL_INVALID_ENUM);
79856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
79956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
80056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
80156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterf_enc(ctx, GL_TEXTURE_2D, pname, param);
80256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
80356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
80456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterf_enc(ctx, target, pname, param);
80556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
80656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
80756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
80856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexParameterfv(void* self,
80956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, const GLfloat* params)
81056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
81156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
81256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
81356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
81456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF((target == GL_TEXTURE_EXTERNAL_OES &&
81556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            !isValidTextureExternalParam(pname, (GLenum)params[0])),
81656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GL_INVALID_ENUM);
81756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
81856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
81956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
82056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterfv_enc(ctx, GL_TEXTURE_2D, pname, params);
82156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
82256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
82356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterfv_enc(ctx, target, pname, params);
82456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
82556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
82656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
82756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexParameteri(void* self,
82856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, GLint param)
82956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
83056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
83156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
83256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
83356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF((target == GL_TEXTURE_EXTERNAL_OES &&
83456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            !isValidTextureExternalParam(pname, (GLenum)param)),
83556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GL_INVALID_ENUM);
83656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
83756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
83856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
83956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteri_enc(ctx, GL_TEXTURE_2D, pname, param);
84056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
84156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
84256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteri_enc(ctx, target, pname, param);
84356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
84456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
84556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
84656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexParameterx(void* self,
84756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, GLfixed param)
84856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
84956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
85056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
85156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
85256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF((target == GL_TEXTURE_EXTERNAL_OES &&
85356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            !isValidTextureExternalParam(pname, (GLenum)param)),
85456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GL_INVALID_ENUM);
85556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
85656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
85756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
85856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterx_enc(ctx, GL_TEXTURE_2D, pname, param);
85956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
86056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
86156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterx_enc(ctx, target, pname, param);
86256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
86356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
86456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
86556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexParameteriv(void* self,
86656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, const GLint* params)
86756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
86856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
86956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
87056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
87156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF((target == GL_TEXTURE_EXTERNAL_OES &&
87256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            !isValidTextureExternalParam(pname, (GLenum)params[0])),
87356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GL_INVALID_ENUM);
87456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
87556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
87656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
87756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteriv_enc(ctx, GL_TEXTURE_2D, pname, params);
87856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
87956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
88056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameteriv_enc(ctx, target, pname, params);
88156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
88256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
88356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
88456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glTexParameterxv(void* self,
88556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        GLenum target, GLenum pname, const GLfixed* params)
88656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
88756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder* ctx = (GLEncoder*)self;
88856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    const GLClientState* state = ctx->m_state;
88956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
89056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    SET_ERROR_IF((target == GL_TEXTURE_EXTERNAL_OES &&
89156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            !isValidTextureExternalParam(pname, (GLenum)params[0])),
89256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            GL_INVALID_ENUM);
89356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
89456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if (target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) {
89556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->override2DTextureTarget(target);
89656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterxv_enc(ctx, GL_TEXTURE_2D, pname, params);
89756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->restore2DTextureTarget();
89856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    } else {
89956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        ctx->m_glTexParameterxv_enc(ctx, target, pname, params);
90056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
90156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
90256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
90356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::override2DTextureTarget(GLenum target)
90456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
90556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    if ((target == GL_TEXTURE_2D || target == GL_TEXTURE_EXTERNAL_OES) &&
90656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall        target != m_state->getPriorityEnabledTarget(GL_TEXTURE_2D)) {
90756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            m_glBindTexture_enc(this, GL_TEXTURE_2D,
90856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall                    m_state->getBoundTexture(target));
90956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    }
91056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
91156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
91256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::restore2DTextureTarget()
91356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
91456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLenum priorityTarget = m_state->getPriorityEnabledTarget(GL_TEXTURE_2D);
91556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glBindTexture_enc(this, GL_TEXTURE_2D,
91656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall            m_state->getBoundTexture(priorityTarget));
91756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
91856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
91956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallGLEncoder::GLEncoder(IOStream *stream) : gl_encoder_context_t(stream)
92056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
92156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_initialized = false;
92256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_state = NULL;
92356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_error = GL_NO_ERROR;
92456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_num_compressedTextureFormats = 0;
92556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_compressedTextureFormats = NULL;
92656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    // overrides;
92756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glFlush_enc = set_glFlush(s_glFlush);
92856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glPixelStorei_enc = set_glPixelStorei(s_glPixelStorei);
92956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glVertexPointer_enc = set_glVertexPointer(s_glVertexPointer);
93056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glNormalPointer_enc = set_glNormalPointer(s_glNormalPointer);
93156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glColorPointer_enc = set_glColorPointer(s_glColorPointer);
93256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glPointSizePointerOES_enc = set_glPointSizePointerOES(s_glPointsizePointer);
93356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glClientActiveTexture_enc = set_glClientActiveTexture(s_glClientActiveTexture);
93456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexCoordPointer_enc = set_glTexCoordPointer(s_glTexcoordPointer);
93556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glMatrixIndexPointerOES_enc = set_glMatrixIndexPointerOES(s_glMatrixIndexPointerOES);
93656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glWeightPointerOES_enc = set_glWeightPointerOES(s_glWeightPointerOES);
93756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
93856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetIntegerv_enc = set_glGetIntegerv(s_glGetIntegerv);
93956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetFloatv_enc = set_glGetFloatv(s_glGetFloatv);
94056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetBooleanv_enc = set_glGetBooleanv(s_glGetBooleanv);
94156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetFixedv_enc = set_glGetFixedv(s_glGetFixedv);
94256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetPointerv_enc = set_glGetPointerv(s_glGetPointerv);
94356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
94456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glBindBuffer_enc = set_glBindBuffer(s_glBindBuffer);
94556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glBufferData_enc = set_glBufferData(s_glBufferData);
94656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glBufferSubData_enc = set_glBufferSubData(s_glBufferSubData);
94756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glDeleteBuffers_enc = set_glDeleteBuffers(s_glDeleteBuffers);
94856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
94956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glEnableClientState_enc = set_glEnableClientState(s_glEnableClientState);
95056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glDisableClientState_enc = set_glDisableClientState(s_glDisableClientState);
95156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glIsEnabled_enc = set_glIsEnabled(s_glIsEnabled);
95256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glDrawArrays_enc = set_glDrawArrays(s_glDrawArrays);
95356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glDrawElements_enc = set_glDrawElements(s_glDrawElements);
95456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    set_glGetString(s_glGetString);
95556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    set_glFinish(s_glFinish);
95656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetError_enc = set_glGetError(s_glGetError);
95756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
95856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glActiveTexture_enc = set_glActiveTexture(s_glActiveTexture);
95956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glBindTexture_enc = set_glBindTexture(s_glBindTexture);
96056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glDeleteTextures_enc = set_glDeleteTextures(s_glDeleteTextures);
96156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glDisable_enc = set_glDisable(s_glDisable);
96256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glEnable_enc = set_glEnable(s_glEnable);
96356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetTexParameterfv_enc = set_glGetTexParameterfv(s_glGetTexParameterfv);
96456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetTexParameteriv_enc = set_glGetTexParameteriv(s_glGetTexParameteriv);
96556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glGetTexParameterxv_enc = set_glGetTexParameterxv(s_glGetTexParameterxv);
96656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexParameterf_enc = set_glTexParameterf(s_glTexParameterf);
96756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexParameterfv_enc = set_glTexParameterfv(s_glTexParameterfv);
96856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexParameteri_enc = set_glTexParameteri(s_glTexParameteri);
96956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexParameterx_enc = set_glTexParameterx(s_glTexParameterx);
97056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexParameteriv_enc = set_glTexParameteriv(s_glTexParameteriv);
97156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    m_glTexParameterxv_enc = set_glTexParameterxv(s_glTexParameterxv);
97256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
97356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
97456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallGLEncoder::~GLEncoder()
97556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
97656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    delete [] m_compressedTextureFormats;
97756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
97856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
97956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallsize_t GLEncoder::pixelDataSize(GLsizei width, GLsizei height, GLenum format, GLenum type, int pack)
98056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
98156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    assert(m_state != NULL);
98256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    return m_state->pixelDataSize(width, height, format, type, pack);
98356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
98456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall
98556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid GLEncoder::s_glFinish(void *self)
98656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{
98756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    GLEncoder *ctx = (GLEncoder *)self;
98856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall    ctx->glFinishRoundTrip(self);
98956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}
990