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