MeshState.cpp revision 08fa43fdeb646f56edcd8b33d06ee7d79b203426
196a5c4c7bab6718524de7253da8309143ab48befChris Craik/* 296a5c4c7bab6718524de7253da8309143ab48befChris Craik * Copyright (C) 2015 The Android Open Source Project 396a5c4c7bab6718524de7253da8309143ab48befChris Craik * 496a5c4c7bab6718524de7253da8309143ab48befChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 596a5c4c7bab6718524de7253da8309143ab48befChris Craik * you may not use this file except in compliance with the License. 696a5c4c7bab6718524de7253da8309143ab48befChris Craik * You may obtain a copy of the License at 796a5c4c7bab6718524de7253da8309143ab48befChris Craik * 896a5c4c7bab6718524de7253da8309143ab48befChris Craik * http://www.apache.org/licenses/LICENSE-2.0 996a5c4c7bab6718524de7253da8309143ab48befChris Craik * 1096a5c4c7bab6718524de7253da8309143ab48befChris Craik * Unless required by applicable law or agreed to in writing, software 1196a5c4c7bab6718524de7253da8309143ab48befChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 1296a5c4c7bab6718524de7253da8309143ab48befChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1396a5c4c7bab6718524de7253da8309143ab48befChris Craik * See the License for the specific language governing permissions and 1496a5c4c7bab6718524de7253da8309143ab48befChris Craik * limitations under the License. 1596a5c4c7bab6718524de7253da8309143ab48befChris Craik */ 1696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/MeshState.h" 1796a5c4c7bab6718524de7253da8309143ab48befChris Craik 1896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Program.h" 1996a5c4c7bab6718524de7253da8309143ab48befChris Craik 2096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ShadowTessellator.h" 2196a5c4c7bab6718524de7253da8309143ab48befChris Craik 2296a5c4c7bab6718524de7253da8309143ab48befChris Craiknamespace android { 2396a5c4c7bab6718524de7253da8309143ab48befChris Craiknamespace uirenderer { 2496a5c4c7bab6718524de7253da8309143ab48befChris Craik 2596a5c4c7bab6718524de7253da8309143ab48befChris CraikMeshState::MeshState() 26117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik : mCurrentIndicesBuffer(0) 27117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik , mCurrentPixelBuffer(0) 28117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik , mCurrentPositionPointer(this) 2996a5c4c7bab6718524de7253da8309143ab48befChris Craik , mCurrentPositionStride(0) 3096a5c4c7bab6718524de7253da8309143ab48befChris Craik , mCurrentTexCoordsPointer(this) 3196a5c4c7bab6718524de7253da8309143ab48befChris Craik , mCurrentTexCoordsStride(0) 32117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik , mTexCoordsArrayEnabled(false) 33117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik , mQuadListIndices(0) { 34031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik glGenBuffers(1, &mUnitQuadBuffer); 35031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik glBindBuffer(GL_ARRAY_BUFFER, mUnitQuadBuffer); 36031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik glBufferData(GL_ARRAY_BUFFER, sizeof(kUnitQuadVertices), kUnitQuadVertices, GL_STATIC_DRAW); 3796a5c4c7bab6718524de7253da8309143ab48befChris Craik 38031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik mCurrentBuffer = mUnitQuadBuffer; 396c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik 402ab95d780b023152556d9f8659de734ec7b55047Chris Craik std::unique_ptr<uint16_t[]> regionIndices(new uint16_t[kMaxNumberOfQuads * 6]); 412ab95d780b023152556d9f8659de734ec7b55047Chris Craik for (uint32_t i = 0; i < kMaxNumberOfQuads; i++) { 422ab95d780b023152556d9f8659de734ec7b55047Chris Craik uint16_t quad = i * 4; 432ab95d780b023152556d9f8659de734ec7b55047Chris Craik int index = i * 6; 442ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices[index ] = quad; // top-left 452ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices[index + 1] = quad + 1; // top-right 462ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices[index + 2] = quad + 2; // bottom-left 472ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices[index + 3] = quad + 2; // bottom-left 482ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices[index + 4] = quad + 1; // top-right 492ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices[index + 5] = quad + 3; // bottom-right 502ab95d780b023152556d9f8659de734ec7b55047Chris Craik } 512ab95d780b023152556d9f8659de734ec7b55047Chris Craik glGenBuffers(1, &mQuadListIndices); 522ab95d780b023152556d9f8659de734ec7b55047Chris Craik glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mQuadListIndices); 532ab95d780b023152556d9f8659de734ec7b55047Chris Craik glBufferData(GL_ELEMENT_ARRAY_BUFFER, kMaxNumberOfQuads * 6 * sizeof(uint16_t), 542ab95d780b023152556d9f8659de734ec7b55047Chris Craik regionIndices.get(), GL_STATIC_DRAW); 552ab95d780b023152556d9f8659de734ec7b55047Chris Craik mCurrentIndicesBuffer = mQuadListIndices; 562ab95d780b023152556d9f8659de734ec7b55047Chris Craik 576c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik // position attribute always enabled 586c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik glEnableVertexAttribArray(Program::kBindingPosition); 5996a5c4c7bab6718524de7253da8309143ab48befChris Craik} 6096a5c4c7bab6718524de7253da8309143ab48befChris Craik 6196a5c4c7bab6718524de7253da8309143ab48befChris CraikMeshState::~MeshState() { 62031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik glDeleteBuffers(1, &mUnitQuadBuffer); 6396a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentBuffer = 0; 6496a5c4c7bab6718524de7253da8309143ab48befChris Craik 6596a5c4c7bab6718524de7253da8309143ab48befChris Craik glDeleteBuffers(1, &mQuadListIndices); 6696a5c4c7bab6718524de7253da8309143ab48befChris Craik mQuadListIndices = 0; 67117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik} 6896a5c4c7bab6718524de7253da8309143ab48befChris Craik 69117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikvoid MeshState::dump() { 7008fa43fdeb646f56edcd8b33d06ee7d79b203426Chris Craik ALOGD("MeshState VBOs: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer); 7108fa43fdeb646f56edcd8b33d06ee7d79b203426Chris Craik ALOGD("MeshState vertices: vertex data %p, stride %d", 7208fa43fdeb646f56edcd8b33d06ee7d79b203426Chris Craik mCurrentPositionPointer, mCurrentPositionStride); 7308fa43fdeb646f56edcd8b33d06ee7d79b203426Chris Craik ALOGD("MeshState texCoord: data %p, stride %d", 7408fa43fdeb646f56edcd8b33d06ee7d79b203426Chris Craik mCurrentTexCoordsPointer, mCurrentTexCoordsStride); 7596a5c4c7bab6718524de7253da8309143ab48befChris Craik} 7696a5c4c7bab6718524de7253da8309143ab48befChris Craik 7796a5c4c7bab6718524de7253da8309143ab48befChris Craik/////////////////////////////////////////////////////////////////////////////// 7896a5c4c7bab6718524de7253da8309143ab48befChris Craik// Buffer Objects 7996a5c4c7bab6718524de7253da8309143ab48befChris Craik/////////////////////////////////////////////////////////////////////////////// 8096a5c4c7bab6718524de7253da8309143ab48befChris Craik 8196a5c4c7bab6718524de7253da8309143ab48befChris Craikbool MeshState::bindMeshBuffer() { 82031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik return bindMeshBuffer(mUnitQuadBuffer); 8396a5c4c7bab6718524de7253da8309143ab48befChris Craik} 8496a5c4c7bab6718524de7253da8309143ab48befChris Craik 8596a5c4c7bab6718524de7253da8309143ab48befChris Craikbool MeshState::bindMeshBuffer(GLuint buffer) { 86031888744e24b5c7243ac99ec98b78aff5db1c78Chris Craik if (!buffer) buffer = mUnitQuadBuffer; 87117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik return bindMeshBufferInternal(buffer); 8896a5c4c7bab6718524de7253da8309143ab48befChris Craik} 8996a5c4c7bab6718524de7253da8309143ab48befChris Craik 9096a5c4c7bab6718524de7253da8309143ab48befChris Craikbool MeshState::unbindMeshBuffer() { 91117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik return bindMeshBufferInternal(0); 92117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik} 93117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik 94117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikbool MeshState::bindMeshBufferInternal(GLuint buffer) { 95117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik if (mCurrentBuffer != buffer) { 96117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik glBindBuffer(GL_ARRAY_BUFFER, buffer); 97117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik mCurrentBuffer = buffer; 9896a5c4c7bab6718524de7253da8309143ab48befChris Craik return true; 9996a5c4c7bab6718524de7253da8309143ab48befChris Craik } 10096a5c4c7bab6718524de7253da8309143ab48befChris Craik return false; 10196a5c4c7bab6718524de7253da8309143ab48befChris Craik} 10296a5c4c7bab6718524de7253da8309143ab48befChris Craik 10396a5c4c7bab6718524de7253da8309143ab48befChris Craik/////////////////////////////////////////////////////////////////////////////// 10496a5c4c7bab6718524de7253da8309143ab48befChris Craik// Vertices 10596a5c4c7bab6718524de7253da8309143ab48befChris Craik/////////////////////////////////////////////////////////////////////////////// 10696a5c4c7bab6718524de7253da8309143ab48befChris Craik 1076c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikvoid MeshState::bindPositionVertexPointer(bool force, const GLvoid* vertices, GLsizei stride) { 10896a5c4c7bab6718524de7253da8309143ab48befChris Craik if (force || vertices != mCurrentPositionPointer || stride != mCurrentPositionStride) { 1096c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik glVertexAttribPointer(Program::kBindingPosition, 2, GL_FLOAT, GL_FALSE, stride, vertices); 11096a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentPositionPointer = vertices; 11196a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentPositionStride = stride; 11296a5c4c7bab6718524de7253da8309143ab48befChris Craik } 11396a5c4c7bab6718524de7253da8309143ab48befChris Craik} 11496a5c4c7bab6718524de7253da8309143ab48befChris Craik 1156c15ffa196fc9b7724c189d833c3435d8db12266Chris Craikvoid MeshState::bindTexCoordsVertexPointer(bool force, const GLvoid* vertices, GLsizei stride) { 11696a5c4c7bab6718524de7253da8309143ab48befChris Craik if (force || vertices != mCurrentTexCoordsPointer || stride != mCurrentTexCoordsStride) { 1176c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik glVertexAttribPointer(Program::kBindingTexCoords, 2, GL_FLOAT, GL_FALSE, stride, vertices); 11896a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentTexCoordsPointer = vertices; 11996a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentTexCoordsStride = stride; 12096a5c4c7bab6718524de7253da8309143ab48befChris Craik } 12196a5c4c7bab6718524de7253da8309143ab48befChris Craik} 12296a5c4c7bab6718524de7253da8309143ab48befChris Craik 12396a5c4c7bab6718524de7253da8309143ab48befChris Craikvoid MeshState::resetVertexPointers() { 12496a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentPositionPointer = this; 12596a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentTexCoordsPointer = this; 12696a5c4c7bab6718524de7253da8309143ab48befChris Craik} 12796a5c4c7bab6718524de7253da8309143ab48befChris Craik 12896a5c4c7bab6718524de7253da8309143ab48befChris Craikvoid MeshState::resetTexCoordsVertexPointer() { 12996a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentTexCoordsPointer = this; 13096a5c4c7bab6718524de7253da8309143ab48befChris Craik} 13196a5c4c7bab6718524de7253da8309143ab48befChris Craik 13296a5c4c7bab6718524de7253da8309143ab48befChris Craikvoid MeshState::enableTexCoordsVertexArray() { 13396a5c4c7bab6718524de7253da8309143ab48befChris Craik if (!mTexCoordsArrayEnabled) { 13496a5c4c7bab6718524de7253da8309143ab48befChris Craik glEnableVertexAttribArray(Program::kBindingTexCoords); 13596a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentTexCoordsPointer = this; 13696a5c4c7bab6718524de7253da8309143ab48befChris Craik mTexCoordsArrayEnabled = true; 13796a5c4c7bab6718524de7253da8309143ab48befChris Craik } 13896a5c4c7bab6718524de7253da8309143ab48befChris Craik} 13996a5c4c7bab6718524de7253da8309143ab48befChris Craik 14096a5c4c7bab6718524de7253da8309143ab48befChris Craikvoid MeshState::disableTexCoordsVertexArray() { 14196a5c4c7bab6718524de7253da8309143ab48befChris Craik if (mTexCoordsArrayEnabled) { 14296a5c4c7bab6718524de7253da8309143ab48befChris Craik glDisableVertexAttribArray(Program::kBindingTexCoords); 14396a5c4c7bab6718524de7253da8309143ab48befChris Craik mTexCoordsArrayEnabled = false; 14496a5c4c7bab6718524de7253da8309143ab48befChris Craik } 14596a5c4c7bab6718524de7253da8309143ab48befChris Craik} 14696a5c4c7bab6718524de7253da8309143ab48befChris Craik 14796a5c4c7bab6718524de7253da8309143ab48befChris Craik/////////////////////////////////////////////////////////////////////////////// 14896a5c4c7bab6718524de7253da8309143ab48befChris Craik// Indices 14996a5c4c7bab6718524de7253da8309143ab48befChris Craik/////////////////////////////////////////////////////////////////////////////// 15096a5c4c7bab6718524de7253da8309143ab48befChris Craik 15196a5c4c7bab6718524de7253da8309143ab48befChris Craikbool MeshState::bindIndicesBufferInternal(const GLuint buffer) { 15296a5c4c7bab6718524de7253da8309143ab48befChris Craik if (mCurrentIndicesBuffer != buffer) { 15396a5c4c7bab6718524de7253da8309143ab48befChris Craik glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); 15496a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentIndicesBuffer = buffer; 15596a5c4c7bab6718524de7253da8309143ab48befChris Craik return true; 15696a5c4c7bab6718524de7253da8309143ab48befChris Craik } 15796a5c4c7bab6718524de7253da8309143ab48befChris Craik return false; 15896a5c4c7bab6718524de7253da8309143ab48befChris Craik} 15996a5c4c7bab6718524de7253da8309143ab48befChris Craik 16096a5c4c7bab6718524de7253da8309143ab48befChris Craikbool MeshState::bindQuadIndicesBuffer() { 16196a5c4c7bab6718524de7253da8309143ab48befChris Craik return bindIndicesBufferInternal(mQuadListIndices); 16296a5c4c7bab6718524de7253da8309143ab48befChris Craik} 16396a5c4c7bab6718524de7253da8309143ab48befChris Craik 16496a5c4c7bab6718524de7253da8309143ab48befChris Craikbool MeshState::unbindIndicesBuffer() { 16596a5c4c7bab6718524de7253da8309143ab48befChris Craik if (mCurrentIndicesBuffer) { 16696a5c4c7bab6718524de7253da8309143ab48befChris Craik glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 16796a5c4c7bab6718524de7253da8309143ab48befChris Craik mCurrentIndicesBuffer = 0; 16896a5c4c7bab6718524de7253da8309143ab48befChris Craik return true; 16996a5c4c7bab6718524de7253da8309143ab48befChris Craik } 17096a5c4c7bab6718524de7253da8309143ab48befChris Craik return false; 17196a5c4c7bab6718524de7253da8309143ab48befChris Craik} 17296a5c4c7bab6718524de7253da8309143ab48befChris Craik 17396a5c4c7bab6718524de7253da8309143ab48befChris Craik} /* namespace uirenderer */ 17496a5c4c7bab6718524de7253da8309143ab48befChris Craik} /* namespace android */ 17596a5c4c7bab6718524de7253da8309143ab48befChris Craik 176