Commit 9788750d by claincly Committed by kim-vde

Simplify GL program handling.

PiperOrigin-RevId: 400697945
parent 7383bf76
......@@ -15,6 +15,8 @@
*/
package com.google.android.exoplayer2.gldemo;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
......@@ -26,7 +28,6 @@ import android.opengl.GLES20;
import android.opengl.GLUtils;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.GlUtil;
import java.io.IOException;
import java.util.Locale;
......@@ -49,7 +50,7 @@ import javax.microedition.khronos.opengles.GL10;
private final Bitmap logoBitmap;
private final Canvas overlayCanvas;
private int program;
@Nullable private GlUtil.Program program;
@Nullable private GlUtil.Attribute[] attributes;
@Nullable private GlUtil.Uniform[] uniforms;
......@@ -77,27 +78,40 @@ import javax.microedition.khronos.opengles.GL10;
@Override
public void initialize() {
String vertexShaderCode;
String fragmentShaderCode;
try {
vertexShaderCode = GlUtil.loadAsset(context, "bitmap_overlay_video_processor_vertex.glsl");
fragmentShaderCode =
GlUtil.loadAsset(context, "bitmap_overlay_video_processor_fragment.glsl");
program =
new GlUtil.Program(
context,
/* vertexShaderFilePath= */ "bitmap_overlay_video_processor_vertex.glsl",
/* fragmentShaderFilePath= */ "bitmap_overlay_video_processor_fragment.glsl");
} catch (IOException e) {
throw new IllegalStateException(e);
}
program = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode);
GlUtil.Attribute[] attributes = GlUtil.getAttributes(program);
GlUtil.Uniform[] uniforms = GlUtil.getUniforms(program);
program.use();
GlUtil.Attribute[] attributes = program.getAttributes();
for (GlUtil.Attribute attribute : attributes) {
if (attribute.name.equals("a_position")) {
attribute.setBuffer(new float[] {-1, -1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, 1, 1, 0, 1}, 4);
attribute.setBuffer(
new float[] {
-1, -1, 0, 1,
1, -1, 0, 1,
-1, 1, 0, 1,
1, 1, 0, 1
},
4);
} else if (attribute.name.equals("a_texcoord")) {
attribute.setBuffer(new float[] {0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1}, 4);
attribute.setBuffer(
new float[] {
0, 0, 0, 1,
1, 0, 0, 1,
0, 1, 0, 1,
1, 1, 0, 1
},
4);
}
}
this.attributes = attributes;
this.uniforms = uniforms;
this.uniforms = checkNotNull(program).getUniforms();
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
GLES20.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
......@@ -126,9 +140,8 @@ import javax.microedition.khronos.opengles.GL10;
GlUtil.checkGlError();
// Run the shader program.
GlUtil.Uniform[] uniforms = Assertions.checkNotNull(this.uniforms);
GlUtil.Attribute[] attributes = Assertions.checkNotNull(this.attributes);
GLES20.glUseProgram(program);
GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms);
GlUtil.Attribute[] attributes = checkNotNull(this.attributes);
for (GlUtil.Uniform uniform : uniforms) {
switch (uniform.name) {
case "tex_sampler_0":
......
......@@ -15,6 +15,8 @@
*/
package com.google.android.exoplayer2.video;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
......@@ -140,7 +142,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView
// glDrawArrays uses it.
private final FloatBuffer[] textureCoords;
private int program;
@Nullable private GlUtil.Program program;
private int colorMatrixLocation;
// Accessed only from the GL thread.
......@@ -161,9 +163,9 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
program = GlUtil.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER);
GLES20.glUseProgram(program);
int posLocation = GLES20.glGetAttribLocation(program, "in_pos");
program = new GlUtil.Program(VERTEX_SHADER, FRAGMENT_SHADER);
program.use();
int posLocation = program.glGetAttribLocation("in_pos");
GLES20.glEnableVertexAttribArray(posLocation);
GLES20.glVertexAttribPointer(
posLocation,
......@@ -172,14 +174,14 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView
/* normalized= */ false,
/* stride= */ 0,
TEXTURE_VERTICES);
texLocations[0] = GLES20.glGetAttribLocation(program, "in_tc_y");
texLocations[0] = checkNotNull(program).glGetAttribLocation("in_tc_y");
GLES20.glEnableVertexAttribArray(texLocations[0]);
texLocations[1] = GLES20.glGetAttribLocation(program, "in_tc_u");
texLocations[1] = checkNotNull(program).glGetAttribLocation("in_tc_u");
GLES20.glEnableVertexAttribArray(texLocations[1]);
texLocations[2] = GLES20.glGetAttribLocation(program, "in_tc_v");
texLocations[2] = checkNotNull(program).glGetAttribLocation("in_tc_v");
GLES20.glEnableVertexAttribArray(texLocations[2]);
GlUtil.checkGlError();
colorMatrixLocation = GLES20.glGetUniformLocation(program, "mColorConversion");
colorMatrixLocation = checkNotNull(program).glGetUniformLocation("mColorConversion");
GlUtil.checkGlError();
setupTextures();
GlUtil.checkGlError();
......@@ -296,7 +298,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView
private void setupTextures() {
GLES20.glGenTextures(3, yuvTextures, /* offset= */ 0);
for (int i = 0; i < 3; i++) {
GLES20.glUniform1i(GLES20.glGetUniformLocation(program, TEXTURE_UNIFORMS[i]), i);
GLES20.glUniform1i(checkNotNull(program).glGetUniformLocation(TEXTURE_UNIFORMS[i]), i);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]);
GLES20.glTexParameterf(
......
......@@ -15,6 +15,7 @@
*/
package com.google.android.exoplayer2.video.spherical;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static com.google.android.exoplayer2.util.GlUtil.checkGlError;
import android.opengl.GLES11Ext;
......@@ -90,11 +91,12 @@ import java.nio.FloatBuffer;
};
private int stereoMode;
@Nullable private GlUtil.Program program;
@Nullable private MeshData leftMeshData;
@Nullable private MeshData rightMeshData;
// Program related GL items. These are only valid if program != 0.
private int program;
private int mvpMatrixHandle;
private int uTexMatrixHandle;
private int positionHandle;
......@@ -119,12 +121,12 @@ import java.nio.FloatBuffer;
/** Initializes of the GL components. */
/* package */ void init() {
program = GlUtil.compileProgram(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE);
mvpMatrixHandle = GLES20.glGetUniformLocation(program, "uMvpMatrix");
uTexMatrixHandle = GLES20.glGetUniformLocation(program, "uTexMatrix");
positionHandle = GLES20.glGetAttribLocation(program, "aPosition");
texCoordsHandle = GLES20.glGetAttribLocation(program, "aTexCoords");
textureHandle = GLES20.glGetUniformLocation(program, "uTexture");
program = new GlUtil.Program(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE);
mvpMatrixHandle = program.glGetUniformLocation("uMvpMatrix");
uTexMatrixHandle = program.glGetUniformLocation("uTexMatrix");
positionHandle = program.glGetAttribLocation("aPosition");
texCoordsHandle = program.glGetAttribLocation("aTexCoords");
textureHandle = program.glGetUniformLocation("uTexture");
}
/**
......@@ -143,7 +145,7 @@ import java.nio.FloatBuffer;
}
// Configure shader.
GLES20.glUseProgram(program);
checkNotNull(program).use();
checkGlError();
GLES20.glEnableVertexAttribArray(positionHandle);
......@@ -196,8 +198,9 @@ import java.nio.FloatBuffer;
/** Cleans up the GL resources. */
/* package */ void shutdown() {
if (program != 0) {
GLES20.glDeleteProgram(program);
if (program != null) {
program.delete();
program = null;
}
}
......
......@@ -186,6 +186,7 @@ import java.nio.ByteBuffer;
}
eglSurface =
GlUtil.getEglSurface(eglDisplay, checkNotNull(checkNotNull(encoder).getInputSurface()));
GlUtil.focusSurface(
eglDisplay,
eglContext,
......@@ -193,17 +194,20 @@ import java.nio.ByteBuffer;
encoderConfigurationOutputFormat.width,
encoderConfigurationOutputFormat.height);
decoderTextureId = GlUtil.createExternalTexture();
String vertexShaderCode;
String fragmentShaderCode;
GlUtil.Program copyProgram;
try {
vertexShaderCode = GlUtil.loadAsset(context, "shaders/blit_vertex_shader.glsl");
fragmentShaderCode = GlUtil.loadAsset(context, "shaders/copy_external_fragment_shader.glsl");
copyProgram =
new GlUtil.Program(
context,
/* vertexShaderFilePath= */ "shaders/blit_vertex_shader.glsl",
/* fragmentShaderFilePath= */ "shaders/copy_external_fragment_shader.glsl");
} catch (IOException e) {
throw new IllegalStateException(e);
}
int copyProgram = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode);
GLES20.glUseProgram(copyProgram);
GlUtil.Attribute[] copyAttributes = GlUtil.getAttributes(copyProgram);
copyProgram.use();
GlUtil.Attribute[] copyAttributes = copyProgram.getAttributes();
checkState(copyAttributes.length == 2, "Expected program to have two vertex attributes.");
for (GlUtil.Attribute copyAttribute : copyAttributes) {
if (copyAttribute.name.equals("a_position")) {
......@@ -229,7 +233,7 @@ import java.nio.ByteBuffer;
}
copyAttribute.bind();
}
GlUtil.Uniform[] copyUniforms = GlUtil.getUniforms(copyProgram);
GlUtil.Uniform[] copyUniforms = copyProgram.getUniforms();
checkState(copyUniforms.length == 2, "Expected program to have two uniforms.");
for (GlUtil.Uniform copyUniform : copyUniforms) {
if (copyUniform.name.equals("tex_sampler")) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment