144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik/* 244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * Copyright (C) 2015 The Android Open Source Project 344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * 444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * you may not use this file except in compliance with the License. 644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * You may obtain a copy of the License at 744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * 844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * 1044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * Unless required by applicable law or agreed to in writing, software 1144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 1244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * See the License for the specific language governing permissions and 1444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik * limitations under the License. 1544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik */ 16f27133df2d179c99d6bc1ae644af09e9153a0071Chris Craik#include "renderstate/TextureState.h" 1744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 1844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craiknamespace android { 1944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craiknamespace uirenderer { 2044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 2144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik// Must define as many texture units as specified by kTextureUnitsCount 2244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikconst GLenum kTextureUnits[] = { 2344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik GL_TEXTURE0, 2444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik GL_TEXTURE1, 25e310f83d591dc3fb7bd5c684239481a586f00662Chris Craik GL_TEXTURE2, 26e310f83d591dc3fb7bd5c684239481a586f00662Chris Craik GL_TEXTURE3 2744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik}; 2844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 2944eb2c00861098dd3e2950d923646814b4cc57c2Chris CraikTextureState::TextureState() 3044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik : mTextureUnit(0) { 3144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik glActiveTexture(kTextureUnits[0]); 3244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik resetBoundTextures(); 3344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 3444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik GLint maxTextureUnits; 3544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits); 3644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik LOG_ALWAYS_FATAL_IF(maxTextureUnits < kTextureUnitsCount, 37e310f83d591dc3fb7bd5c684239481a586f00662Chris Craik "At least %d texture units are required!", kTextureUnitsCount); 3844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 3944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 4044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::activateTexture(GLuint textureUnit) { 41e310f83d591dc3fb7bd5c684239481a586f00662Chris Craik LOG_ALWAYS_FATAL_IF(textureUnit >= kTextureUnitsCount, 42e310f83d591dc3fb7bd5c684239481a586f00662Chris Craik "Tried to use texture unit index %d, only %d exist", 43e310f83d591dc3fb7bd5c684239481a586f00662Chris Craik textureUnit, kTextureUnitsCount); 4444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik if (mTextureUnit != textureUnit) { 4544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik glActiveTexture(kTextureUnits[textureUnit]); 4644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik mTextureUnit = textureUnit; 4744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } 4844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 4944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 5044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::resetActiveTexture() { 5144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik mTextureUnit = -1; 5244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 5344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 5444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::bindTexture(GLuint texture) { 5544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik if (mBoundTextures[mTextureUnit] != texture) { 5644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik glBindTexture(GL_TEXTURE_2D, texture); 5744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik mBoundTextures[mTextureUnit] = texture; 5844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } 5944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 6044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 6144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::bindTexture(GLenum target, GLuint texture) { 6244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik if (target == GL_TEXTURE_2D) { 6344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik bindTexture(texture); 6444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } else { 6544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // GLConsumer directly calls glBindTexture() with 6644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // target=GL_TEXTURE_EXTERNAL_OES, don't cache this target 6744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // since the cached state could be stale 6844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik glBindTexture(target, texture); 6944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } 7044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 7144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 7244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::deleteTexture(GLuint texture) { 7344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // When glDeleteTextures() is called on a currently bound texture, 7444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // OpenGL ES specifies that the texture is then considered unbound 7544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // Consider the following series of calls: 7644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // 7744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // glGenTextures -> creates texture name 2 7844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // glBindTexture(2) 7944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // glDeleteTextures(2) -> 2 is now unbound 8044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // glGenTextures -> can return 2 again 8144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // 8244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // If we don't call glBindTexture(2) after the second glGenTextures 8344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // call, any texture operation will be performed on the default 8444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik // texture (name=0) 8544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 8644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik unbindTexture(texture); 8744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 8844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik glDeleteTextures(1, &texture); 8944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 9044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 9144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::resetBoundTextures() { 9244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik for (int i = 0; i < kTextureUnitsCount; i++) { 9344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik mBoundTextures[i] = 0; 9444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } 9544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 9644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 9744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craikvoid TextureState::unbindTexture(GLuint texture) { 9844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik for (int i = 0; i < kTextureUnitsCount; i++) { 9944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik if (mBoundTextures[i] == texture) { 10044eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik mBoundTextures[i] = 0; 10144eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } 10244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik } 10344eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} 10444eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 10544eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} /* namespace uirenderer */ 10644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik} /* namespace android */ 10744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik 108