GLES20RenderEngine.cpp revision 9d96de49673cb6c916bfb797aad4f4e024ea73ca
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 1209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid GLES20RenderEngine::setupLayerBlending(bool premultipliedAlpha, 1229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool opaque, float alpha) { 1239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid GLES20RenderEngine::setupLayerBlending( 1259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard bool premultipliedAlpha, bool opaque, int alpha) { 1269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 1273f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1283f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.setPremultipliedAlpha(premultipliedAlpha); 1293f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mState.setOpaque(opaque); 1309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mState.setPlaneAlpha(alpha); 1329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (alpha < 1.0f || !opaque) { 1349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mState.setPlaneAlpha(alpha / 255.0f); 1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (alpha < 0xFF || !opaque) { 1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#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 1469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid GLES20RenderEngine::setupDimLayerBlending(float alpha) { 1489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid GLES20RenderEngine::setupDimLayerBlending(int alpha) { 1509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 151bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.setPlaneAlpha(1.0f); 152bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.setPremultipliedAlpha(true); 153bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.setOpaque(false); 1549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mState.setColor(0, 0, 0, alpha); 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mState.setColor(0, 0, 0, alpha/255.0f); 1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#endif 159bcab7b17b1c5476935a6f2f916922b4eb57991a4Mathias Agopian mState.disableTexture(); 1603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#ifdef USE_HWC2 1629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (alpha == 1.0f) { 1639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#else 1649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (alpha == 0xFF) { 1659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#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