| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 */ | 26 */ |
| 27 | 27 |
| 28 package org.webrtc; | 28 package org.webrtc; |
| 29 | 29 |
| 30 import android.opengl.GLES20; | 30 import android.opengl.GLES20; |
| 31 import android.util.Log; | 31 |
| 32 import org.webrtc.Logging; |
| 32 | 33 |
| 33 import java.nio.FloatBuffer; | 34 import java.nio.FloatBuffer; |
| 34 | 35 |
| 35 // Helper class for handling OpenGL shaders and shader programs. | 36 // Helper class for handling OpenGL shaders and shader programs. |
| 36 public class GlShader { | 37 public class GlShader { |
| 37 private static final String TAG = "GlShader"; | 38 private static final String TAG = "GlShader"; |
| 38 | 39 |
| 39 private static int compileShader(int shaderType, String source) { | 40 private static int compileShader(int shaderType, String source) { |
| 40 int[] result = new int[] { | 41 int[] result = new int[] { |
| 41 GLES20.GL_FALSE | 42 GLES20.GL_FALSE |
| 42 }; | 43 }; |
| 43 int shader = GLES20.glCreateShader(shaderType); | 44 int shader = GLES20.glCreateShader(shaderType); |
| 44 GLES20.glShaderSource(shader, source); | 45 GLES20.glShaderSource(shader, source); |
| 45 GLES20.glCompileShader(shader); | 46 GLES20.glCompileShader(shader); |
| 46 GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); | 47 GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); |
| 47 if (result[0] != GLES20.GL_TRUE) { | 48 if (result[0] != GLES20.GL_TRUE) { |
| 48 Log.e(TAG, "Could not compile shader " + shaderType + ":" + | 49 Logging.e(TAG, "Could not compile shader " + shaderType + ":" + |
| 49 GLES20.glGetShaderInfoLog(shader)); | 50 GLES20.glGetShaderInfoLog(shader)); |
| 50 throw new RuntimeException(GLES20.glGetShaderInfoLog(shader)); | 51 throw new RuntimeException(GLES20.glGetShaderInfoLog(shader)); |
| 51 } | 52 } |
| 52 GlUtil.checkNoGLES2Error("compileShader"); | 53 GlUtil.checkNoGLES2Error("compileShader"); |
| 53 return shader; | 54 return shader; |
| 54 } | 55 } |
| 55 | 56 |
| 56 private int vertexShader; | 57 private int vertexShader; |
| 57 private int fragmentShader; | 58 private int fragmentShader; |
| 58 private int program; | 59 private int program; |
| 59 | 60 |
| 60 public GlShader(String vertexSource, String fragmentSource) { | 61 public GlShader(String vertexSource, String fragmentSource) { |
| 61 vertexShader = compileShader(GLES20.GL_VERTEX_SHADER, vertexSource); | 62 vertexShader = compileShader(GLES20.GL_VERTEX_SHADER, vertexSource); |
| 62 fragmentShader = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); | 63 fragmentShader = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); |
| 63 program = GLES20.glCreateProgram(); | 64 program = GLES20.glCreateProgram(); |
| 64 if (program == 0) { | 65 if (program == 0) { |
| 65 throw new RuntimeException("Could not create program"); | 66 throw new RuntimeException("Could not create program"); |
| 66 } | 67 } |
| 67 GLES20.glAttachShader(program, vertexShader); | 68 GLES20.glAttachShader(program, vertexShader); |
| 68 GLES20.glAttachShader(program, fragmentShader); | 69 GLES20.glAttachShader(program, fragmentShader); |
| 69 GLES20.glLinkProgram(program); | 70 GLES20.glLinkProgram(program); |
| 70 int[] linkStatus = new int[] { | 71 int[] linkStatus = new int[] { |
| 71 GLES20.GL_FALSE | 72 GLES20.GL_FALSE |
| 72 }; | 73 }; |
| 73 GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); | 74 GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); |
| 74 if (linkStatus[0] != GLES20.GL_TRUE) { | 75 if (linkStatus[0] != GLES20.GL_TRUE) { |
| 75 Log.e(TAG, "Could not link program: " + | 76 Logging.e(TAG, "Could not link program: " + |
| 76 GLES20.glGetProgramInfoLog(program)); | 77 GLES20.glGetProgramInfoLog(program)); |
| 77 throw new RuntimeException(GLES20.glGetProgramInfoLog(program)); | 78 throw new RuntimeException(GLES20.glGetProgramInfoLog(program)); |
| 78 } | 79 } |
| 79 GlUtil.checkNoGLES2Error("Creating GlShader"); | 80 GlUtil.checkNoGLES2Error("Creating GlShader"); |
| 80 } | 81 } |
| 81 | 82 |
| 82 public int getAttribLocation(String label) { | 83 public int getAttribLocation(String label) { |
| 83 if (program == -1) { | 84 if (program == -1) { |
| 84 throw new RuntimeException("The program has been released"); | 85 throw new RuntimeException("The program has been released"); |
| 85 } | 86 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 | 118 |
| 118 public void useProgram() { | 119 public void useProgram() { |
| 119 if (program == -1) { | 120 if (program == -1) { |
| 120 throw new RuntimeException("The program has been released"); | 121 throw new RuntimeException("The program has been released"); |
| 121 } | 122 } |
| 122 GLES20.glUseProgram(program); | 123 GLES20.glUseProgram(program); |
| 123 GlUtil.checkNoGLES2Error("glUseProgram"); | 124 GlUtil.checkNoGLES2Error("glUseProgram"); |
| 124 } | 125 } |
| 125 | 126 |
| 126 public void release() { | 127 public void release() { |
| 127 Log.d(TAG, "Deleting shader."); | 128 Logging.d(TAG, "Deleting shader."); |
| 128 // Flag shaders for deletion (does not delete until no longer attached to a
program). | 129 // Flag shaders for deletion (does not delete until no longer attached to a
program). |
| 129 if (vertexShader != -1) { | 130 if (vertexShader != -1) { |
| 130 GLES20.glDeleteShader(vertexShader); | 131 GLES20.glDeleteShader(vertexShader); |
| 131 vertexShader = -1; | 132 vertexShader = -1; |
| 132 } | 133 } |
| 133 if (fragmentShader != -1) { | 134 if (fragmentShader != -1) { |
| 134 GLES20.glDeleteShader(fragmentShader); | 135 GLES20.glDeleteShader(fragmentShader); |
| 135 fragmentShader = -1; | 136 fragmentShader = -1; |
| 136 } | 137 } |
| 137 // Delete program, automatically detaching any shaders from it. | 138 // Delete program, automatically detaching any shaders from it. |
| 138 if (program != -1) { | 139 if (program != -1) { |
| 139 GLES20.glDeleteProgram(program); | 140 GLES20.glDeleteProgram(program); |
| 140 program = -1; | 141 program = -1; |
| 141 } | 142 } |
| 142 } | 143 } |
| 143 } | 144 } |
| OLD | NEW |