13f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian/* 23f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Copyright 2013 The Android Open Source Project 33f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * 43f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 53f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * you may not use this file except in compliance with the License. 63f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * You may obtain a copy of the License at 73f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * 83f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 93f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * 103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Unless required by applicable law or agreed to in writing, software 113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * See the License for the specific language governing permissions and 143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * limitations under the License. 153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian */ 163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 175d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter//#define LOG_NDEBUG 0 185d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#undef LOG_TAG 195d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#define LOG_TAG "RenderEngine" 203f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#define ATRACE_TAG ATRACE_TAG_GRAPHICS 213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <GLES2/gl2.h> 23458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#include <GLES2/gl2ext.h> 243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 255d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#include <ui/ColorSpace.h> 265d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#include <ui/DebugUtils.h> 27c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza#include <ui/Rect.h> 28c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza 293f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <utils/String8.h> 303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <utils/Trace.h> 313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <cutils/compiler.h> 33c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews#include <gui/ISurfaceComposer.h> 34c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews#include <math.h> 353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "GLES20RenderEngine.h" 373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Program.h" 383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "ProgramCache.h" 393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Description.h" 403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Mesh.h" 4149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian#include "Texture.h" 423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 435d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> 445d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#include <configstore/Utils.h> 455d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 465d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#include <fstream> 475d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 485d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter// --------------------------------------------------------------------------- 494f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#ifdef USE_HWC2 505d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchterbool checkGlError(const char* op, int lineNumber) { 515d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter bool errorFound = false; 525d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter GLint error = glGetError(); 535d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter while (error != GL_NO_ERROR) { 545d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter errorFound = true; 555d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter error = glGetError(); 565d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGV("after %s() (line # %d) glError (0x%x)\n", op, lineNumber, error); 575d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 585d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter return errorFound; 595d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter} 605d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 614f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchterstatic constexpr bool outputDebugPPMs = false; 624f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter 635d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchtervoid writePPM(const char* basename, GLuint width, GLuint height) { 645d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGV("writePPM #%s: %d x %d", basename, width, height); 655d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 665d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter std::vector<GLubyte> pixels(width * height * 4); 675d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter std::vector<GLubyte> outBuffer(width * height * 3); 685d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 695d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // TODO(courtneygo): We can now have float formats, need 705d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // to remove this code or update to support. 715d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // Make returned pixels fit in uint32_t, one byte per component 725d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); 735d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (checkGlError(__FUNCTION__, __LINE__)) { 745d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter return; 755d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 765d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 775d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter std::string filename(basename); 785d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter filename.append(".ppm"); 795d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter std::ofstream file(filename.c_str(), std::ios::binary); 805d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (!file.is_open()) { 815d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGE("Unable to open file: %s", filename.c_str()); 825d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGE("You may need to do: \"adb shell setenforce 0\" to enable " 835d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter "surfaceflinger to write debug images"); 845d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter return; 855d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 865d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 875d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter file << "P6\n"; 885d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter file << width << "\n"; 895d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter file << height << "\n"; 905d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter file << 255 << "\n"; 915d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 925d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter auto ptr = reinterpret_cast<char*>(pixels.data()); 935d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter auto outPtr = reinterpret_cast<char*>(outBuffer.data()); 945d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter for (int y = height - 1; y >= 0; y--) { 955d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter char* data = ptr + y * width * sizeof(uint32_t); 965d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 975d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter for (GLuint x = 0; x < width; x++) { 985d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // Only copy R, G and B components 995d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter outPtr[0] = data[0]; 1005d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter outPtr[1] = data[1]; 1015d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter outPtr[2] = data[2]; 1025d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter data += sizeof(uint32_t); 1035d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter outPtr += 3; 1045d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 1055d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 1065d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size()); 1075d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter} 1084f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#endif 1095d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 1103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// --------------------------------------------------------------------------- 1113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiannamespace android { 1123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// --------------------------------------------------------------------------- 1133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 114ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias AgopianGLES20RenderEngine::GLES20RenderEngine() : 115ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian mVpWidth(0), mVpHeight(0) { 1163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize); 1183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims); 1193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1203f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 1213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glPixelStorei(GL_PACK_ALIGNMENT, 4); 1223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 123c6f216955966e93ea983ba800e651af3de6c90e3Andy McFadden const uint16_t protTexData[] = { 0 }; 1243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glGenTextures(1, &mProtectedTexName); 1253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glBindTexture(GL_TEXTURE_2D, mProtectedTexName); 1263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1293f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 1303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, 1313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, protTexData); 132ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian 133ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian //mColorBlindnessCorrection = M; 1345d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 1354f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#ifdef USE_HWC2 1365d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // retrieve wide-color and hdr settings from configstore 1375d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter using namespace android::hardware::configstore; 1385d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter using namespace android::hardware::configstore::V1_0; 1395d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 1405d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mPlatformHasWideColor = 1415d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasWideColorDisplay>(false); 1425d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (mPlatformHasWideColor) { 1435d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // Compute sRGB to DisplayP3 color transform 1445d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // NOTE: For now, we are limiting wide-color support to 1455d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // Display-P3 only. 1465d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mat3 srgbToP3 = ColorSpace::DisplayP3().getXYZtoRGB() * ColorSpace::sRGB().getRGBtoXYZ(); 1475d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 1485d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // color transform needs to be transposed and expanded to 4x4 1495d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // to be what the shader wants 1505d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // mat has an initializer that expands mat3 to mat4, but 1515d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // not an assignment operator 1525d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mat4 gamutTransform(transpose(srgbToP3)); 1535d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mSrgbToDisplayP3 = gamutTransform; 1545d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 1554f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#endif 1563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 1573f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias AgopianGLES20RenderEngine::~GLES20RenderEngine() { 1593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 1603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t GLES20RenderEngine::getMaxTextureSize() const { 1633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mMaxTextureSize; 1643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 1653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t GLES20RenderEngine::getMaxViewportDims() const { 1673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return 1683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mMaxViewportDims[0] < mMaxViewportDims[1] ? 1693f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mMaxViewportDims[0] : mMaxViewportDims[1]; 1703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 1713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1723f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::setViewportAndProjection( 173c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews size_t vpw, size_t vph, Rect sourceCrop, size_t hwh, bool yswap, 174c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews Transform::orientation_flags rotation) { 175c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza 176c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza size_t l = sourceCrop.left; 177c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza size_t r = sourceCrop.right; 178c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza 179c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza // In GL, (0, 0) is the bottom-left corner, so flip y coordinates 180c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza size_t t = hwh - sourceCrop.top; 181c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza size_t b = hwh - sourceCrop.bottom; 182c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza 183a8c386f1c36e916c1df18d41a22104d655a89817Mathias Agopian mat4 m; 184c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza if (yswap) { 185c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza m = mat4::ortho(l, r, t, b, 0, 1); 186c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza } else { 187c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza m = mat4::ortho(l, r, b, t, 0, 1); 188c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza } 1893f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 190c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews // Apply custom rotation to the projection. 191c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews float rot90InRadians = 2.0f * static_cast<float>(M_PI) / 4.0f; 192c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews switch (rotation) { 193c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews case Transform::ROT_0: 194c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews break; 195c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews case Transform::ROT_90: 196c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews m = mat4::rotate(rot90InRadians, vec3(0,0,1)) * m; 197c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews break; 198c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews case Transform::ROT_180: 199c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews m = mat4::rotate(rot90InRadians * 2.0f, vec3(0,0,1)) * m; 200c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews break; 201c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews case Transform::ROT_270: 202c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews m = mat4::rotate(rot90InRadians * 3.0f, vec3(0,0,1)) * m; 203c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews break; 204c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews default: 205c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews break; 206c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews } 207c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews 2083f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glViewport(0, 0, vpw, vph); 2093f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.setProjectionMatrix(m); 210ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian mVpWidth = vpw; 211ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian mVpHeight = vph; 2123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 2133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid GLES20RenderEngine::setupLayerBlending(bool premultipliedAlpha, 2169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool opaque, float alpha) { 2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid GLES20RenderEngine::setupLayerBlending( 2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard bool premultipliedAlpha, bool opaque, int alpha) { 2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 2223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.setPremultipliedAlpha(premultipliedAlpha); 2233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.setOpaque(opaque); 2249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mState.setPlaneAlpha(alpha); 2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (alpha < 1.0f || !opaque) { 2289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mState.setPlaneAlpha(alpha / 255.0f); 2309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (alpha < 0xFF || !opaque) { 2329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glEnable(GL_BLEND); 2343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glBlendFunc(premultipliedAlpha ? GL_ONE : GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } else { 2363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glDisable(GL_BLEND); 2373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } 2383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 2393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 2409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid GLES20RenderEngine::setupDimLayerBlending(float alpha) { 2429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid GLES20RenderEngine::setupDimLayerBlending(int alpha) { 2449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 245bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.setPlaneAlpha(1.0f); 246bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.setPremultipliedAlpha(true); 247bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.setOpaque(false); 2489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mState.setColor(0, 0, 0, alpha); 2509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mState.setColor(0, 0, 0, alpha/255.0f); 2529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 253bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.disableTexture(); 2543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 2559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (alpha == 1.0f) { 2579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 2589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (alpha == 0xFF) { 2599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 2603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glDisable(GL_BLEND); 2613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } else { 2623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glEnable(GL_BLEND); 2633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 2643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } 2653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 2663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 2675d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#ifdef USE_HWC2 2685d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchtervoid GLES20RenderEngine::setColorMode(android_color_mode mode) { 2695d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGV("setColorMode: %s (0x%x)", decodeColorMode(mode).c_str(), mode); 2705d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 2715d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (mColorMode == mode) return; 2725d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 2735d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (!mPlatformHasWideColor || !mDisplayHasWideColor || mode == HAL_COLOR_MODE_SRGB || 2745d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mode == HAL_COLOR_MODE_NATIVE) { 2755d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // We are returning back to our default color_mode 2765d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mUseWideColor = false; 2775d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mWideColorFrameCount = 0; 2785d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } else { 2795d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mUseWideColor = true; 2805d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 2815d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 2825d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mColorMode = mode; 2835d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter} 2845d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 2855d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchtervoid GLES20RenderEngine::setSourceDataSpace(android_dataspace source) { 2865d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (source == HAL_DATASPACE_UNKNOWN) { 2875d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter // Treat UNKNOWN as SRGB 2885d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter source = HAL_DATASPACE_V0_SRGB; 2895d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 2905d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mDataSpace = source; 2915d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter} 2925d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 2935d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchtervoid GLES20RenderEngine::setWideColor(bool hasWideColor) { 2945d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGV("setWideColor: %s", hasWideColor ? "true" : "false"); 2955d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter mDisplayHasWideColor = hasWideColor; 2965d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter} 2975d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 2985d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchterbool GLES20RenderEngine::usesWideColor() { 2995d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter return mUseWideColor; 3005d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter} 3015d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter#endif 3025d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 30349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopianvoid GLES20RenderEngine::setupLayerTexturing(const Texture& texture) { 30449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian GLuint target = texture.getTextureTarget(); 30549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian glBindTexture(target, texture.getTextureName()); 3063f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian GLenum filter = GL_NEAREST; 30749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian if (texture.getFiltering()) { 3083f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian filter = GL_LINEAR; 3093f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } 31049457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 31149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 31249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); 31349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); 3143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 31549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mState.setTexture(texture); 3163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 3173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 3183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::setupLayerBlackedOut() { 3193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glBindTexture(GL_TEXTURE_2D, mProtectedTexName); 32049457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian Texture texture(Texture::TEXTURE_2D, mProtectedTexName); 32149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian texture.setDimensions(1, 1); // FIXME: we should get that from somewhere 32249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mState.setTexture(texture); 3233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 3243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 325f008799d3753e52c10849824ff8146985ea66284Dan Stozamat4 GLES20RenderEngine::setupColorTransform(const mat4& colorTransform) { 326f008799d3753e52c10849824ff8146985ea66284Dan Stoza mat4 oldTransform = mState.getColorMatrix(); 327f008799d3753e52c10849824ff8146985ea66284Dan Stoza mState.setColorMatrix(colorTransform); 328f008799d3753e52c10849824ff8146985ea66284Dan Stoza return oldTransform; 329f008799d3753e52c10849824ff8146985ea66284Dan Stoza} 330f008799d3753e52c10849824ff8146985ea66284Dan Stoza 3313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::disableTexturing() { 3323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.disableTexture(); 3333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 3343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 3353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::disableBlending() { 3363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glDisable(GL_BLEND); 3373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 3383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 339458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian 340458197de008be8fe561286b09f4edddb2f5c540aMathias Agopianvoid GLES20RenderEngine::bindImageAsFramebuffer(EGLImageKHR image, 341458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian uint32_t* texName, uint32_t* fbName, uint32_t* status) { 342458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian GLuint tname, name; 343458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian // turn our EGLImage into a texture 344458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glGenTextures(1, &tname); 345458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glBindTexture(GL_TEXTURE_2D, tname); 346458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image); 347458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian 348458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian // create a Framebuffer Object to render into 349458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glGenFramebuffers(1, &name); 350458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glBindFramebuffer(GL_FRAMEBUFFER, name); 351ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tname, 0); 352458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian 353458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian *status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 354458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian *texName = tname; 355458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian *fbName = name; 356458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian} 357458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian 358458197de008be8fe561286b09f4edddb2f5c540aMathias Agopianvoid GLES20RenderEngine::unbindFramebuffer(uint32_t texName, uint32_t fbName) { 359458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glBindFramebuffer(GL_FRAMEBUFFER, 0); 360458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glDeleteFramebuffers(1, &fbName); 361458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian glDeleteTextures(1, &texName); 362458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian} 363458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian 36419733a32799f792125913e746e8644d16f8dc223Mathias Agopianvoid GLES20RenderEngine::setupFillWithColor(float r, float g, float b, float a) { 36519733a32799f792125913e746e8644d16f8dc223Mathias Agopian mState.setPlaneAlpha(1.0f); 36619733a32799f792125913e746e8644d16f8dc223Mathias Agopian mState.setPremultipliedAlpha(true); 36719733a32799f792125913e746e8644d16f8dc223Mathias Agopian mState.setOpaque(false); 3683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.setColor(r, g, b, a); 36919733a32799f792125913e746e8644d16f8dc223Mathias Agopian mState.disableTexture(); 3703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glDisable(GL_BLEND); 3713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 3723f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 3733f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::drawMesh(const Mesh& mesh) { 3743f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 3753f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian if (mesh.getTexCoordsSize()) { 3763f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glEnableVertexAttribArray(Program::texCoords); 3773f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glVertexAttribPointer(Program::texCoords, 3783f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mesh.getTexCoordsSize(), 3793f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian GL_FLOAT, GL_FALSE, 3803f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mesh.getByteStride(), 3813f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mesh.getTexCoords()); 3823f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } 3833f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 3843f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glVertexAttribPointer(Program::position, 3853f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mesh.getVertexSize(), 3863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian GL_FLOAT, GL_FALSE, 3873f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mesh.getByteStride(), 3885cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mesh.getPositions()); 3893f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 3904f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#ifdef USE_HWC2 3915d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (usesWideColor()) { 3925d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter Description wideColorState = mState; 3935d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (mDataSpace != HAL_DATASPACE_DISPLAY_P3) { 3945d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter wideColorState.setColorMatrix(mState.getColorMatrix() * mSrgbToDisplayP3); 3955d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ALOGV("drawMesh: gamut transform applied"); 3965d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 3975d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ProgramCache::getInstance().useProgram(wideColorState); 3985d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 3995d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter glDrawArrays(mesh.getPrimitive(), 0, mesh.getVertexCount()); 4005d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 4015d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (outputDebugPPMs) { 4025d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter std::ostringstream out; 4035d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter out << "/data/texture_out" << mWideColorFrameCount++; 4045d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter writePPM(out.str().c_str(), mVpWidth, mVpHeight); 4055d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 4065d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } else { 4075d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter ProgramCache::getInstance().useProgram(mState); 4085d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter 4095d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter glDrawArrays(mesh.getPrimitive(), 0, mesh.getVertexCount()); 4105d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 4114f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#else 4124f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter ProgramCache::getInstance().useProgram(mState); 4134f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter 4144f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter glDrawArrays(mesh.getPrimitive(), 0, mesh.getVertexCount()); 4154f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#endif 4163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 4173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian if (mesh.getTexCoordsSize()) { 4183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian glDisableVertexAttribArray(Program::texCoords); 4193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian } 4203f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 4213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 4223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::dump(String8& result) { 423458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian RenderEngine::dump(result); 4244f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#ifdef USE_HWC2 4255d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter if (usesWideColor()) { 426f3b2de10caa2a96e65f3e8ebecb2730ff28aeeb1Courtney Goeltzenleuchter result.append("Wide-color: On\n"); 4275d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } else { 428f3b2de10caa2a96e65f3e8ebecb2730ff28aeeb1Courtney Goeltzenleuchter result.append("Wide-color: Off\n"); 4295d94389241cc651e6bd327ab80eba3ad476f3724Courtney Goeltzenleuchter } 4304f20f9cf3268dad96d9064dcb0e4a11aae96f6f3Courtney Goeltzenleuchter#endif 4313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 4323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 4333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// --------------------------------------------------------------------------- 4343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 4353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// --------------------------------------------------------------------------- 436458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian 437458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#if defined(__gl_h_) 438458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#error "don't include gl/gl.h in this file" 439458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#endif 440