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);
217