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