Chromium Code Reviews| Index: webrtc/api/java/android/org/webrtc/GlShader.java |
| diff --git a/webrtc/api/java/android/org/webrtc/GlShader.java b/webrtc/api/java/android/org/webrtc/GlShader.java |
| index ed14c7115d8f548f81e98bd1266fe271cc34e9d3..fb5e4c2f67759d7a0f83ba70a1a2c9b51f87d894 100644 |
| --- a/webrtc/api/java/android/org/webrtc/GlShader.java |
| +++ b/webrtc/api/java/android/org/webrtc/GlShader.java |
| @@ -21,14 +21,17 @@ public class GlShader { |
| private static final String TAG = "GlShader"; |
| private static int compileShader(int shaderType, String source) { |
| - int[] result = new int[] { |
| - GLES20.GL_FALSE |
| - }; |
| - int shader = GLES20.glCreateShader(shaderType); |
| + final int shader = GLES20.glCreateShader(shaderType); |
| + if (shader == 0) { |
| + throw new RuntimeException("glCreateShader() failed. GLES20 error: " + GLES20.glGetError()); |
| + } |
| GLES20.glShaderSource(shader, source); |
| GLES20.glCompileShader(shader); |
| - GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); |
| - if (result[0] != GLES20.GL_TRUE) { |
| + int[] compileStatus = new int[] { |
| + GLES20.GL_FALSE |
| + }; |
| + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0); |
| + if (compileStatus[0] != GLES20.GL_TRUE) { |
| Logging.e(TAG, "Could not compile shader " + shaderType + ":" + |
| GLES20.glGetShaderInfoLog(shader)); |
| throw new RuntimeException(GLES20.glGetShaderInfoLog(shader)); |
| @@ -37,16 +40,14 @@ public class GlShader { |
| return shader; |
| } |
| - private int vertexShader; |
| - private int fragmentShader; |
| private int program; |
| public GlShader(String vertexSource, String fragmentSource) { |
| - vertexShader = compileShader(GLES20.GL_VERTEX_SHADER, vertexSource); |
| - fragmentShader = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); |
| + final int vertexShader = compileShader(GLES20.GL_VERTEX_SHADER, vertexSource); |
| + final int fragmentShader = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); |
| program = GLES20.glCreateProgram(); |
| if (program == 0) { |
| - throw new RuntimeException("Could not create program"); |
| + throw new RuntimeException("glCreateProgram() failed. GLES20 error: " + GLES20.glGetError()); |
| } |
| GLES20.glAttachShader(program, vertexShader); |
| GLES20.glAttachShader(program, fragmentShader); |
| @@ -60,6 +61,15 @@ public class GlShader { |
| GLES20.glGetProgramInfoLog(program)); |
| throw new RuntimeException(GLES20.glGetProgramInfoLog(program)); |
| } |
| + // According to the documentation of glLinkProgram(): |
| + // "After the link operation, applications are free to modify attached shader objects, compile |
| + // attached shader objects, detach shader objects, delete shader objects, and attach additional |
| + // shader objects. None of these operations affects the information log or the program that is |
| + // part of the program object." |
| + // But in practice, detaching shaders from the program seems to break some devices. Deleting the |
| + // shaders are fine however - it will delete them when they are no longer attached to a program. |
| + GLES20.glDeleteShader(vertexShader); |
| + GLES20.glDeleteShader(fragmentShader); |
|
hbos
2016/02/17 14:23:06
The fact that it will be deleted when no longer at
magjed_webrtc
2016/02/18 10:05:19
The fact that they will be deleted when no longer
hbos
2016/02/18 10:35:54
And detaching occurs automagically at glDeleteProg
magjed_webrtc
2016/02/18 11:03:42
Yes, detaching occurs automagically in glDeletePro
|
| GlUtil.checkNoGLES2Error("Creating GlShader"); |
| } |
| @@ -109,15 +119,6 @@ public class GlShader { |
| public void release() { |
| Logging.d(TAG, "Deleting shader."); |
| - // Flag shaders for deletion (does not delete until no longer attached to a program). |
| - if (vertexShader != -1) { |
| - GLES20.glDeleteShader(vertexShader); |
| - vertexShader = -1; |
| - } |
| - if (fragmentShader != -1) { |
| - GLES20.glDeleteShader(fragmentShader); |
| - fragmentShader = -1; |
| - } |
| // Delete program, automatically detaching any shaders from it. |
| if (program != -1) { |
| GLES20.glDeleteProgram(program); |