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
173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#define ATRACE_TAG ATRACE_TAG_GRAPHICS
183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <GLES2/gl2.h>
20458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#include <GLES2/gl2ext.h>
213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
22c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza#include <ui/Rect.h>
23c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza
243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <utils/String8.h>
253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <utils/Trace.h>
263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <cutils/compiler.h>
28c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews#include <gui/ISurfaceComposer.h>
29c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews#include <math.h>
303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "GLES20RenderEngine.h"
323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Program.h"
333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "ProgramCache.h"
343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Description.h"
353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include "Mesh.h"
3649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian#include "Texture.h"
373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiannamespace android {
403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
413f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
42ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias AgopianGLES20RenderEngine::GLES20RenderEngine() :
43ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        mVpWidth(0), mVpHeight(0) {
443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims);
473f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
493f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glPixelStorei(GL_PACK_ALIGNMENT, 4);
503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
51c6f216955966e93ea983ba800e651af3de6c90e3Andy McFadden    const uint16_t protTexData[] = { 0 };
523f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glGenTextures(1, &mProtectedTexName);
533f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glBindTexture(GL_TEXTURE_2D, mProtectedTexName);
543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
553f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
573f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0,
593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian            GL_RGB, GL_UNSIGNED_SHORT_5_6_5, protTexData);
60ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian
61ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    //mColorBlindnessCorrection = M;
623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias AgopianGLES20RenderEngine::~GLES20RenderEngine() {
653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t GLES20RenderEngine::getMaxTextureSize() const {
693f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    return mMaxTextureSize;
703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
723f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t GLES20RenderEngine::getMaxViewportDims() const {
733f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    return
743f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        mMaxViewportDims[0] < mMaxViewportDims[1] ?
753f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian            mMaxViewportDims[0] : mMaxViewportDims[1];
763f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
773f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
783f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::setViewportAndProjection(
79c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        size_t vpw, size_t vph, Rect sourceCrop, size_t hwh, bool yswap,
80c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        Transform::orientation_flags rotation) {
81c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza
82c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    size_t l = sourceCrop.left;
83c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    size_t r = sourceCrop.right;
84c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza
85c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    // In GL, (0, 0) is the bottom-left corner, so flip y coordinates
86c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    size_t t = hwh - sourceCrop.top;
87c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    size_t b = hwh - sourceCrop.bottom;
88c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza
89a8c386f1c36e916c1df18d41a22104d655a89817Mathias Agopian    mat4 m;
90c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    if (yswap) {
91c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        m = mat4::ortho(l, r, t, b, 0, 1);
92c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    } else {
93c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        m = mat4::ortho(l, r, b, t, 0, 1);
94c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza    }
953f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
96c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    // Apply custom rotation to the projection.
97c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    float rot90InRadians = 2.0f * static_cast<float>(M_PI) / 4.0f;
98c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    switch (rotation) {
99c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        case Transform::ROT_0:
100c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            break;
101c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        case Transform::ROT_90:
102c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            m = mat4::rotate(rot90InRadians, vec3(0,0,1)) * m;
103c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            break;
104c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        case Transform::ROT_180:
105c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            m = mat4::rotate(rot90InRadians * 2.0f, vec3(0,0,1)) * m;
106c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            break;
107c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        case Transform::ROT_270:
108c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            m = mat4::rotate(rot90InRadians * 3.0f, vec3(0,0,1)) * m;
109c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            break;
110c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        default:
111c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            break;
112c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews    }
113c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews
1143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glViewport(0, 0, vpw, vph);
1153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mState.setProjectionMatrix(m);
116ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    mVpWidth = vpw;
117ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    mVpHeight = vph;
1183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
1193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid GLES20RenderEngine::setupLayerBlending(bool premultipliedAlpha,
1229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza        bool opaque, float alpha) {
1239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
1243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::setupLayerBlending(
1253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    bool premultipliedAlpha, bool opaque, int alpha) {
1269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
1273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mState.setPremultipliedAlpha(premultipliedAlpha);
1293f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mState.setOpaque(opaque);
1309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mState.setPlaneAlpha(alpha);
1329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza
1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (alpha < 1.0f || !opaque) {
1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
1353f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mState.setPlaneAlpha(alpha / 255.0f);
1363f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1373f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    if (alpha < 0xFF || !opaque) {
1389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
1393f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glEnable(GL_BLEND);
1403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glBlendFunc(premultipliedAlpha ? GL_ONE : GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1413f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    } else {
1423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glDisable(GL_BLEND);
1433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    }
1443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
1453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid GLES20RenderEngine::setupDimLayerBlending(float alpha) {
1489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
1493f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::setupDimLayerBlending(int alpha) {
1509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
151bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian    mState.setPlaneAlpha(1.0f);
152bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian    mState.setPremultipliedAlpha(true);
153bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian    mState.setOpaque(false);
1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    mState.setColor(0, 0, 0, alpha);
1569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
157bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian    mState.setColor(0, 0, 0, alpha/255.0f);
1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
159bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian    mState.disableTexture();
1603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2
1629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza    if (alpha == 1.0f) {
1639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else
1643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    if (alpha == 0xFF) {
1659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif
1663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glDisable(GL_BLEND);
1673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    } else {
1683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glEnable(GL_BLEND);
1693f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    }
1713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
1723f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
17349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopianvoid GLES20RenderEngine::setupLayerTexturing(const Texture& texture) {
17449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    GLuint target = texture.getTextureTarget();
17549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    glBindTexture(target, texture.getTextureName());
1763f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    GLenum filter = GL_NEAREST;
17749457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    if (texture.getFiltering()) {
1783f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        filter = GL_LINEAR;
1793f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    }
18049457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
18149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
18249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
18349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
1843f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
18549457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mState.setTexture(texture);
1863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
1873f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
1883f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::setupLayerBlackedOut() {
1893f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glBindTexture(GL_TEXTURE_2D, mProtectedTexName);
19049457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    Texture texture(Texture::TEXTURE_2D, mProtectedTexName);
19149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    texture.setDimensions(1, 1); // FIXME: we should get that from somewhere
19249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian    mState.setTexture(texture);
1933f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
1943f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
195f008799d3753e52c10849824ff8146985ea66284Dan Stozamat4 GLES20RenderEngine::setupColorTransform(const mat4& colorTransform) {
196f008799d3753e52c10849824ff8146985ea66284Dan Stoza    mat4 oldTransform = mState.getColorMatrix();
197f008799d3753e52c10849824ff8146985ea66284Dan Stoza    mState.setColorMatrix(colorTransform);
198f008799d3753e52c10849824ff8146985ea66284Dan Stoza    return oldTransform;
199f008799d3753e52c10849824ff8146985ea66284Dan Stoza}
200f008799d3753e52c10849824ff8146985ea66284Dan Stoza
2013f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::disableTexturing() {
2023f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mState.disableTexture();
2033f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
2043f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2053f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::disableBlending() {
2063f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glDisable(GL_BLEND);
2073f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
2083f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
209458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
210458197de008be8fe561286b09f4edddb2f5c540aMathias Agopianvoid GLES20RenderEngine::bindImageAsFramebuffer(EGLImageKHR image,
211458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian        uint32_t* texName, uint32_t* fbName, uint32_t* status) {
212458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    GLuint tname, name;
213458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    // turn our EGLImage into a texture
214458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glGenTextures(1, &tname);
215458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glBindTexture(GL_TEXTURE_2D, tname);
216458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image);
217458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
218458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    // create a Framebuffer Object to render into
219458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glGenFramebuffers(1, &name);
220458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glBindFramebuffer(GL_FRAMEBUFFER, name);
221ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tname, 0);
222458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
223458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    *status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
224458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    *texName = tname;
225458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    *fbName = name;
226458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian}
227458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
228458197de008be8fe561286b09f4edddb2f5c540aMathias Agopianvoid GLES20RenderEngine::unbindFramebuffer(uint32_t texName, uint32_t fbName) {
229458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glBindFramebuffer(GL_FRAMEBUFFER, 0);
230458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glDeleteFramebuffers(1, &fbName);
231458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    glDeleteTextures(1, &texName);
232458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian}
233458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
23419733a32799f792125913e746e8644d16f8dc223Mathias Agopianvoid GLES20RenderEngine::setupFillWithColor(float r, float g, float b, float a) {
23519733a32799f792125913e746e8644d16f8dc223Mathias Agopian    mState.setPlaneAlpha(1.0f);
23619733a32799f792125913e746e8644d16f8dc223Mathias Agopian    mState.setPremultipliedAlpha(true);
23719733a32799f792125913e746e8644d16f8dc223Mathias Agopian    mState.setOpaque(false);
2383f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    mState.setColor(r, g, b, a);
23919733a32799f792125913e746e8644d16f8dc223Mathias Agopian    mState.disableTexture();
2403f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glDisable(GL_BLEND);
2413f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
2423f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2433f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::drawMesh(const Mesh& mesh) {
2443f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2453f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    ProgramCache::getInstance().useProgram(mState);
2463f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2473f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    if (mesh.getTexCoordsSize()) {
2483f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glEnableVertexAttribArray(Program::texCoords);
2493f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glVertexAttribPointer(Program::texCoords,
2503f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian                mesh.getTexCoordsSize(),
2513f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian                GL_FLOAT, GL_FALSE,
2523f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian                mesh.getByteStride(),
2533f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian                mesh.getTexCoords());
2543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    }
2553f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glVertexAttribPointer(Program::position,
2573f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian            mesh.getVertexSize(),
2583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian            GL_FLOAT, GL_FALSE,
2593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian            mesh.getByteStride(),
2605cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian            mesh.getPositions());
2613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    glDrawArrays(mesh.getPrimitive(), 0, mesh.getVertexCount());
2633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2643f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    if (mesh.getTexCoordsSize()) {
2653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian        glDisableVertexAttribArray(Program::texCoords);
2663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    }
2673f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
2683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2693f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid GLES20RenderEngine::dump(String8& result) {
270458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian    RenderEngine::dump(result);
2713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}
2723f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
2733f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
2743f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android
2753f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian// ---------------------------------------------------------------------------
276458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian
277458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#if defined(__gl_h_)
278458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#error "don't include gl/gl.h in this file"
279458197de008be8fe561286b09f4edddb2f5c540aMathias Agopian#endif
280