parent
4f7e1366aa
commit
7f1d5b26b7
@ -1,103 +0,0 @@ |
||||
package com.otaliastudios.cameraview.internal.egl; |
||||
|
||||
|
||||
import android.opengl.GLES11Ext; |
||||
import android.opengl.GLES20; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
import com.otaliastudios.cameraview.CameraLogger; |
||||
import com.otaliastudios.cameraview.filter.Filter; |
||||
import com.otaliastudios.cameraview.filter.NoFilter; |
||||
import com.otaliastudios.opengl.program.GlProgram; |
||||
|
||||
|
||||
public class EglViewport { |
||||
|
||||
private final static CameraLogger LOG = CameraLogger.create(EglViewport.class.getSimpleName()); |
||||
|
||||
private int mProgramHandle = -1; |
||||
private int mTextureTarget; |
||||
private int mTextureUnit; |
||||
|
||||
private Filter mFilter; |
||||
private Filter mPendingFilter; |
||||
|
||||
public EglViewport() { |
||||
this(new NoFilter()); |
||||
} |
||||
|
||||
public EglViewport(@NonNull Filter filter) { |
||||
mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; |
||||
mTextureUnit = GLES20.GL_TEXTURE0; |
||||
mFilter = filter; |
||||
createProgram(); |
||||
} |
||||
|
||||
private void createProgram() { |
||||
mProgramHandle = GlProgram.create(mFilter.getVertexShader(), |
||||
mFilter.getFragmentShader()); |
||||
mFilter.onCreate(mProgramHandle); |
||||
} |
||||
|
||||
public void release() { |
||||
if (mProgramHandle != -1) { |
||||
mFilter.onDestroy(); |
||||
GLES20.glDeleteProgram(mProgramHandle); |
||||
mProgramHandle = -1; |
||||
} |
||||
} |
||||
|
||||
public int createTexture() { |
||||
int[] textures = new int[1]; |
||||
GLES20.glGenTextures(1, textures, 0); |
||||
Egloo.checkGlError("glGenTextures"); |
||||
|
||||
int texId = textures[0]; |
||||
GLES20.glActiveTexture(mTextureUnit); |
||||
GLES20.glBindTexture(mTextureTarget, texId); |
||||
Egloo.checkGlError("glBindTexture " + texId); |
||||
|
||||
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, |
||||
GLES20.GL_NEAREST); |
||||
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, |
||||
GLES20.GL_LINEAR); |
||||
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, |
||||
GLES20.GL_CLAMP_TO_EDGE); |
||||
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, |
||||
GLES20.GL_CLAMP_TO_EDGE); |
||||
Egloo.checkGlError("glTexParameter"); |
||||
|
||||
return texId; |
||||
} |
||||
|
||||
public void setFilter(@NonNull Filter filter) { |
||||
// TODO see if this is needed. If setFilter is always called from the correct GL thread,
|
||||
// we don't need to wait for a new draw call (which might not even happen).
|
||||
mPendingFilter = filter; |
||||
} |
||||
|
||||
public void draw(long timestampUs, int textureId, float[] textureMatrix) { |
||||
if (mPendingFilter != null) { |
||||
release(); |
||||
mFilter = mPendingFilter; |
||||
mPendingFilter = null; |
||||
createProgram(); |
||||
} |
||||
|
||||
Egloo.checkGlError("draw start"); |
||||
|
||||
// Select the program and the active texture.
|
||||
GLES20.glUseProgram(mProgramHandle); |
||||
Egloo.checkGlError("glUseProgram"); |
||||
GLES20.glActiveTexture(mTextureUnit); |
||||
GLES20.glBindTexture(mTextureTarget, textureId); |
||||
|
||||
// Draw.
|
||||
mFilter.draw(timestampUs, textureMatrix); |
||||
|
||||
// Release.
|
||||
GLES20.glBindTexture(mTextureTarget, 0); |
||||
GLES20.glUseProgram(0); |
||||
} |
||||
} |
Loading…
Reference in new issue