1b85b2756d1e247f8314bb591700fb175d7346631keunyoung/*
2b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Copyright (C) 2011 The Android Open Source Project
3b85b2756d1e247f8314bb591700fb175d7346631keunyoung*
4b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Licensed under the Apache License, Version 2.0 (the "License");
5b85b2756d1e247f8314bb591700fb175d7346631keunyoung* you may not use this file except in compliance with the License.
6b85b2756d1e247f8314bb591700fb175d7346631keunyoung* You may obtain a copy of the License at
7b85b2756d1e247f8314bb591700fb175d7346631keunyoung*
8b85b2756d1e247f8314bb591700fb175d7346631keunyoung* http://www.apache.org/licenses/LICENSE-2.0
9b85b2756d1e247f8314bb591700fb175d7346631keunyoung*
10b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Unless required by applicable law or agreed to in writing, software
11b85b2756d1e247f8314bb591700fb175d7346631keunyoung* distributed under the License is distributed on an "AS IS" BASIS,
12b85b2756d1e247f8314bb591700fb175d7346631keunyoung* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b85b2756d1e247f8314bb591700fb175d7346631keunyoung* See the License for the specific language governing permissions and
14b85b2756d1e247f8314bb591700fb175d7346631keunyoung* limitations under the License.
15b85b2756d1e247f8314bb591700fb175d7346631keunyoung*/
16b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "GLClientState.h"
1774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang#include "GLESTextureUtils.h"
18b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "ErrorLog.h"
19b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include <stdio.h>
20b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include <stdlib.h>
21b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include <string.h>
22b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "glUtils.h"
23b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include <cutils/log.h>
24b85b2756d1e247f8314bb591700fb175d7346631keunyoung
25b85b2756d1e247f8314bb591700fb175d7346631keunyoung#ifndef MAX
26b85b2756d1e247f8314bb591700fb175d7346631keunyoung#define MAX(a, b) ((a) < (b) ? (b) : (a))
27b85b2756d1e247f8314bb591700fb175d7346631keunyoung#endif
28b85b2756d1e247f8314bb591700fb175d7346631keunyoung
2974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang// Don't include these in the .h file, or we get weird compile errors.
3074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang#include <GLES3/gl3.h>
3174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang#include <GLES3/gl31.h>
32f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
33f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::init() {
34f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_initialized = false;
35f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_nLocations = CODEC_MAX_VERTEX_ATTRIBUTES;
36f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
37f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_arrayBuffer = 0;
38f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_vertex_attrib_bindings = m_nLocations;
39f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    addVertexArrayObject(0);
40f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    setVertexArrayObject(0);
41b85b2756d1e247f8314bb591700fb175d7346631keunyoung    // init gl constans;
42f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[VERTEX_LOCATION].glConst = GL_VERTEX_ARRAY;
43f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[NORMAL_LOCATION].glConst = GL_NORMAL_ARRAY;
44f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[COLOR_LOCATION].glConst = GL_COLOR_ARRAY;
45f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[POINTSIZE_LOCATION].glConst = GL_POINT_SIZE_ARRAY_OES;
46f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD0_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
47f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD1_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
48f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD2_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
49f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD3_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
50f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD4_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
51f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD5_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
52f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD6_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
53f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[TEXCOORD7_LOCATION].glConst = GL_TEXTURE_COORD_ARRAY;
54f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[MATRIXINDEX_LOCATION].glConst = GL_MATRIX_INDEX_ARRAY_OES;
55f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[WEIGHT_LOCATION].glConst = GL_WEIGHT_ARRAY_OES;
56f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
57f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_copyReadBuffer = 0;
58f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_copyWriteBuffer = 0;
59f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_pixelPackBuffer = 0;
60f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_pixelUnpackBuffer = 0;
61f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_transformFeedbackBuffer = 0;
62f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_uniformBuffer = 0;
63f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_atomicCounterBuffer = 0;
64f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_dispatchIndirectBuffer = 0;
65f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_drawIndirectBuffer = 0;
66f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_shaderStorageBuffer = 0;
67f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
68f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_transformFeedbackActiveUnpaused = false;
69f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
70f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    // to be modified later when these are queried from host.
71f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_transform_feedback_separate_attribs = 0;
72f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_uniform_buffer_bindings = 0;
73f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_atomic_counter_buffer_bindings = 0;
74f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_shader_storage_buffer_bindings = 0;
75f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
76b85b2756d1e247f8314bb591700fb175d7346631keunyoung    m_activeTexture = 0;
77b85b2756d1e247f8314bb591700fb175d7346631keunyoung    m_currentProgram = 0;
78d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    m_currentShaderProgram = 0;
79b85b2756d1e247f8314bb591700fb175d7346631keunyoung
80b85b2756d1e247f8314bb591700fb175d7346631keunyoung    m_pixelStore.unpack_alignment = 4;
81b85b2756d1e247f8314bb591700fb175d7346631keunyoung    m_pixelStore.pack_alignment = 4;
82b85b2756d1e247f8314bb591700fb175d7346631keunyoung
8374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.unpack_row_length = 0;
8474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.unpack_image_height = 0;
8574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.unpack_skip_pixels = 0;
8674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.unpack_skip_rows = 0;
8774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.unpack_skip_images = 0;
8874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
8974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.pack_row_length = 0;
9074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.pack_skip_pixels = 0;
9174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_pixelStore.pack_skip_rows = 0;
9274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
93b85b2756d1e247f8314bb591700fb175d7346631keunyoung    memset(m_tex.unit, 0, sizeof(m_tex.unit));
94b85b2756d1e247f8314bb591700fb175d7346631keunyoung    m_tex.activeUnit = &m_tex.unit[0];
9574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_tex.textureRecs = NULL;
96b01769885b1fb7ec3f4d4743f650660be7e92cadLingfeng Yang
9757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    mRboState.boundRenderbuffer = 0;
9857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    mRboState.boundRenderbufferIndex = 0;
9957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
10035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    mFboState.boundDrawFramebuffer = 0;
10135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    mFboState.boundReadFramebuffer = 0;
10235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    mFboState.drawFboCheckStatus = GL_NONE;
10335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    mFboState.readFboCheckStatus = GL_NONE;
10457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
105b01769885b1fb7ec3f4d4743f650660be7e92cadLingfeng Yang    m_maxVertexAttribsDirty = true;
106b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
107b85b2756d1e247f8314bb591700fb175d7346631keunyoung
108f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng YangGLClientState::GLClientState()
109f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang{
110f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    init();
111f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
112f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
113f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng YangGLClientState::GLClientState(int majorVersion, int minorVersion) :
114f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_glesMajorVersion(majorVersion),
115f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_glesMinorVersion(minorVersion) {
116f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    init();
117f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
118f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
119b85b2756d1e247f8314bb591700fb175d7346631keunyoungGLClientState::~GLClientState()
120b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
121b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
122b85b2756d1e247f8314bb591700fb175d7346631keunyoung
123b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid GLClientState::enable(int location, int state)
124b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
125f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].enableDirty |= (state != m_currVaoState[location].enabled);
126f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].enabled = state;
127f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
128f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
129f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::setVertexAttribState(int location, int size, GLenum type, GLboolean normalized, GLsizei stride, const void *data, bool isInt)
130f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang{
131f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].size = size;
132f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].type = type;
133f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].stride = stride;
134f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].data = (void*)data;
135f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].bufferObject = m_arrayBuffer;
136f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].elementSize = size ? (glSizeof(type) * size) : 0;
137f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    switch (type) {
138f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_INT_2_10_10_10_REV:
139f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_UNSIGNED_INT_2_10_10_10_REV:
140f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_currVaoState[location].elementSize =
141f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang                m_currVaoState[location].elementSize / 4;
142f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
143f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        default:
144f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
145f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
146f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].normalized = normalized;
147f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].isInt = isInt;
148f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
149f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
150f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::setVertexBindingDivisor(int bindingindex, GLuint divisor) {
151f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState.bufferBinding(bindingindex).divisor = divisor;
152f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
153f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
154f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangconst GLClientState::BufferBinding& GLClientState::getCurrAttributeBindingInfo(int attribindex) {
15526a8b4be35290878c2f5f4adc2e0cfef6d4085d9Lingfeng Yang    return m_currVaoState.bufferBindings_const()[m_currVaoState[attribindex].bindingindex];
156f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
157f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
158f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::setVertexAttribBinding(int attribindex, int bindingindex) {
159f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[attribindex].bindingindex = bindingindex;
160f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
161f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
162f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::setVertexAttribFormat(int location, int size, GLenum type, GLboolean normalized, GLuint reloffset, bool isInt) {
163f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].size = size;
164f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].type = type;
165f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].normalized = normalized;
166f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].reloffset = reloffset;
167f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].elementSize = size ? (glSizeof(type) * size) : 0;
168f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    switch (type) {
169f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_INT_2_10_10_10_REV:
170f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_UNSIGNED_INT_2_10_10_10_REV:
171f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_currVaoState[location].elementSize =
172f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang                m_currVaoState[location].elementSize / 4;
173f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
174f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        default:
175f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
176f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
177f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].isInt = isInt;
178f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
179f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
180f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::addVertexArrayObjects(GLsizei n, GLuint* arrays) {
181f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    for (GLsizei i = 0; i < n; i++) {
182f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        addVertexArrayObject(arrays[i]);
183f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
184f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
185f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
186f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::removeVertexArrayObjects(GLsizei n, const GLuint* arrays) {
187f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    for (GLsizei i = 0; i < n; i++) {
188f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        if (arrays[i] && m_currVaoState.vaoId() == arrays[i]) {
189f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            setVertexArrayObject(0);
190f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        }
191f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        removeVertexArrayObject(arrays[i]);
192f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
193f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
194f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
195f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::addVertexArrayObject(GLuint name) {
196f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_vaoMap.find(name) !=
197f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_vaoMap.end()) {
198f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        ALOGE("%s: ERROR: %u already part of current VAO state!",
199f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang              __FUNCTION__, name);
200b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return;
201b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
202b85b2756d1e247f8314bb591700fb175d7346631keunyoung
203f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_vaoMap.insert(
204f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            VAOStateMap::value_type(
205f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang                name,
206f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang                VAOState(0, m_nLocations, std::max(m_nLocations, m_max_vertex_attrib_bindings))));
207f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    VertexAttribStateVector& attribState =
20826a8b4be35290878c2f5f4adc2e0cfef6d4085d9Lingfeng Yang        m_vaoMap.find(name)->second.attribState;
209f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    for (int i = 0; i < m_nLocations; i++) {
210f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].enabled = 0;
211f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].enableDirty = false;
212f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].data = 0;
213f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].reloffset = 0;
214f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].bindingindex = i;
215f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].divisor = 0;
216f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].size = 4; // 4 is the default size
217f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        attribState[i].type = GL_FLOAT; // GL_FLOAT is the default type
218f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
219d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang
220d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    VertexAttribBindingVector& bindingState =
221d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang        m_vaoMap.find(name)->second.bindingState;
222d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    for (int i = 0; i < bindingState.size(); i++) {
223d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang        bindingState[i].effectiveStride = 16;
224d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    }
225b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
226b85b2756d1e247f8314bb591700fb175d7346631keunyoung
227f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::removeVertexArrayObject(GLuint name) {
228f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (name == 0) {
229f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        ALOGE("%s: ERROR: cannot delete VAO 0!",
230f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang              __FUNCTION__);
231f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return;
232f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
233f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_vaoMap.find(name) ==
234f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_vaoMap.end()) {
235f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        ALOGE("%s: ERROR: %u not found in VAO state!",
236f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang              __FUNCTION__, name);
237b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return;
238b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
239f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_vaoMap.erase(name);
240b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
241b85b2756d1e247f8314bb591700fb175d7346631keunyoung
242f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::setVertexArrayObject(GLuint name) {
243f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_vaoMap.find(name) ==
244f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_vaoMap.end()) {
245f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        ALOGE("%s: ERROR: %u not found in VAO state!",
246f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang              __FUNCTION__, name);
247b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return;
248b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
249b85b2756d1e247f8314bb591700fb175d7346631keunyoung
250f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (name && m_currVaoState.vaoId() == name) {
251f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        ALOGV("%s: set vao to self, no-op (%u)",
252f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang              __FUNCTION__, name);
253f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return;
254f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
255f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
256f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState =
257f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        VAOStateRef(m_vaoMap.find(name));
258f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    ALOGV("%s: set vao to %u (%u) %u %u", __FUNCTION__,
259f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            name,
260f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_currVaoState.vaoId(),
261f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_arrayBuffer,
262f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_currVaoState.iboId());
263b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
264b85b2756d1e247f8314bb591700fb175d7346631keunyoung
265f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangbool GLClientState::isVertexArrayObject(GLuint vao) const {
266f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    return m_vaoMap.find(vao) != m_vaoMap.end();
267b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
268b85b2756d1e247f8314bb591700fb175d7346631keunyoung
269f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangconst GLClientState::VertexAttribState& GLClientState::getState(int location)
270b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
271f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    return m_currVaoState[location];
272f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
273b85b2756d1e247f8314bb591700fb175d7346631keunyoung
274f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangconst GLClientState::VertexAttribState& GLClientState::getStateAndEnableDirty(int location, bool *enableChanged)
275f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang{
276b85b2756d1e247f8314bb591700fb175d7346631keunyoung    if (enableChanged) {
277f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        *enableChanged = m_currVaoState[location].enableDirty;
278b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
279b85b2756d1e247f8314bb591700fb175d7346631keunyoung
280f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_currVaoState[location].enableDirty = false;
281f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    return m_currVaoState[location];
282b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
283b85b2756d1e247f8314bb591700fb175d7346631keunyoung
284b85b2756d1e247f8314bb591700fb175d7346631keunyoungint GLClientState::getLocation(GLenum loc)
285b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
286b85b2756d1e247f8314bb591700fb175d7346631keunyoung    int retval;
287b85b2756d1e247f8314bb591700fb175d7346631keunyoung
288b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch(loc) {
289b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_VERTEX_ARRAY:
290b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int(VERTEX_LOCATION);
291b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
292b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_NORMAL_ARRAY:
293b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int(NORMAL_LOCATION);
294b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
295b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_COLOR_ARRAY:
296b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int(COLOR_LOCATION);
297b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
298b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_POINT_SIZE_ARRAY_OES:
299b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int(POINTSIZE_LOCATION);
300b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
301b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_COORD_ARRAY:
302b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int (TEXCOORD0_LOCATION + m_activeTexture);
303b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
304b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_MATRIX_INDEX_ARRAY_OES:
305b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int (MATRIXINDEX_LOCATION);
306b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
307b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_WEIGHT_ARRAY_OES:
308b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = int (WEIGHT_LOCATION);
309b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
310b85b2756d1e247f8314bb591700fb175d7346631keunyoung    default:
311b85b2756d1e247f8314bb591700fb175d7346631keunyoung        retval = loc;
312b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
313b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return retval;
314b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
315b85b2756d1e247f8314bb591700fb175d7346631keunyoung
316d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yangstatic void sClearIndexedBufferBinding(GLuint id, std::vector<GLClientState::BufferBinding>& bindings) {
317d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    for (size_t i = 0; i < bindings.size(); i++) {
318d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang        if (bindings[i].buffer == id) {
319d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang            bindings[i].offset = 0;
320d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang            bindings[i].stride = 0;
321d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang            bindings[i].effectiveStride = 16;
322d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang            bindings[i].size = 0;
323d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang            bindings[i].buffer = 0;
324d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang            bindings[i].divisor = 0;
325d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang        }
326d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    }
327d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang}
328d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang
329d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yangvoid GLClientState::addBuffer(GLuint id) {
330d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    mBufferIds.insert(id);
331d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang}
332d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang
333d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yangvoid GLClientState::removeBuffer(GLuint id) {
334d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    mBufferIds.erase(id);
335d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang}
336d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang
337d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yangbool GLClientState::bufferIdExists(GLuint id) const {
338d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    return mBufferIds.find(id) != mBufferIds.end();
339d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang}
340d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang
341f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::unBindBuffer(GLuint id) {
342f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_arrayBuffer == id) m_arrayBuffer = 0;
343f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_currVaoState.iboId() == id) m_currVaoState.iboId() = 0;
344f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_copyReadBuffer == id)
345f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_copyReadBuffer = 0;
346f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_copyWriteBuffer == id)
347f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_copyWriteBuffer = 0;
348f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_pixelPackBuffer == id)
349f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_pixelPackBuffer = 0;
350f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_pixelUnpackBuffer == id)
351f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_pixelUnpackBuffer = 0;
352f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_transformFeedbackBuffer == id)
353f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_transformFeedbackBuffer = 0;
354f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_uniformBuffer == id)
355f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_uniformBuffer = 0;
356f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_atomicCounterBuffer == id)
357f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_atomicCounterBuffer = 0;
358f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_dispatchIndirectBuffer == id)
359f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_dispatchIndirectBuffer = 0;
360f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_drawIndirectBuffer == id)
361f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_drawIndirectBuffer = 0;
362f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_shaderStorageBuffer == id)
363f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_shaderStorageBuffer = 0;
364d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang
365d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    sClearIndexedBufferBinding(id, m_indexedTransformFeedbackBuffers);
366d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    sClearIndexedBufferBinding(id, m_indexedUniformBuffers);
367d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    sClearIndexedBufferBinding(id, m_indexedAtomicCounterBuffers);
368d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    sClearIndexedBufferBinding(id, m_indexedShaderStorageBuffers);
369d3ae106098bc2338151971247dd182e7b88a5b0eLingfeng Yang    sClearIndexedBufferBinding(id, m_currVaoState.bufferBindings());
370f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
371f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
372f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangint GLClientState::bindBuffer(GLenum target, GLuint id)
373f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang{
374f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int err = 0;
375f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    switch(target) {
376f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_ARRAY_BUFFER:
377f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_arrayBuffer = id;
378f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
379f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_ELEMENT_ARRAY_BUFFER:
380f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_currVaoState.iboId() = id;
381f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
382f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_COPY_READ_BUFFER:
383f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_copyReadBuffer = id;
384f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
385f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_COPY_WRITE_BUFFER:
386f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_copyWriteBuffer = id;
387f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
388f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_PIXEL_PACK_BUFFER:
389f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_pixelPackBuffer = id;
390f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
391f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_PIXEL_UNPACK_BUFFER:
392f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_pixelUnpackBuffer = id;
393f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
394f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_TRANSFORM_FEEDBACK_BUFFER:
395f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_transformFeedbackBuffer = id;
396f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
397f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_UNIFORM_BUFFER:
398f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_uniformBuffer = id;
399f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
400f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_ATOMIC_COUNTER_BUFFER:
401f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_atomicCounterBuffer = id;
402f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
403f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_DISPATCH_INDIRECT_BUFFER:
404f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_dispatchIndirectBuffer = id;
405f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
406f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_DRAW_INDIRECT_BUFFER:
407f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_drawIndirectBuffer = id;
408f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
409f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_SHADER_STORAGE_BUFFER:
410f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_shaderStorageBuffer = id;
411f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
412f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    default:
413f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        err = -1;
414f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
415f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    return err;
416f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
417f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
418f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::bindIndexedBuffer(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size, GLintptr stride, GLintptr effectiveStride) {
419f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    switch (target) {
420f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_TRANSFORM_FEEDBACK_BUFFER:
421f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedTransformFeedbackBuffers[index].buffer = buffer;
422f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedTransformFeedbackBuffers[index].offset = offset;
423f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedTransformFeedbackBuffers[index].size = size;
424f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedTransformFeedbackBuffers[index].stride = stride;
425f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
426f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_UNIFORM_BUFFER:
427f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedUniformBuffers[index].buffer = buffer;
428f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedUniformBuffers[index].offset = offset;
429f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedUniformBuffers[index].size = size;
430f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedUniformBuffers[index].stride = stride;
431f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
432f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_ATOMIC_COUNTER_BUFFER:
433f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedAtomicCounterBuffers[index].buffer = buffer;
434f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedAtomicCounterBuffers[index].offset = offset;
435f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedAtomicCounterBuffers[index].size = size;
436f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedAtomicCounterBuffers[index].stride = stride;
437f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
438f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_SHADER_STORAGE_BUFFER:
439f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedShaderStorageBuffers[index].buffer = buffer;
440f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedShaderStorageBuffers[index].offset = offset;
441f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedShaderStorageBuffers[index].size = size;
442f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_indexedShaderStorageBuffers[index].stride = stride;
443f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        break;
444f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    default:
445f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_currVaoState.bufferBinding(index).buffer = buffer;
446f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_currVaoState.bufferBinding(index).offset = offset;
447f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_currVaoState.bufferBinding(index).size = size;
448f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_currVaoState.bufferBinding(index).stride = stride;
449f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_currVaoState.bufferBinding(index).effectiveStride = effectiveStride;
450f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return;
451f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
452f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
453f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
454f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangint GLClientState::getMaxIndexedBufferBindings(GLenum target) const {
455f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    switch (target) {
456f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_TRANSFORM_FEEDBACK_BUFFER:
457f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return m_indexedTransformFeedbackBuffers.size();
458f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_UNIFORM_BUFFER:
459f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return m_indexedUniformBuffers.size();
460f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_ATOMIC_COUNTER_BUFFER:
461f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return m_indexedAtomicCounterBuffers.size();
462f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    case GL_SHADER_STORAGE_BUFFER:
463f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return m_indexedShaderStorageBuffers.size();
464f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    default:
465f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        return m_currVaoState.bufferBindings_const().size();
466f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
467f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
468f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
469f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangint GLClientState::getBuffer(GLenum target) {
470f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int ret=0;
471f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    switch (target) {
472f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_ARRAY_BUFFER:
473f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_arrayBuffer;
474f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
475f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_ELEMENT_ARRAY_BUFFER:
476f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_currVaoState.iboId();
477f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
478f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_COPY_READ_BUFFER:
479f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_copyReadBuffer;
480f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
481f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_COPY_WRITE_BUFFER:
482f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_copyWriteBuffer;
483f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
484f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_PIXEL_PACK_BUFFER:
485f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_pixelPackBuffer;
486f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
487f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_PIXEL_UNPACK_BUFFER:
488f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_pixelUnpackBuffer;
489f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
490f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_TRANSFORM_FEEDBACK_BUFFER:
491f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_transformFeedbackBuffer;
492f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
493f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_UNIFORM_BUFFER:
494f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_uniformBuffer;
495f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
496f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_ATOMIC_COUNTER_BUFFER:
497f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_atomicCounterBuffer;
498f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
499f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_DISPATCH_INDIRECT_BUFFER:
500f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_dispatchIndirectBuffer;
501f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
502f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_DRAW_INDIRECT_BUFFER:
503f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_drawIndirectBuffer;
504f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
505f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        case GL_SHADER_STORAGE_BUFFER:
506f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = m_shaderStorageBuffer;
507f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            break;
508f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        default:
509f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            ret = -1;
510f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
511f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    return ret;
512f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
513f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
514b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid GLClientState::getClientStatePointer(GLenum pname, GLvoid** params)
515b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
516f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    GLenum which_state = -1;
517b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch (pname) {
518b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_VERTEX_ARRAY_POINTER: {
519f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = GLClientState::VERTEX_LOCATION;
520b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
521b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
522b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_NORMAL_ARRAY_POINTER: {
523f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = GLClientState::NORMAL_LOCATION;
524b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
525b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
526b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_COLOR_ARRAY_POINTER: {
527f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = GLClientState::COLOR_LOCATION;
528b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
529b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
530b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_COORD_ARRAY_POINTER: {
531f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = getActiveTexture() + GLClientState::TEXCOORD0_LOCATION;
532b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
533b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
534b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_POINT_SIZE_ARRAY_POINTER_OES: {
535f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = GLClientState::POINTSIZE_LOCATION;
536b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
537b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
538b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_MATRIX_INDEX_ARRAY_POINTER_OES: {
539f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = GLClientState::MATRIXINDEX_LOCATION;
540b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
541b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
542b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_WEIGHT_ARRAY_POINTER_OES: {
543f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        which_state = GLClientState::WEIGHT_LOCATION;
544b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
545b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
546b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
547f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (which_state != -1)
548f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        *params = getState(which_state).data;
549b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
550b85b2756d1e247f8314bb591700fb175d7346631keunyoung
551b85b2756d1e247f8314bb591700fb175d7346631keunyoungint GLClientState::setPixelStore(GLenum param, GLint value)
552b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
553b85b2756d1e247f8314bb591700fb175d7346631keunyoung    int retval = 0;
554b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch(param) {
555b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_UNPACK_ALIGNMENT:
55674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.unpack_alignment = value;
557b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
558b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_PACK_ALIGNMENT:
55974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.pack_alignment = value;
56074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
56174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_UNPACK_ROW_LENGTH:
56274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.unpack_row_length = value;
56374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
56474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_UNPACK_IMAGE_HEIGHT:
56574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.unpack_image_height = value;
56674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
56774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_UNPACK_SKIP_PIXELS:
56874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.unpack_skip_pixels = value;
56974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
57074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_UNPACK_SKIP_ROWS:
57174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.unpack_skip_rows = value;
57274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
57374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_UNPACK_SKIP_IMAGES:
57474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.unpack_skip_images = value;
57574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
57674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_PACK_ROW_LENGTH:
57774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.pack_row_length = value;
578b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
57974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_PACK_SKIP_PIXELS:
58074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.pack_skip_pixels = value;
58174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
58274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_PACK_SKIP_ROWS:
58374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_pixelStore.pack_skip_rows = value;
58474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
58574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    default:
58674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        retval = GL_INVALID_ENUM;
587b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
588b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return retval;
589b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
590b85b2756d1e247f8314bb591700fb175d7346631keunyoung
591b85b2756d1e247f8314bb591700fb175d7346631keunyoung
59274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangsize_t GLClientState::pixelDataSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int pack) const
59374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang{
59474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (width <= 0 || height <= 0 || depth <= 0) return 0;
59574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
59674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    ALOGV("%s: pack? %d", __FUNCTION__, pack);
59774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (pack) {
59874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack stats", __FUNCTION__);
59974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack align %d", __FUNCTION__, m_pixelStore.pack_alignment);
60074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack rowlen %d", __FUNCTION__, m_pixelStore.pack_row_length);
60174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack skippixels %d", __FUNCTION__, m_pixelStore.pack_skip_pixels);
60274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack skiprows %d", __FUNCTION__, m_pixelStore.pack_skip_rows);
60374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    } else {
60474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack stats", __FUNCTION__);
60574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack align %d", __FUNCTION__, m_pixelStore.unpack_alignment);
60674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack rowlen %d", __FUNCTION__, m_pixelStore.unpack_row_length);
60774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack imgheight %d", __FUNCTION__, m_pixelStore.unpack_image_height);
60874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack skippixels %d", __FUNCTION__, m_pixelStore.unpack_skip_pixels);
60974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack skiprows %d", __FUNCTION__, m_pixelStore.unpack_skip_rows);
61074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack skipimages %d", __FUNCTION__, m_pixelStore.unpack_skip_images);
61174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
61274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return GLESTextureUtils::computeTotalImageSize(
61374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            width, height, depth,
61474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            format, type,
61574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_alignment : m_pixelStore.unpack_alignment,
61674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_row_length : m_pixelStore.unpack_row_length,
61774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? 0 : m_pixelStore.unpack_image_height,
61874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_skip_pixels : m_pixelStore.unpack_skip_pixels,
61974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_skip_rows : m_pixelStore.unpack_skip_rows,
62074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? 0 : m_pixelStore.unpack_skip_images);
62174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
62274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
62374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangsize_t GLClientState::pboNeededDataSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int pack) const
62474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang{
62574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (width <= 0 || height <= 0 || depth <= 0) return 0;
62674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
62774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    ALOGV("%s: pack? %d", __FUNCTION__, pack);
62874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (pack) {
62974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack stats", __FUNCTION__);
63074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack align %d", __FUNCTION__, m_pixelStore.pack_alignment);
63174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack rowlen %d", __FUNCTION__, m_pixelStore.pack_row_length);
63274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack skippixels %d", __FUNCTION__, m_pixelStore.pack_skip_pixels);
63374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: pack skiprows %d", __FUNCTION__, m_pixelStore.pack_skip_rows);
63474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    } else {
63574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack stats", __FUNCTION__);
63674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack align %d", __FUNCTION__, m_pixelStore.unpack_alignment);
63774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack rowlen %d", __FUNCTION__, m_pixelStore.unpack_row_length);
63874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack imgheight %d", __FUNCTION__, m_pixelStore.unpack_image_height);
63974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack skippixels %d", __FUNCTION__, m_pixelStore.unpack_skip_pixels);
64074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack skiprows %d", __FUNCTION__, m_pixelStore.unpack_skip_rows);
64174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGV("%s: unpack skipimages %d", __FUNCTION__, m_pixelStore.unpack_skip_images);
64274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
64374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return GLESTextureUtils::computeNeededBufferSize(
64474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            width, height, depth,
64574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            format, type,
64674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_alignment : m_pixelStore.unpack_alignment,
64774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_row_length : m_pixelStore.unpack_row_length,
64874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? 0 : m_pixelStore.unpack_image_height,
64974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_skip_pixels : m_pixelStore.unpack_skip_pixels,
65074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? m_pixelStore.pack_skip_rows : m_pixelStore.unpack_skip_rows,
65174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            pack ? 0 : m_pixelStore.unpack_skip_images);
65274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
65374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
65474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
65574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangsize_t GLClientState::clearBufferNumElts(GLenum buffer) const
65674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang{
65774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    switch (buffer) {
65874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_COLOR:
65974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return 4;
66074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_DEPTH:
66174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_STENCIL:
66274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return 1;
66374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
66474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return 1;
66574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
666b85b2756d1e247f8314bb591700fb175d7346631keunyoung
66774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangvoid GLClientState::setNumActiveUniformsInUniformBlock(GLuint program, GLuint uniformBlockIndex, GLint numActiveUniforms) {
66874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    UniformBlockInfoKey key;
66974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    key.program = program;
67074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    key.uniformBlockIndex = uniformBlockIndex;
671b85b2756d1e247f8314bb591700fb175d7346631keunyoung
67274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    UniformBlockUniformInfo info;
67374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    info.numActiveUniforms = (size_t)numActiveUniforms;
674bd119bf2e3faa06751b1e5e65b59f0321bb7a998bohu
67574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    m_uniformBlockInfoMap[key] = info;
67674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
677b85b2756d1e247f8314bb591700fb175d7346631keunyoung
67874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangsize_t GLClientState::numActiveUniformsInUniformBlock(GLuint program, GLuint uniformBlockIndex) const {
67974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    UniformBlockInfoKey key;
68074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    key.program = program;
68174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    key.uniformBlockIndex = uniformBlockIndex;
68274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    UniformBlockInfoMap::const_iterator it =
68374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_uniformBlockInfoMap.find(key);
68474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (it == m_uniformBlockInfoMap.end()) return 0;
68574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return it->second.numActiveUniforms;
68674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
687b85b2756d1e247f8314bb591700fb175d7346631keunyoung
688b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yangvoid GLClientState::associateProgramWithPipeline(GLuint program, GLuint pipeline) {
689b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang    m_programPipelines[program] = pipeline;
690b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang}
691b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang
692b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng YangGLClientState::ProgramPipelineIterator GLClientState::programPipelineBegin() {
693b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang    return m_programPipelines.begin();
694b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang}
695b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang
696b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng YangGLClientState::ProgramPipelineIterator GLClientState::programPipelineEnd() {
697b3dc29ff8fd9541cdf567a8a6ef3229b2852f128Lingfeng Yang    return m_programPipelines.end();
698b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
699b85b2756d1e247f8314bb591700fb175d7346631keunyoung
700b85b2756d1e247f8314bb591700fb175d7346631keunyoungGLenum GLClientState::setActiveTextureUnit(GLenum texture)
701b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
702b85b2756d1e247f8314bb591700fb175d7346631keunyoung    GLuint unit = texture - GL_TEXTURE0;
703b85b2756d1e247f8314bb591700fb175d7346631keunyoung    if (unit >= MAX_TEXTURE_UNITS) {
704db8565739a0c41c0685928caace975a766ffc9caYahan Zhou        return GL_INVALID_ENUM;
705b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
706b85b2756d1e247f8314bb591700fb175d7346631keunyoung    m_tex.activeUnit = &m_tex.unit[unit];
707b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return GL_NO_ERROR;
708b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
709b85b2756d1e247f8314bb591700fb175d7346631keunyoung
710b85b2756d1e247f8314bb591700fb175d7346631keunyoungGLenum GLClientState::getActiveTextureUnit() const
711b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
712b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return GL_TEXTURE0 + (m_tex.activeUnit - &m_tex.unit[0]);
713b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
714b85b2756d1e247f8314bb591700fb175d7346631keunyoung
715b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid GLClientState::enableTextureTarget(GLenum target)
716b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
717b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch (target) {
718b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_2D:
719b85b2756d1e247f8314bb591700fb175d7346631keunyoung        m_tex.activeUnit->enables |= (1u << TEXTURE_2D);
720b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
721b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_EXTERNAL_OES:
722b85b2756d1e247f8314bb591700fb175d7346631keunyoung        m_tex.activeUnit->enables |= (1u << TEXTURE_EXTERNAL);
723b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
724b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
725b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
726b85b2756d1e247f8314bb591700fb175d7346631keunyoung
727b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid GLClientState::disableTextureTarget(GLenum target)
728b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
729b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch (target) {
730b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_2D:
731b85b2756d1e247f8314bb591700fb175d7346631keunyoung        m_tex.activeUnit->enables &= ~(1u << TEXTURE_2D);
732b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
733b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_EXTERNAL_OES:
734b85b2756d1e247f8314bb591700fb175d7346631keunyoung        m_tex.activeUnit->enables &= ~(1u << TEXTURE_EXTERNAL);
735b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
736b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
737b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
738b85b2756d1e247f8314bb591700fb175d7346631keunyoung
739b85b2756d1e247f8314bb591700fb175d7346631keunyoungGLenum GLClientState::getPriorityEnabledTarget(GLenum allDisabled) const
740b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
741b85b2756d1e247f8314bb591700fb175d7346631keunyoung    unsigned int enables = m_tex.activeUnit->enables;
742b85b2756d1e247f8314bb591700fb175d7346631keunyoung    if (enables & (1u << TEXTURE_EXTERNAL)) {
743b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return GL_TEXTURE_EXTERNAL_OES;
744b85b2756d1e247f8314bb591700fb175d7346631keunyoung    } else if (enables & (1u << TEXTURE_2D)) {
745b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return GL_TEXTURE_2D;
746b85b2756d1e247f8314bb591700fb175d7346631keunyoung    } else {
747b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return allDisabled;
748b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
749b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
750b85b2756d1e247f8314bb591700fb175d7346631keunyoung
751b85b2756d1e247f8314bb591700fb175d7346631keunyoungint GLClientState::compareTexId(const void* pid, const void* prec)
752b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
753b85b2756d1e247f8314bb591700fb175d7346631keunyoung    const GLuint* id = (const GLuint*)pid;
754b85b2756d1e247f8314bb591700fb175d7346631keunyoung    const TextureRec* rec = (const TextureRec*)prec;
755b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return (GLint)(*id) - (GLint)rec->id;
756b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
757b85b2756d1e247f8314bb591700fb175d7346631keunyoung
758b85b2756d1e247f8314bb591700fb175d7346631keunyoungGLenum GLClientState::bindTexture(GLenum target, GLuint texture,
759b85b2756d1e247f8314bb591700fb175d7346631keunyoung        GLboolean* firstUse)
760b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
761b85b2756d1e247f8314bb591700fb175d7346631keunyoung    GLboolean first = GL_FALSE;
76274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
76374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
76474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) {
76574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        texrec = addTextureRec(texture, target);
76674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
76774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
76874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (texture && target != texrec->target &&
76974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        (target != GL_TEXTURE_EXTERNAL_OES &&
77074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang         texrec->target != GL_TEXTURE_EXTERNAL_OES)) {
77174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        ALOGD("%s: issue GL_INVALID_OPERATION: target 0x%x texrectarget 0x%x texture %u", __FUNCTION__, target, texrec->target, texture);
772b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
773b85b2756d1e247f8314bb591700fb175d7346631keunyoung
774b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch (target) {
775b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_2D:
776b85b2756d1e247f8314bb591700fb175d7346631keunyoung        m_tex.activeUnit->texture[TEXTURE_2D] = texture;
777b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
778b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_EXTERNAL_OES:
779b85b2756d1e247f8314bb591700fb175d7346631keunyoung        m_tex.activeUnit->texture[TEXTURE_EXTERNAL] = texture;
780b85b2756d1e247f8314bb591700fb175d7346631keunyoung        break;
78174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_CUBE_MAP:
78274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_tex.activeUnit->texture[TEXTURE_CUBE_MAP] = texture;
78374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
78474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_2D_ARRAY:
78574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_tex.activeUnit->texture[TEXTURE_2D_ARRAY] = texture;
78674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
78774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_3D:
78874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_tex.activeUnit->texture[TEXTURE_3D] = texture;
78974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
79074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_2D_MULTISAMPLE:
79174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_tex.activeUnit->texture[TEXTURE_2D_MULTISAMPLE] = texture;
79274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        break;
793b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
794b85b2756d1e247f8314bb591700fb175d7346631keunyoung
795b85b2756d1e247f8314bb591700fb175d7346631keunyoung    if (firstUse) {
796b85b2756d1e247f8314bb591700fb175d7346631keunyoung        *firstUse = first;
797b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
798b85b2756d1e247f8314bb591700fb175d7346631keunyoung
799b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return GL_NO_ERROR;
800b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
801b85b2756d1e247f8314bb591700fb175d7346631keunyoung
80274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangvoid GLClientState::setBoundEGLImage(GLenum target, GLeglImageOES image) {
80374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    GLuint texture = getBoundTexture(target);
80474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
80574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return;
80674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    texrec->boundEGLImage = true;
80774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
808b85b2756d1e247f8314bb591700fb175d7346631keunyoung
80974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangTextureRec* GLClientState::addTextureRec(GLuint id, GLenum target)
81074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang{
81174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* tex = new TextureRec;
812b85b2756d1e247f8314bb591700fb175d7346631keunyoung    tex->id = id;
813b85b2756d1e247f8314bb591700fb175d7346631keunyoung    tex->target = target;
814690666019cab0065e459fa137d980690a9236299Lingfeng Yang    tex->format = -1;
81574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    tex->multisamples = 0;
81674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    tex->immutable = false;
81774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    tex->boundEGLImage = false;
81874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    tex->dims = new TextureDims;
819b85b2756d1e247f8314bb591700fb175d7346631keunyoung
82074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    (*(m_tex.textureRecs))[id] = tex;
821b85b2756d1e247f8314bb591700fb175d7346631keunyoung    return tex;
822b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
823b85b2756d1e247f8314bb591700fb175d7346631keunyoung
82474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangTextureRec* GLClientState::getTextureRec(GLuint id) const {
82574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    SharedTextureDataMap::const_iterator it =
82674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        m_tex.textureRecs->find(id);
82774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (it == m_tex.textureRecs->end()) {
82874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return NULL;
82974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
83074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return it->second;
83174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
83274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
833690666019cab0065e459fa137d980690a9236299Lingfeng Yangvoid GLClientState::setBoundTextureInternalFormat(GLenum target, GLint internalformat) {
834690666019cab0065e459fa137d980690a9236299Lingfeng Yang    GLuint texture = getBoundTexture(target);
83574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
836690666019cab0065e459fa137d980690a9236299Lingfeng Yang    if (!texrec) return;
837690666019cab0065e459fa137d980690a9236299Lingfeng Yang    texrec->internalformat = internalformat;
838690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
839690666019cab0065e459fa137d980690a9236299Lingfeng Yang
840690666019cab0065e459fa137d980690a9236299Lingfeng Yangvoid GLClientState::setBoundTextureFormat(GLenum target, GLenum format) {
841690666019cab0065e459fa137d980690a9236299Lingfeng Yang    GLuint texture = getBoundTexture(target);
84274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
843690666019cab0065e459fa137d980690a9236299Lingfeng Yang    if (!texrec) return;
844690666019cab0065e459fa137d980690a9236299Lingfeng Yang    texrec->format = format;
845690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
846690666019cab0065e459fa137d980690a9236299Lingfeng Yang
847690666019cab0065e459fa137d980690a9236299Lingfeng Yangvoid GLClientState::setBoundTextureType(GLenum target, GLenum type) {
848690666019cab0065e459fa137d980690a9236299Lingfeng Yang    GLuint texture = getBoundTexture(target);
84974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
850690666019cab0065e459fa137d980690a9236299Lingfeng Yang    if (!texrec) return;
851690666019cab0065e459fa137d980690a9236299Lingfeng Yang    texrec->type = type;
852690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
853690666019cab0065e459fa137d980690a9236299Lingfeng Yang
85474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangvoid GLClientState::setBoundTextureDims(GLenum target, GLsizei level, GLsizei width, GLsizei height, GLsizei depth) {
85574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    GLuint texture = getBoundTexture(target);
85674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
85774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) {
85874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return;
85974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
86074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
86174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (level == -1) {
86274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        GLsizei curr_width = width;
86374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        GLsizei curr_height = height;
86474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        GLsizei curr_depth = depth;
86574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        GLsizei curr_level = 0;
86674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
86774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        while (true) {
86874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            texrec->dims->widths[curr_level] = curr_width;
86974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            texrec->dims->heights[curr_level] = curr_height;
87074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            texrec->dims->depths[curr_level] = curr_depth;
87174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            if (curr_width >> 1 == 0 &&
87274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang                curr_height >> 1 == 0 &&
87374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang                ((target == GL_TEXTURE_3D && curr_depth == 0) ||
87474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang                 true)) {
87574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang                break;
87674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            }
87774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            curr_width = (curr_width >> 1) ? (curr_width >> 1) : 1;
87874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            curr_height = (curr_height >> 1) ? (curr_height >> 1) : 1;
87974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            if (target == GL_TEXTURE_3D) {
88074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang                curr_depth = (curr_depth >> 1) ? (curr_depth >> 1) : 1;
88174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            }
88274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            curr_level++;
88374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        }
88474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
88574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    } else {
88674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        texrec->dims->widths[level] = width;
88774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        texrec->dims->heights[level] = height;
88874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        texrec->dims->depths[level] = depth;
88974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
89074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
89174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
89274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangvoid GLClientState::setBoundTextureSamples(GLenum target, GLsizei samples) {
89374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    GLuint texture = getBoundTexture(target);
89474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
89574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return;
89674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    texrec->multisamples = samples;
89774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
89874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
89974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangvoid GLClientState::setBoundTextureImmutableFormat(GLenum target) {
90074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    GLuint texture = getBoundTexture(target);
90174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
90274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return;
90374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    texrec->immutable = true;
90474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
90574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
90674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangbool GLClientState::isBoundTextureImmutableFormat(GLenum target) const {
90774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    GLuint texture = getBoundTexture(target);
90874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(texture);
90974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return false;
91074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->immutable;
91174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
91274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
913b85b2756d1e247f8314bb591700fb175d7346631keunyoungGLuint GLClientState::getBoundTexture(GLenum target) const
914b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
915b85b2756d1e247f8314bb591700fb175d7346631keunyoung    switch (target) {
916b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_2D:
917b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return m_tex.activeUnit->texture[TEXTURE_2D];
918b85b2756d1e247f8314bb591700fb175d7346631keunyoung    case GL_TEXTURE_EXTERNAL_OES:
919b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return m_tex.activeUnit->texture[TEXTURE_EXTERNAL];
92074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_CUBE_MAP:
92174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return m_tex.activeUnit->texture[TEXTURE_CUBE_MAP];
92274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_2D_ARRAY:
92374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return m_tex.activeUnit->texture[TEXTURE_2D_ARRAY];
92474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_3D:
92574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return m_tex.activeUnit->texture[TEXTURE_3D];
92674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    case GL_TEXTURE_2D_MULTISAMPLE:
92774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return m_tex.activeUnit->texture[TEXTURE_2D_MULTISAMPLE];
928b85b2756d1e247f8314bb591700fb175d7346631keunyoung    default:
929b85b2756d1e247f8314bb591700fb175d7346631keunyoung        return 0;
930b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
931b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
932b85b2756d1e247f8314bb591700fb175d7346631keunyoung
933e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang// BEGIN driver workarounds-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
934e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang// (>' ')><(' '<)(>' ')><(' '<)(>' ')><(' '<)(>' ')><(' '<)(>' ')><(' '<)(>' ')>
935e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
936e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yangstatic bool unreliableInternalFormat(GLenum internalformat) {
937e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    switch (internalformat) {
938e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    case GL_LUMINANCE:
939e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        return true;
940e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    default:
941e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        return false;
942e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    }
943e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang}
944e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
945e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yangvoid GLClientState::writeCopyTexImageState
946e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    (GLenum target, GLint level, GLenum internalformat) {
947e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    if (unreliableInternalFormat(internalformat)) {
948e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        CubeMapDef entry;
949e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        entry.id = getBoundTexture(GL_TEXTURE_2D);
950e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        entry.target = target;
951e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        entry.level = level;
952e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        entry.internalformat = internalformat;
953e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        m_cubeMapDefs.insert(entry);
954e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    }
955e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang}
956e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
957e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yangstatic GLenum identifyPositiveCubeMapComponent(GLenum target) {
958e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    switch (target) {
959e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
960e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
961e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
962e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
963e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
964e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
965e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    default:
966e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        return 0;
967e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    }
968e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang}
969e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
970e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng YangGLenum GLClientState::copyTexImageNeededTarget
971e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    (GLenum target, GLint level, GLenum internalformat) {
972e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    if (unreliableInternalFormat(internalformat)) {
973e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        GLenum positiveComponent =
974e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            identifyPositiveCubeMapComponent(target);
975e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        if (positiveComponent) {
976e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            CubeMapDef query;
977e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            query.id = getBoundTexture(GL_TEXTURE_2D);
978e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            query.target = positiveComponent;
979e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            query.level = level;
980e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            query.internalformat = internalformat;
981e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            if (m_cubeMapDefs.find(query) ==
982e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang                m_cubeMapDefs.end()) {
983e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang                return positiveComponent;
984e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang            }
985e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang        }
986e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    }
987e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    return 0;
988e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang}
989e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
990e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng YangGLenum GLClientState::copyTexImageLuminanceCubeMapAMDWorkaround
991e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    (GLenum target, GLint level, GLenum internalformat) {
992e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    writeCopyTexImageState(target, level, internalformat);
993e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang    return copyTexImageNeededTarget(target, level, internalformat);
994e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang}
995e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
996e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang// (>' ')><(' '<)(>' ')><(' '<)(>' ')><(' '<)(>' ')><(' '<)(>' ')><(' '<)(>' ')>
997e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang// END driver workarounds-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
998e00ec9ddda30f6be5c027ccffd39e98a84e9acc9Lingfeng Yang
999b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid GLClientState::deleteTextures(GLsizei n, const GLuint* textures)
1000b85b2756d1e247f8314bb591700fb175d7346631keunyoung{
1001b85b2756d1e247f8314bb591700fb175d7346631keunyoung    // Updating the textures array could be made more efficient when deleting
1002b85b2756d1e247f8314bb591700fb175d7346631keunyoung    // several textures:
1003b85b2756d1e247f8314bb591700fb175d7346631keunyoung    // - compacting the array could be done in a single pass once the deleted
1004b85b2756d1e247f8314bb591700fb175d7346631keunyoung    //   textures are marked, or
1005b85b2756d1e247f8314bb591700fb175d7346631keunyoung    // - could swap deleted textures to the end and re-sort.
1006b85b2756d1e247f8314bb591700fb175d7346631keunyoung    TextureRec* texrec;
1007b85b2756d1e247f8314bb591700fb175d7346631keunyoung    for (const GLuint* texture = textures; texture != textures + n; texture++) {
100874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        texrec = getTextureRec(*texture);
100974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        if (texrec && texrec->dims) {
101074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            delete texrec->dims;
101174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        }
1012b85b2756d1e247f8314bb591700fb175d7346631keunyoung        if (texrec) {
101374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            m_tex.textureRecs->erase(*texture);
101474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang            delete texrec;
1015b85b2756d1e247f8314bb591700fb175d7346631keunyoung            for (TextureUnit* unit = m_tex.unit;
1016b85b2756d1e247f8314bb591700fb175d7346631keunyoung                 unit != m_tex.unit + MAX_TEXTURE_UNITS;
1017b85b2756d1e247f8314bb591700fb175d7346631keunyoung                 unit++)
1018b85b2756d1e247f8314bb591700fb175d7346631keunyoung            {
1019b85b2756d1e247f8314bb591700fb175d7346631keunyoung                if (unit->texture[TEXTURE_2D] == *texture) {
1020b85b2756d1e247f8314bb591700fb175d7346631keunyoung                    unit->texture[TEXTURE_2D] = 0;
1021b85b2756d1e247f8314bb591700fb175d7346631keunyoung                } else if (unit->texture[TEXTURE_EXTERNAL] == *texture) {
1022b85b2756d1e247f8314bb591700fb175d7346631keunyoung                    unit->texture[TEXTURE_EXTERNAL] = 0;
1023b85b2756d1e247f8314bb591700fb175d7346631keunyoung                }
1024b85b2756d1e247f8314bb591700fb175d7346631keunyoung            }
1025b85b2756d1e247f8314bb591700fb175d7346631keunyoung        }
1026b85b2756d1e247f8314bb591700fb175d7346631keunyoung    }
1027b85b2756d1e247f8314bb591700fb175d7346631keunyoung}
102857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
102957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang// RBO//////////////////////////////////////////////////////////////////////////
103057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
103157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::addFreshRenderbuffer(GLuint name) {
103235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    // if underlying opengl says these are fresh names,
103335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    // but we are keeping a stale one, reset it.
103435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    RboProps props;
103557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.target = GL_RENDERBUFFER;
103657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.name = name;
1037690666019cab0065e459fa137d980690a9236299Lingfeng Yang    props.format = GL_NONE;
103835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.multisamples = 0;
103957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.previouslyBound = false;
104035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
104135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (usedRenderbufferName(name)) {
104235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        mRboState.rboData[getRboIndex(name)] = props;
104335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    } else {
104435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        mRboState.rboData.push_back(props);
104535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
104657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
104757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
104857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::addRenderbuffers(GLsizei n, GLuint* renderbuffers) {
104957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < n; i++) {
105057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        addFreshRenderbuffer(renderbuffers[i]);
105157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
105257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
105357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
105457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangsize_t GLClientState::getRboIndex(GLuint name) const {
105557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < mRboState.rboData.size(); i++) {
105657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        if (mRboState.rboData[i].name == name) {
105757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang            return i;
105857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        }
105957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
106057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return -1;
106157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
106257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
106357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::removeRenderbuffers(GLsizei n, const GLuint* renderbuffers) {
106457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    size_t bound_rbo_idx = getRboIndex(boundRboProps_const().name);
106557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
106657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    std::vector<GLuint> to_remove;
106757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < n; i++) {
106857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        if (renderbuffers[i] != 0) { // Never remove the zero rb.
106957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang            to_remove.push_back(getRboIndex(renderbuffers[i]));
107057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        }
107157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
107257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
107357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < to_remove.size(); i++) {
107457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        mRboState.rboData[to_remove[i]] = mRboState.rboData.back();
107557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        mRboState.rboData.pop_back();
107657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
107757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
107857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    // If we just deleted the currently bound rb,
107957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    // bind the zero rb
108057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    if (getRboIndex(boundRboProps_const().name) != bound_rbo_idx) {
108157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        bindRenderbuffer(GL_RENDERBUFFER, 0);
108257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
108357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
108457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
108557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangbool GLClientState::usedRenderbufferName(GLuint name) const {
108657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < mRboState.rboData.size(); i++) {
108757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        if (mRboState.rboData[i].name == name) {
108857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang            return true;
108957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        }
109057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
109157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return false;
109257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
109357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
109457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::setBoundRenderbufferIndex() {
109557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < mRboState.rboData.size(); i++) {
109657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        if (mRboState.rboData[i].name == mRboState.boundRenderbuffer) {
109757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang            mRboState.boundRenderbufferIndex = i;
109857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang            break;
109957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        }
110057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
110157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
110257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
110357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng YangRboProps& GLClientState::boundRboProps() {
110457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return mRboState.rboData[mRboState.boundRenderbufferIndex];
110557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
110657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
110757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangconst RboProps& GLClientState::boundRboProps_const() const {
110857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return mRboState.rboData[mRboState.boundRenderbufferIndex];
110957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
111057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
111157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::bindRenderbuffer(GLenum target, GLuint name) {
111257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    // If unused, add it.
111357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    if (!usedRenderbufferName(name)) {
111457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        addFreshRenderbuffer(name);
111557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
111657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    mRboState.boundRenderbuffer = name;
111757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    setBoundRenderbufferIndex();
111857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    boundRboProps().target = target;
111957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    boundRboProps().previouslyBound = true;
112057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
112157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
112257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng YangGLuint GLClientState::boundRenderbuffer() const {
112357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return boundRboProps_const().name;
112457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
112557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
1126690666019cab0065e459fa137d980690a9236299Lingfeng Yangvoid GLClientState::setBoundRenderbufferFormat(GLenum format) {
1127690666019cab0065e459fa137d980690a9236299Lingfeng Yang    boundRboProps().format = format;
1128690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1129690666019cab0065e459fa137d980690a9236299Lingfeng Yang
113035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangvoid GLClientState::setBoundRenderbufferSamples(GLsizei samples) {
113135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    boundRboProps().multisamples = samples;
113235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
113335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
113457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang// FBO//////////////////////////////////////////////////////////////////////////
113557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
1136690666019cab0065e459fa137d980690a9236299Lingfeng Yang// Format querying
1137690666019cab0065e459fa137d980690a9236299Lingfeng Yang
1138690666019cab0065e459fa137d980690a9236299Lingfeng YangGLenum GLClientState::queryRboFormat(GLuint rbo_name) const {
1139690666019cab0065e459fa137d980690a9236299Lingfeng Yang    return mRboState.rboData[getRboIndex(rbo_name)].format;
1140690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1141690666019cab0065e459fa137d980690a9236299Lingfeng Yang
114235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangGLsizei GLClientState::queryRboSamples(GLuint rbo_name) const {
114335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return mRboState.rboData[getRboIndex(rbo_name)].multisamples;
114435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
114535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
1146690666019cab0065e459fa137d980690a9236299Lingfeng YangGLint GLClientState::queryTexInternalFormat(GLuint tex_name) const {
114774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
1148690666019cab0065e459fa137d980690a9236299Lingfeng Yang    if (!texrec) return -1;
1149690666019cab0065e459fa137d980690a9236299Lingfeng Yang    return texrec->internalformat;
1150690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1151690666019cab0065e459fa137d980690a9236299Lingfeng Yang
115274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangGLsizei GLClientState::queryTexWidth(GLsizei level, GLuint tex_name) const {
115374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
115474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) {
115574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang        return 0;
115674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    }
115774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->dims->widths[level];
115874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
115974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
116074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangGLsizei GLClientState::queryTexHeight(GLsizei level, GLuint tex_name) const {
116174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
116274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return 0;
116374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->dims->heights[level];
116474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
116574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
116674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangGLsizei GLClientState::queryTexDepth(GLsizei level, GLuint tex_name) const {
116774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
116874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return 0;
116974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->dims->depths[level];
117074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
117174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
117274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yangbool GLClientState::queryTexEGLImageBacked(GLuint tex_name) const {
117374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
117474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return false;
117574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->boundEGLImage;
117674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
117774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
1178690666019cab0065e459fa137d980690a9236299Lingfeng YangGLenum GLClientState::queryTexFormat(GLuint tex_name) const {
117974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
1180690666019cab0065e459fa137d980690a9236299Lingfeng Yang    if (!texrec) return -1;
1181690666019cab0065e459fa137d980690a9236299Lingfeng Yang    return texrec->format;
1182690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1183690666019cab0065e459fa137d980690a9236299Lingfeng Yang
1184690666019cab0065e459fa137d980690a9236299Lingfeng YangGLenum GLClientState::queryTexType(GLuint tex_name) const {
118574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
1186690666019cab0065e459fa137d980690a9236299Lingfeng Yang    if (!texrec) return -1;
1187690666019cab0065e459fa137d980690a9236299Lingfeng Yang    return texrec->type;
1188690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1189690666019cab0065e459fa137d980690a9236299Lingfeng Yang
119074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangGLsizei GLClientState::queryTexSamples(GLuint tex_name) const {
119174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
119274e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return 0;
119374e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->multisamples;
119474e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
119574e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
119674e29295ec43efde4365f08f20d7e1515c182b99Lingfeng YangGLenum GLClientState::queryTexLastBoundTarget(GLuint tex_name) const {
119774e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    TextureRec* texrec = getTextureRec(tex_name);
119874e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    if (!texrec) return GL_NONE;
119974e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang    return texrec->target;
120074e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang}
120174e29295ec43efde4365f08f20d7e1515c182b99Lingfeng Yang
1202690666019cab0065e459fa137d980690a9236299Lingfeng Yangvoid GLClientState::getBoundFramebufferFormat(
120335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        GLenum target,
1204690666019cab0065e459fa137d980690a9236299Lingfeng Yang        GLenum attachment, FboFormatInfo* res_info) const {
120535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    const FboProps& props = boundFboProps_const(target);
1206690666019cab0065e459fa137d980690a9236299Lingfeng Yang
1207690666019cab0065e459fa137d980690a9236299Lingfeng Yang    res_info->type = FBO_ATTACHMENT_NONE;
1208690666019cab0065e459fa137d980690a9236299Lingfeng Yang    res_info->rb_format = GL_NONE;
120935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    res_info->rb_multisamples = 0;
1210690666019cab0065e459fa137d980690a9236299Lingfeng Yang    res_info->tex_internalformat = -1;
1211690666019cab0065e459fa137d980690a9236299Lingfeng Yang    res_info->tex_format = GL_NONE;
1212690666019cab0065e459fa137d980690a9236299Lingfeng Yang    res_info->tex_type = GL_NONE;
121335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    res_info->tex_multisamples = 0;
1214690666019cab0065e459fa137d980690a9236299Lingfeng Yang
121535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
121635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
121735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
121835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
121935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (props.colorAttachmenti_hasRbo[colorAttachmentIndex]) {
1220690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
122135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->rb_format =
122235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryRboFormat(
122335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_rbos[colorAttachmentIndex]);
122435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->rb_multisamples =
122535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryRboSamples(
122635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_rbos[colorAttachmentIndex]);
122735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else if (props.colorAttachmenti_hasTex[colorAttachmentIndex]) {
1228690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_TEXTURE;
122935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_internalformat =
123035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexInternalFormat(
123135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_textures[colorAttachmentIndex]);
123235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_format =
123335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexFormat(
123435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_textures[colorAttachmentIndex]);
123535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_type =
123635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexType(props.colorAttachmenti_textures[colorAttachmentIndex]);
123735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_multisamples =
123835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexSamples(props.colorAttachmenti_textures[colorAttachmentIndex]);
1239690666019cab0065e459fa137d980690a9236299Lingfeng Yang        } else {
1240690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_NONE;
1241690666019cab0065e459fa137d980690a9236299Lingfeng Yang        }
124235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
124335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
124435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (attachment) {
1245690666019cab0065e459fa137d980690a9236299Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
1246690666019cab0065e459fa137d980690a9236299Lingfeng Yang        if (props.depthAttachment_hasRbo) {
1247690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
1248690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->rb_format = queryRboFormat(props.depthAttachment_rbo);
124935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->rb_multisamples =
125035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryRboSamples(
125135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_rbos[colorAttachmentIndex]);
1252690666019cab0065e459fa137d980690a9236299Lingfeng Yang        } else if (props.depthAttachment_hasTexObj) {
1253690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_TEXTURE;
1254690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->tex_internalformat = queryTexInternalFormat(props.depthAttachment_texture);
1255690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->tex_format = queryTexFormat(props.depthAttachment_texture);
1256690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->tex_type = queryTexType(props.depthAttachment_texture);
125735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_multisamples =
125835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexSamples(props.colorAttachmenti_textures[colorAttachmentIndex]);
1259690666019cab0065e459fa137d980690a9236299Lingfeng Yang        } else {
1260690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_NONE;
1261690666019cab0065e459fa137d980690a9236299Lingfeng Yang        }
1262690666019cab0065e459fa137d980690a9236299Lingfeng Yang        break;
1263690666019cab0065e459fa137d980690a9236299Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
1264690666019cab0065e459fa137d980690a9236299Lingfeng Yang        if (props.stencilAttachment_hasRbo) {
1265690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
1266690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->rb_format = queryRboFormat(props.stencilAttachment_rbo);
126735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->rb_multisamples =
126835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryRboSamples(
126935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_rbos[colorAttachmentIndex]);
1270690666019cab0065e459fa137d980690a9236299Lingfeng Yang        } else if (props.stencilAttachment_hasTexObj) {
1271690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_TEXTURE;
1272690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->tex_internalformat = queryTexInternalFormat(props.stencilAttachment_texture);
1273690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->tex_format = queryTexFormat(props.stencilAttachment_texture);
1274690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->tex_type = queryTexType(props.stencilAttachment_texture);
127535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_multisamples =
127635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexSamples(props.colorAttachmenti_textures[colorAttachmentIndex]);
1277690666019cab0065e459fa137d980690a9236299Lingfeng Yang        } else {
1278690666019cab0065e459fa137d980690a9236299Lingfeng Yang            res_info->type = FBO_ATTACHMENT_NONE;
1279690666019cab0065e459fa137d980690a9236299Lingfeng Yang        }
1280690666019cab0065e459fa137d980690a9236299Lingfeng Yang        break;
128135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
128235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (props.depthstencilAttachment_hasRbo) {
128335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
128435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->rb_format = queryRboFormat(props.depthstencilAttachment_rbo);
128535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->rb_multisamples =
128635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryRboSamples(
128735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                        props.colorAttachmenti_rbos[colorAttachmentIndex]);
128835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else if (props.depthstencilAttachment_hasTexObj) {
128935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->type = FBO_ATTACHMENT_TEXTURE;
129035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_internalformat = queryTexInternalFormat(props.depthstencilAttachment_texture);
129135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_format = queryTexFormat(props.depthstencilAttachment_texture);
129235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_type = queryTexType(props.depthstencilAttachment_texture);
129335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->tex_multisamples =
129435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                queryTexSamples(props.colorAttachmenti_textures[colorAttachmentIndex]);
129535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else {
129635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            res_info->type = FBO_ATTACHMENT_NONE;
129735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
1298690666019cab0065e459fa137d980690a9236299Lingfeng Yang        break;
1299690666019cab0065e459fa137d980690a9236299Lingfeng Yang    }
1300690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1301690666019cab0065e459fa137d980690a9236299Lingfeng Yang
130235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangFboAttachmentType GLClientState::getBoundFramebufferAttachmentType(GLenum target, GLenum attachment) const {
130335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    FboFormatInfo info;
130435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    getBoundFramebufferFormat(target, attachment, &info);
130535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return info.type;
130635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
130735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
130835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
130935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangint GLClientState::getMaxColorAttachments() const {
131035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return m_max_color_attachments;
131135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
131235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
131335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangint GLClientState::getMaxDrawBuffers() const {
131435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return m_max_draw_buffers;
131535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
131635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
131757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::addFreshFramebuffer(GLuint name) {
131835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    FboProps props;
131957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.name = name;
132057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.previouslyBound = false;
132157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
132235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.colorAttachmenti_textures.resize(m_max_color_attachments, 0);
132357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.depthAttachment_texture = 0;
132457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.stencilAttachment_texture = 0;
132535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.depthstencilAttachment_texture = 0;
132657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
132735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.colorAttachmenti_hasTex.resize(m_max_color_attachments, false);
132857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.depthAttachment_hasTexObj = false;
132957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.stencilAttachment_hasTexObj = false;
133035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.depthstencilAttachment_hasTexObj = false;
133157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
133235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.colorAttachmenti_rbos.resize(m_max_color_attachments, 0);
133357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.depthAttachment_rbo = 0;
133457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.stencilAttachment_rbo = 0;
133535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.depthstencilAttachment_rbo = 0;
133657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
133735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.colorAttachmenti_hasRbo.resize(m_max_color_attachments, false);
133857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.depthAttachment_hasRbo = false;
133957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    props.stencilAttachment_hasRbo = false;
134035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    props.depthstencilAttachment_hasRbo = false;
134135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    mFboState.fboData[name] = props;
134257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
134357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
134457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::addFramebuffers(GLsizei n, GLuint* framebuffers) {
134557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < n; i++) {
134657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        addFreshFramebuffer(framebuffers[i]);
134757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
134857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
134957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
135057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::removeFramebuffers(GLsizei n, const GLuint* framebuffers) {
135157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    for (size_t i = 0; i < n; i++) {
135257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        if (framebuffers[i] != 0) { // Never remove the zero fb.
135335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            if (framebuffers[i] == mFboState.boundDrawFramebuffer) {
135435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                bindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
135535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            }
135635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            if (framebuffers[i] == mFboState.boundReadFramebuffer) {
135735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang                bindFramebuffer(GL_READ_FRAMEBUFFER, 0);
135835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            }
135935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.fboData.erase(framebuffers[i]);
136057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        }
136157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
136257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
136357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
136457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangbool GLClientState::usedFramebufferName(GLuint name) const {
136535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return mFboState.fboData.find(name) != mFboState.fboData.end();
136657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
136757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
136835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangFboProps& GLClientState::boundFboProps(GLenum target) {
136935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (target) {
137035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DRAW_FRAMEBUFFER:
137135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        return mFboState.fboData[mFboState.boundDrawFramebuffer];
137235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_READ_FRAMEBUFFER:
137335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        return mFboState.fboData[mFboState.boundReadFramebuffer];
137435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_FRAMEBUFFER:
137535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        return mFboState.fboData[mFboState.boundDrawFramebuffer];
137657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
137735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return mFboState.fboData[mFboState.boundDrawFramebuffer];
137857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
137957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
138035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangconst FboProps& GLClientState::boundFboProps_const(GLenum target) const {
138135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (target) {
138235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DRAW_FRAMEBUFFER:
138326a8b4be35290878c2f5f4adc2e0cfef6d4085d9Lingfeng Yang        return mFboState.fboData.find(mFboState.boundDrawFramebuffer)->second;
138435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_READ_FRAMEBUFFER:
138526a8b4be35290878c2f5f4adc2e0cfef6d4085d9Lingfeng Yang        return mFboState.fboData.find(mFboState.boundReadFramebuffer)->second;
138635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_FRAMEBUFFER:
138726a8b4be35290878c2f5f4adc2e0cfef6d4085d9Lingfeng Yang        return mFboState.fboData.find(mFboState.boundDrawFramebuffer)->second;
138835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
138926a8b4be35290878c2f5f4adc2e0cfef6d4085d9Lingfeng Yang    return mFboState.fboData.find(mFboState.boundDrawFramebuffer)->second;
139057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
139157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
139257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::bindFramebuffer(GLenum target, GLuint name) {
139357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    // If unused, add it.
139457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    if (!usedFramebufferName(name)) {
139557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        addFreshFramebuffer(name);
139657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
139735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (target) {
139835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        case GL_DRAW_FRAMEBUFFER:
139935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.boundDrawFramebuffer = name;
140035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            break;
140135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        case GL_READ_FRAMEBUFFER:
140235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.boundReadFramebuffer = name;
140335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            break;
140435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        default: // case GL_FRAMEBUFFER:
140535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.boundDrawFramebuffer = name;
140635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.boundReadFramebuffer = name;
140735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            break;
140835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
140935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    boundFboProps(target).previouslyBound = true;
141057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
141157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
141235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangvoid GLClientState::setCheckFramebufferStatus(GLenum target, GLenum status) {
141335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (target) {
141435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        case GL_DRAW_FRAMEBUFFER:
141535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.drawFboCheckStatus = status;
141635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            break;
141735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        case GL_READ_FRAMEBUFFER:
141835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.readFboCheckStatus = status;
141935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            break;
142035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        case GL_FRAMEBUFFER:
142135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            mFboState.drawFboCheckStatus = status;
142235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            break;
142335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
1424690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1425690666019cab0065e459fa137d980690a9236299Lingfeng Yang
142635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangGLenum GLClientState::getCheckFramebufferStatus(GLenum target) const {
142735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (target) {
142835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DRAW_FRAMEBUFFER:
142935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        return mFboState.drawFboCheckStatus;
143035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_READ_FRAMEBUFFER:
143135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        return mFboState.readFboCheckStatus;
143235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_FRAMEBUFFER:
143335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        return mFboState.drawFboCheckStatus;
143435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
143535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return mFboState.drawFboCheckStatus;
1436690666019cab0065e459fa137d980690a9236299Lingfeng Yang}
1437690666019cab0065e459fa137d980690a9236299Lingfeng Yang
143835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangGLuint GLClientState::boundFramebuffer(GLenum target) const {
143935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return boundFboProps_const(target).name;
144057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
144157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
144257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang// Texture objects for FBOs/////////////////////////////////////////////////////
144357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
144435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangvoid GLClientState::attachTextureObject(
144535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        GLenum target,
144635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        GLenum attachment, GLuint texture) {
144735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
144835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
144935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
145035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
145135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
145235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).colorAttachmenti_textures[colorAttachmentIndex] = texture;
145335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).colorAttachmenti_hasTex[colorAttachmentIndex] = true;
145435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
145535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
145657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    switch (attachment) {
145757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
145835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_texture = texture;
145935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_hasTexObj = true;
146057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
146157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
146235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_texture = texture;
146335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_hasTexObj = true;
146457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
146535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
146635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthstencilAttachment_texture = texture;
146735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthstencilAttachment_hasTexObj = true;
146835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_texture = texture;
146935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_hasTexObj = true;
147035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_texture = texture;
147135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_hasTexObj = true;
147257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
147357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
147457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
147557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
147635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangGLuint GLClientState::getFboAttachmentTextureId(GLenum target, GLenum attachment) const {
147735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    GLuint res = 0; // conservative
147835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
147935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
148035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
148135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
148235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
148335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).colorAttachmenti_textures[colorAttachmentIndex];
148435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
148535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
148657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    switch (attachment) {
148757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
148835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).depthAttachment_texture;
148957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
149057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
149135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).stencilAttachment_texture;
149235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
149335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
149435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).depthstencilAttachment_texture;
149557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
149657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
149757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return res;
149857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
149957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
150057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang// RBOs for FBOs////////////////////////////////////////////////////////////////
150157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
150235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangvoid GLClientState::detachRbo(GLuint renderbuffer) {
150335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    for (int i = 0; i < m_max_color_attachments; i++) {
150435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        detachRboFromFbo(GL_DRAW_FRAMEBUFFER, glUtilsColorAttachmentName(i), renderbuffer);
150535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        detachRboFromFbo(GL_READ_FRAMEBUFFER, glUtilsColorAttachmentName(i), renderbuffer);
150635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
150735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
150835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    detachRboFromFbo(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, renderbuffer);
150935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    detachRboFromFbo(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, renderbuffer);
151035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
151135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    detachRboFromFbo(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, renderbuffer);
151235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    detachRboFromFbo(GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, renderbuffer);
151335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
151435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    detachRboFromFbo(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, renderbuffer);
151535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    detachRboFromFbo(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, renderbuffer);
151635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
151735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
151835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangvoid GLClientState::detachRboFromFbo(GLenum target, GLenum attachment, GLuint renderbuffer) {
151935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
152035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
152135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
152235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
152335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (boundFboProps(target).colorAttachmenti_hasRbo[colorAttachmentIndex] &&
152435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] == renderbuffer) {
152535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] = 0;
152635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).colorAttachmenti_hasRbo[colorAttachmentIndex] = false;
152735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
152835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
152935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
153057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    switch (attachment) {
153157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
153235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (boundFboProps(target).depthAttachment_rbo == renderbuffer &&
153335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthAttachment_hasRbo) {
153435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthAttachment_rbo = 0;
153535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthAttachment_hasRbo = false;
153635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
153757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
153857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
153935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (boundFboProps(target).stencilAttachment_rbo == renderbuffer &&
154035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).stencilAttachment_hasRbo) {
154135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).stencilAttachment_rbo = 0;
154235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).stencilAttachment_hasRbo = false;
154335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
154457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
154535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
154635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (boundFboProps(target).depthAttachment_rbo == renderbuffer &&
154735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthAttachment_hasRbo) {
154835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthAttachment_rbo = 0;
154935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthAttachment_hasRbo = false;
155035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
155135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (boundFboProps(target).stencilAttachment_rbo == renderbuffer &&
155235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).stencilAttachment_hasRbo) {
155335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).stencilAttachment_rbo = 0;
155435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).stencilAttachment_hasRbo = false;
155535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
155635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (boundFboProps(target).depthstencilAttachment_rbo == renderbuffer &&
155735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthstencilAttachment_hasRbo) {
155835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthstencilAttachment_rbo = 0;
155935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            boundFboProps(target).depthstencilAttachment_hasRbo = false;
156035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
156157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
156257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
156357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
156457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
156535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangvoid GLClientState::attachRbo(GLenum target, GLenum attachment, GLuint renderbuffer) {
156635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
156735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
156835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
156935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
157035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
157135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] = renderbuffer;
157235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).colorAttachmenti_hasRbo[colorAttachmentIndex] = true;
157335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
157435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
157557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    switch (attachment) {
157635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
157735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_rbo = renderbuffer;
157835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_hasRbo = true;
157935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
158035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
158135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_rbo = renderbuffer;
158235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_hasRbo = true;
158357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
158435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
158535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_rbo = renderbuffer;
158635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthAttachment_hasRbo = true;
158735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_rbo = renderbuffer;
158835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).stencilAttachment_hasRbo = true;
158935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthstencilAttachment_rbo = renderbuffer;
159035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        boundFboProps(target).depthstencilAttachment_hasRbo = true;
159135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
159235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
159335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
159435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
159535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangGLuint GLClientState::getFboAttachmentRboId(GLenum target, GLenum attachment) const {
159635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    GLuint res = 0; // conservative
159735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
159835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
159935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
160035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
160135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
160235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).colorAttachmenti_rbos[colorAttachmentIndex];
160335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
160435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
160535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (attachment) {
160657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
160735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).depthAttachment_rbo;
160857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
160957cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
161035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).stencilAttachment_rbo;
161135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
161235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
161335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).depthstencilAttachment_rbo;
161457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
161557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
161657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return res;
161757cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
161857cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
161935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yangbool GLClientState::attachmentHasObject(GLenum target, GLenum attachment) const {
162035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    bool res = true; // liberal
162135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
162235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
162335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
162435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
162535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
162635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = boundFboProps_const(target).colorAttachmenti_hasTex[colorAttachmentIndex] ||
162735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang              boundFboProps_const(target).colorAttachmenti_hasRbo[colorAttachmentIndex];
162835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
162935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
163057cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    switch (attachment) {
163157cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
163235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = (boundFboProps_const(target).depthAttachment_hasTexObj) ||
163335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang              (boundFboProps_const(target).depthAttachment_hasRbo);
163457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
163557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
163635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = (boundFboProps_const(target).stencilAttachment_hasTexObj) ||
163735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang              (boundFboProps_const(target).stencilAttachment_hasRbo);
163835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
163935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
164035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        res = (boundFboProps_const(target).depthstencilAttachment_hasTexObj) ||
164135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang              (boundFboProps_const(target).depthstencilAttachment_hasRbo);
164257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang        break;
164357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    }
164457cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    return res;
164557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
164657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang
164735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng YangGLuint GLClientState::objectOfAttachment(GLenum target, GLenum attachment) const {
164835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    const FboProps& props = boundFboProps_const(target);
164935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
165035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    int colorAttachmentIndex =
165135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        glUtilsColorAttachmentIndex(attachment);
165235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
165335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (colorAttachmentIndex != -1) {
165435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (props.colorAttachmenti_hasTex[colorAttachmentIndex]) {
165535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.colorAttachmenti_textures[colorAttachmentIndex];
165635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else if (props.colorAttachmenti_hasRbo[colorAttachmentIndex]) {
165735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.colorAttachmenti_rbos[colorAttachmentIndex];
165835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else {
165935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return 0;
166035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
166135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
166235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang
166335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    switch (attachment) {
166435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_ATTACHMENT:
166535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (props.depthAttachment_hasTexObj) {
166635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.depthAttachment_texture;
166735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else if (props.depthAttachment_hasRbo) {
166835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.depthAttachment_rbo;
166935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else {
167035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return 0;
167135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
167235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
167335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_STENCIL_ATTACHMENT:
167435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (props.stencilAttachment_hasTexObj) {
167535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.stencilAttachment_texture;
167635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else if (props.stencilAttachment_hasRbo) {
167735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.stencilAttachment_rbo;
167835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else {
167935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return 0;
168035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
168135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    case GL_DEPTH_STENCIL_ATTACHMENT:
168235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        if (props.depthstencilAttachment_hasTexObj) {
168335d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.depthstencilAttachment_texture;
168435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else if (props.depthstencilAttachment_hasRbo) {
168535d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return props.depthstencilAttachment_rbo;
168635d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        } else {
168735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang            return 0;
168835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        }
168935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        break;
169035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
169135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    return 0;
169235d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang}
16934a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang
16944a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yangvoid GLClientState::setTransformFeedbackActiveUnpaused(bool activeUnpaused) {
16954a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang    m_transformFeedbackActiveUnpaused = activeUnpaused;
16964a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang}
16974a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang
16984a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yangbool GLClientState::getTransformFeedbackActiveUnpaused() const {
16994a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang    return m_transformFeedbackActiveUnpaused;
17004a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang}
17014a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang
17024a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yangvoid GLClientState::setTextureData(SharedTextureDataMap* sharedTexData) {
17034a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang    m_tex.textureRecs = sharedTexData;
17044a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang}
17054a66b3129550b10aa4da55af08272f3dbeba87c4Lingfeng Yang
170657cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yangvoid GLClientState::fromMakeCurrent() {
170735d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    if (mFboState.fboData.find(0) == mFboState.fboData.end()) {
170835d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang        addFreshFramebuffer(0);
170935d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    }
171035d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    FboProps& default_fb_props = mFboState.fboData[0];
171135d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    default_fb_props.colorAttachmenti_hasRbo[0] = true;
171257cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    default_fb_props.depthAttachment_hasRbo = true;
171357cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang    default_fb_props.stencilAttachment_hasRbo = true;
171435d5f3bda31d60f2b9b18ba64eb43a76e72ee125Lingfeng Yang    default_fb_props.depthstencilAttachment_hasRbo = true;
171557cb41b7ed8c951b1d28fe591c2d2fad97823060Lingfeng Yang}
1716f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1717f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangvoid GLClientState::initFromCaps(
1718f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_transform_feedback_separate_attribs,
1719f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_uniform_buffer_bindings,
1720f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_atomic_counter_buffer_bindings,
1721f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_shader_storage_buffer_bindings,
1722f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_vertex_attrib_bindings,
1723f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_color_attachments,
1724f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    int max_draw_buffers) {
1725f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1726f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_vertex_attrib_bindings = max_vertex_attrib_bindings;
1727f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1728f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    if (m_glesMajorVersion >= 3) {
1729f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_max_transform_feedback_separate_attribs = max_transform_feedback_separate_attribs;
1730f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_max_uniform_buffer_bindings = max_uniform_buffer_bindings;
1731f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_max_atomic_counter_buffer_bindings = max_atomic_counter_buffer_bindings;
1732f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        m_max_shader_storage_buffer_bindings = max_shader_storage_buffer_bindings;
1733f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1734f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        if (m_max_transform_feedback_separate_attribs)
1735f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedTransformFeedbackBuffers.resize(m_max_transform_feedback_separate_attribs);
1736f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        if (m_max_uniform_buffer_bindings)
1737f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedUniformBuffers.resize(m_max_uniform_buffer_bindings);
1738f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        if (m_max_atomic_counter_buffer_bindings)
1739f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedAtomicCounterBuffers.resize(m_max_atomic_counter_buffer_bindings);
1740f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        if (m_max_shader_storage_buffer_bindings)
1741f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedShaderStorageBuffers.resize(m_max_shader_storage_buffer_bindings);
1742f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1743f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        BufferBinding buf0Binding;
1744f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        buf0Binding.buffer = 0;
1745f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        buf0Binding.offset = 0;
1746f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        buf0Binding.size = 0;
1747f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        buf0Binding.stride = 0;
1748f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        buf0Binding.effectiveStride = 0;
1749f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1750f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        for (size_t i = 0; i < m_indexedTransformFeedbackBuffers.size(); ++i)
1751f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedTransformFeedbackBuffers[i] = buf0Binding;
1752f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        for (size_t i = 0; i < m_indexedUniformBuffers.size(); ++i)
1753f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedUniformBuffers[i] = buf0Binding;
1754f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        for (size_t i = 0; i < m_indexedAtomicCounterBuffers.size(); ++i)
1755f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedAtomicCounterBuffers[i] = buf0Binding;
1756f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang        for (size_t i = 0; i < m_indexedShaderStorageBuffers.size(); ++i)
1757f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang            m_indexedShaderStorageBuffers[i] = buf0Binding;
1758f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    }
1759f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1760f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_color_attachments = max_color_attachments;
1761f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_max_draw_buffers = max_draw_buffers;
1762f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1763f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    addFreshRenderbuffer(0);
1764f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    addFreshFramebuffer(0);
1765f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1766f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    m_initialized = true;
1767f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
1768f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang
1769f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yangbool GLClientState::needsInitFromCaps() const {
1770f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang    return !m_initialized;
1771f654f3ff3229303e684b7e0def4fe41781700f5eLingfeng Yang}
1772