159a677ada27c660e9cd7486f0d702753dbeb6d39magjed/* 259a677ada27c660e9cd7486f0d702753dbeb6d39magjed * libjingle 359a677ada27c660e9cd7486f0d702753dbeb6d39magjed * Copyright 2015 Google Inc. 459a677ada27c660e9cd7486f0d702753dbeb6d39magjed * 559a677ada27c660e9cd7486f0d702753dbeb6d39magjed * Redistribution and use in source and binary forms, with or without 659a677ada27c660e9cd7486f0d702753dbeb6d39magjed * modification, are permitted provided that the following conditions are met: 759a677ada27c660e9cd7486f0d702753dbeb6d39magjed * 859a677ada27c660e9cd7486f0d702753dbeb6d39magjed * 1. Redistributions of source code must retain the above copyright notice, 959a677ada27c660e9cd7486f0d702753dbeb6d39magjed * this list of conditions and the following disclaimer. 1059a677ada27c660e9cd7486f0d702753dbeb6d39magjed * 2. Redistributions in binary form must reproduce the above copyright notice, 1159a677ada27c660e9cd7486f0d702753dbeb6d39magjed * this list of conditions and the following disclaimer in the documentation 1259a677ada27c660e9cd7486f0d702753dbeb6d39magjed * and/or other materials provided with the distribution. 1359a677ada27c660e9cd7486f0d702753dbeb6d39magjed * 3. The name of the author may not be used to endorse or promote products 1459a677ada27c660e9cd7486f0d702753dbeb6d39magjed * derived from this software without specific prior written permission. 1559a677ada27c660e9cd7486f0d702753dbeb6d39magjed * 1659a677ada27c660e9cd7486f0d702753dbeb6d39magjed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1759a677ada27c660e9cd7486f0d702753dbeb6d39magjed * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1859a677ada27c660e9cd7486f0d702753dbeb6d39magjed * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1959a677ada27c660e9cd7486f0d702753dbeb6d39magjed * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2059a677ada27c660e9cd7486f0d702753dbeb6d39magjed * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2159a677ada27c660e9cd7486f0d702753dbeb6d39magjed * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2259a677ada27c660e9cd7486f0d702753dbeb6d39magjed * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2359a677ada27c660e9cd7486f0d702753dbeb6d39magjed * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2459a677ada27c660e9cd7486f0d702753dbeb6d39magjed * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2559a677ada27c660e9cd7486f0d702753dbeb6d39magjed * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2659a677ada27c660e9cd7486f0d702753dbeb6d39magjed */ 2759a677ada27c660e9cd7486f0d702753dbeb6d39magjed 2859a677ada27c660e9cd7486f0d702753dbeb6d39magjedpackage org.webrtc; 2959a677ada27c660e9cd7486f0d702753dbeb6d39magjed 3059a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport android.opengl.GLES11Ext; 3159a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport android.opengl.GLES20; 3259a677ada27c660e9cd7486f0d702753dbeb6d39magjed 3359a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport org.webrtc.GlShader; 3459a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport org.webrtc.GlUtil; 3559a677ada27c660e9cd7486f0d702753dbeb6d39magjed 3659a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport java.nio.ByteBuffer; 3759a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport java.nio.FloatBuffer; 3859a677ada27c660e9cd7486f0d702753dbeb6d39magjedimport java.util.Arrays; 39ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvertimport java.util.IdentityHashMap; 40ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvertimport java.util.Map; 4159a677ada27c660e9cd7486f0d702753dbeb6d39magjed 4259a677ada27c660e9cd7486f0d702753dbeb6d39magjed/** 4351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert * Helper class to draw an opaque quad on the target viewport location. Rotation, mirror, and 4451254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert * cropping is specified using a 4x4 texture coordinate transform matrix. The frame input can either 4551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert * be an OES texture or YUV textures in I420 format. The GL state must be preserved between draw 4651254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert * calls, this is intentional to maximize performance. The function release() must be called 4751254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert * manually to free the resources held by this object. 4859a677ada27c660e9cd7486f0d702753dbeb6d39magjed */ 4951254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvertpublic class GlRectDrawer implements RendererCommon.GlDrawer { 5059a677ada27c660e9cd7486f0d702753dbeb6d39magjed // Simple vertex shader, used for both YUV and OES. 5159a677ada27c660e9cd7486f0d702753dbeb6d39magjed private static final String VERTEX_SHADER_STRING = 52ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert "varying vec2 interp_tc;\n" 5359a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "attribute vec4 in_pos;\n" 5459a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "attribute vec4 in_tc;\n" 5559a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "\n" 5659a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "uniform mat4 texMatrix;\n" 5759a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "\n" 5859a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "void main() {\n" 5959a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " gl_Position = in_pos;\n" 6059a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " interp_tc = (texMatrix * in_tc).xy;\n" 6159a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "}\n"; 6259a677ada27c660e9cd7486f0d702753dbeb6d39magjed 6359a677ada27c660e9cd7486f0d702753dbeb6d39magjed private static final String YUV_FRAGMENT_SHADER_STRING = 64ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert "precision mediump float;\n" 6559a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "varying vec2 interp_tc;\n" 6659a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "\n" 6759a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "uniform sampler2D y_tex;\n" 6859a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "uniform sampler2D u_tex;\n" 6959a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "uniform sampler2D v_tex;\n" 7059a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "\n" 7159a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "void main() {\n" 7259a677ada27c660e9cd7486f0d702753dbeb6d39magjed // CSC according to http://www.fourcc.org/fccyvrgb.php 7359a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " float y = texture2D(y_tex, interp_tc).r;\n" 7459a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " float u = texture2D(u_tex, interp_tc).r - 0.5;\n" 7559a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " float v = texture2D(v_tex, interp_tc).r - 0.5;\n" 7659a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " gl_FragColor = vec4(y + 1.403 * v, " 7759a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " y - 0.344 * u - 0.714 * v, " 7859a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " y + 1.77 * u, 1);\n" 7959a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "}\n"; 8059a677ada27c660e9cd7486f0d702753dbeb6d39magjed 81ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert private static final String RGB_FRAGMENT_SHADER_STRING = 82ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert "precision mediump float;\n" 83ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + "varying vec2 interp_tc;\n" 84ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + "\n" 85ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + "uniform sampler2D rgb_tex;\n" 86ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + "\n" 87ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + "void main() {\n" 88ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + " gl_FragColor = texture2D(rgb_tex, interp_tc);\n" 89ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert + "}\n"; 90ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert 9159a677ada27c660e9cd7486f0d702753dbeb6d39magjed private static final String OES_FRAGMENT_SHADER_STRING = 92ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert "#extension GL_OES_EGL_image_external : require\n" 9359a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "precision mediump float;\n" 9459a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "varying vec2 interp_tc;\n" 9559a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "\n" 9659a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "uniform samplerExternalOES oes_tex;\n" 9759a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "\n" 9859a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "void main() {\n" 9959a677ada27c660e9cd7486f0d702753dbeb6d39magjed + " gl_FragColor = texture2D(oes_tex, interp_tc);\n" 10059a677ada27c660e9cd7486f0d702753dbeb6d39magjed + "}\n"; 10159a677ada27c660e9cd7486f0d702753dbeb6d39magjed 10227551c95744be6e888652b3292b4130cc804f59fMagnus Jedvert // Vertex coordinates in Normalized Device Coordinates, i.e. (-1, -1) is bottom-left and (1, 1) is 10327551c95744be6e888652b3292b4130cc804f59fMagnus Jedvert // top-right. 10459a677ada27c660e9cd7486f0d702753dbeb6d39magjed private static final FloatBuffer FULL_RECTANGLE_BUF = 10559a677ada27c660e9cd7486f0d702753dbeb6d39magjed GlUtil.createFloatBuffer(new float[] { 10659a677ada27c660e9cd7486f0d702753dbeb6d39magjed -1.0f, -1.0f, // Bottom left. 10759a677ada27c660e9cd7486f0d702753dbeb6d39magjed 1.0f, -1.0f, // Bottom right. 10859a677ada27c660e9cd7486f0d702753dbeb6d39magjed -1.0f, 1.0f, // Top left. 10959a677ada27c660e9cd7486f0d702753dbeb6d39magjed 1.0f, 1.0f, // Top right. 11059a677ada27c660e9cd7486f0d702753dbeb6d39magjed }); 11159a677ada27c660e9cd7486f0d702753dbeb6d39magjed 11227551c95744be6e888652b3292b4130cc804f59fMagnus Jedvert // Texture coordinates - (0, 0) is bottom-left and (1, 1) is top-right. 11359a677ada27c660e9cd7486f0d702753dbeb6d39magjed private static final FloatBuffer FULL_RECTANGLE_TEX_BUF = 11459a677ada27c660e9cd7486f0d702753dbeb6d39magjed GlUtil.createFloatBuffer(new float[] { 11559a677ada27c660e9cd7486f0d702753dbeb6d39magjed 0.0f, 0.0f, // Bottom left. 11659a677ada27c660e9cd7486f0d702753dbeb6d39magjed 1.0f, 0.0f, // Bottom right. 11759a677ada27c660e9cd7486f0d702753dbeb6d39magjed 0.0f, 1.0f, // Top left. 11859a677ada27c660e9cd7486f0d702753dbeb6d39magjed 1.0f, 1.0f // Top right. 11959a677ada27c660e9cd7486f0d702753dbeb6d39magjed }); 12059a677ada27c660e9cd7486f0d702753dbeb6d39magjed 12151254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert private static class Shader { 12251254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert public final GlShader glShader; 12351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert public final int texMatrixLocation; 1247afc12fe91e97a3d68de3768a73f3604e5651504Magnus Jedvert 12551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert public Shader(String fragmentShader) { 12651254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert this.glShader = new GlShader(VERTEX_SHADER_STRING, fragmentShader); 12751254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert this.texMatrixLocation = glShader.getUniformLocation("texMatrix"); 1287afc12fe91e97a3d68de3768a73f3604e5651504Magnus Jedvert } 1297afc12fe91e97a3d68de3768a73f3604e5651504Magnus Jedvert } 13059a677ada27c660e9cd7486f0d702753dbeb6d39magjed 13151254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert // The keys are one of the fragments shaders above. 13251254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert private final Map<String, Shader> shaders = new IdentityHashMap<String, Shader>(); 13351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert 13459a677ada27c660e9cd7486f0d702753dbeb6d39magjed /** 13559a677ada27c660e9cd7486f0d702753dbeb6d39magjed * Draw an OES texture frame with specified texture transformation matrix. Required resources are 13659a677ada27c660e9cd7486f0d702753dbeb6d39magjed * allocated at the first call to this function. 13759a677ada27c660e9cd7486f0d702753dbeb6d39magjed */ 13851254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert @Override 13951254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert public void drawOes(int oesTextureId, float[] texMatrix, int x, int y, int width, int height) { 14051254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert prepareShader(OES_FRAGMENT_SHADER_STRING, texMatrix); 14151254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 14259a677ada27c660e9cd7486f0d702753dbeb6d39magjed // updateTexImage() may be called from another thread in another EGL context, so we need to 14359a677ada27c660e9cd7486f0d702753dbeb6d39magjed // bind/unbind the texture in each draw call so that GLES understads it's a new texture. 14459a677ada27c660e9cd7486f0d702753dbeb6d39magjed GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, oesTextureId); 14551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert drawRectangle(x, y, width, height); 14659a677ada27c660e9cd7486f0d702753dbeb6d39magjed GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); 14759a677ada27c660e9cd7486f0d702753dbeb6d39magjed } 14859a677ada27c660e9cd7486f0d702753dbeb6d39magjed 14959a677ada27c660e9cd7486f0d702753dbeb6d39magjed /** 150ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert * Draw a RGB(A) texture frame with specified texture transformation matrix. Required resources 151ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert * are allocated at the first call to this function. 152ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert */ 15351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert @Override 15451254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert public void drawRgb(int textureId, float[] texMatrix, int x, int y, int width, int height) { 15551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert prepareShader(RGB_FRAGMENT_SHADER_STRING, texMatrix); 15651254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 157ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); 15851254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert drawRectangle(x, y, width, height); 159ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert // Unbind the texture as a precaution. 160ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 161ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } 162ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert 163ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert /** 16459a677ada27c660e9cd7486f0d702753dbeb6d39magjed * Draw a YUV frame with specified texture transformation matrix. Required resources are 16559a677ada27c660e9cd7486f0d702753dbeb6d39magjed * allocated at the first call to this function. 16659a677ada27c660e9cd7486f0d702753dbeb6d39magjed */ 16751254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert @Override 16851254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert public void drawYuv(int[] yuvTextures, float[] texMatrix, int x, int y, int width, int height) { 16951254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert prepareShader(YUV_FRAGMENT_SHADER_STRING, texMatrix); 17059a677ada27c660e9cd7486f0d702753dbeb6d39magjed // Bind the textures. 17159a677ada27c660e9cd7486f0d702753dbeb6d39magjed for (int i = 0; i < 3; ++i) { 17259a677ada27c660e9cd7486f0d702753dbeb6d39magjed GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i); 17359a677ada27c660e9cd7486f0d702753dbeb6d39magjed GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]); 17459a677ada27c660e9cd7486f0d702753dbeb6d39magjed } 17551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert drawRectangle(x, y, width, height); 176ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert // Unbind the textures as a precaution.. 177ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert for (int i = 0; i < 3; ++i) { 178ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i); 179ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 180ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } 18159a677ada27c660e9cd7486f0d702753dbeb6d39magjed } 18259a677ada27c660e9cd7486f0d702753dbeb6d39magjed 18351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert private void drawRectangle(int x, int y, int width, int height) { 18459a677ada27c660e9cd7486f0d702753dbeb6d39magjed // Draw quad. 18551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glViewport(x, y, width, height); 18659a677ada27c660e9cd7486f0d702753dbeb6d39magjed GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 18759a677ada27c660e9cd7486f0d702753dbeb6d39magjed } 18859a677ada27c660e9cd7486f0d702753dbeb6d39magjed 18951254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert private void prepareShader(String fragmentShader, float[] texMatrix) { 19051254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert final Shader shader; 19151254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert if (shaders.containsKey(fragmentShader)) { 19251254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader = shaders.get(fragmentShader); 19351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert } else { 19451254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert // Lazy allocation. 19551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader = new Shader(fragmentShader); 196ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert shaders.put(fragmentShader, shader); 19751254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader.glShader.useProgram(); 198ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert // Initialize fragment shader uniform values. 199ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert if (fragmentShader == YUV_FRAGMENT_SHADER_STRING) { 20051254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glUniform1i(shader.glShader.getUniformLocation("y_tex"), 0); 20151254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glUniform1i(shader.glShader.getUniformLocation("u_tex"), 1); 20251254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glUniform1i(shader.glShader.getUniformLocation("v_tex"), 2); 203ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } else if (fragmentShader == RGB_FRAGMENT_SHADER_STRING) { 20451254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glUniform1i(shader.glShader.getUniformLocation("rgb_tex"), 0); 205ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } else if (fragmentShader == OES_FRAGMENT_SHADER_STRING) { 20651254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glUniform1i(shader.glShader.getUniformLocation("oes_tex"), 0); 207ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } else { 208ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert throw new IllegalStateException("Unknown fragment shader: " + fragmentShader); 209ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } 210ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert GlUtil.checkNoGLES2Error("Initialize fragment shader uniform values."); 211ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert // Initialize vertex shader attributes. 21251254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader.glShader.setVertexAttribArray("in_pos", 2, FULL_RECTANGLE_BUF); 21351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader.glShader.setVertexAttribArray("in_tc", 2, FULL_RECTANGLE_TEX_BUF); 214ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } 21551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader.glShader.useProgram(); 21651254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert // Copy the texture transformation matrix over. 21751254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert GLES20.glUniformMatrix4fv(shader.texMatrixLocation, 1, false, texMatrix, 0); 218ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert } 219ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert 22059a677ada27c660e9cd7486f0d702753dbeb6d39magjed /** 22159a677ada27c660e9cd7486f0d702753dbeb6d39magjed * Release all GLES resources. This needs to be done manually, otherwise the resources are leaked. 22259a677ada27c660e9cd7486f0d702753dbeb6d39magjed */ 22351254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert @Override 22459a677ada27c660e9cd7486f0d702753dbeb6d39magjed public void release() { 22551254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert for (Shader shader : shaders.values()) { 22651254331ccb3838b03ed0c630f7e3d5d402d1919Magnus Jedvert shader.glShader.release(); 22759a677ada27c660e9cd7486f0d702753dbeb6d39magjed } 228ed4224fbdaca23a9ba593d07d6809a0943f73528Magnus Jedvert shaders.clear(); 22959a677ada27c660e9cd7486f0d702753dbeb6d39magjed } 23059a677ada27c660e9cd7486f0d702753dbeb6d39magjed} 231