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