diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 0868ac1f..19e5456d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -44,7 +44,7 @@ public class EglViewport extends EglElement { private FloatBuffer mTextureCoordinatesArray = floatBuffer(FULL_RECTANGLE_TEX_COORDS); // Stuff from Texture2dProgram - private int mProgramHandle; + private int mProgramHandle = -1; private int mTextureTarget; private int mTextureUnit; @@ -54,13 +54,8 @@ public class EglViewport extends EglElement { private int maPositionLocation; private int maTextureCoordLocation; - // private int muKernelLoc; // Used for filtering - // private int muTexOffsetLoc; // Used for filtering - // private int muColorAdjustLoc; // Used for filtering - - private Filter mShaderEffect; - - private boolean mIsShaderChanged = false; + private Filter mFilter; + private boolean mFilterChanged = false; public EglViewport() { this(new NoFilter()); @@ -69,30 +64,28 @@ public class EglViewport extends EglElement { public EglViewport(@NonNull Filter filter) { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; mTextureUnit = GLES20.GL_TEXTURE0; - mShaderEffect = filter; - initProgram(); + mFilter = filter; + createProgram(); } - private void initProgram() { - release(); - mProgramHandle = createProgram(mShaderEffect.getVertexShader(), mShaderEffect.getFragmentShader()); - maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getPositionVariableName()); - checkLocation(maPositionLocation, mShaderEffect.getPositionVariableName()); - maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getTexttureCoordinateVariableName()); - checkLocation(maTextureCoordLocation, mShaderEffect.getTexttureCoordinateVariableName()); - muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getMVPMatrixVariableName()); - checkLocation(muMVPMatrixLocation, mShaderEffect.getMVPMatrixVariableName()); - muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getTextureMatrixVariableName()); - checkLocation(muTexMatrixLocation, mShaderEffect.getTextureMatrixVariableName()); - } - - public void release(boolean doEglCleanup) { - if (doEglCleanup) GLES20.glDeleteProgram(mProgramHandle); - mProgramHandle = -1; + private void createProgram() { + release(); // Release old program if present. + mProgramHandle = createProgram(mFilter.getVertexShader(), mFilter.getFragmentShader()); + maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, mFilter.getPositionVariableName()); + checkLocation(maPositionLocation, mFilter.getPositionVariableName()); + maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, mFilter.getTexttureCoordinateVariableName()); + checkLocation(maTextureCoordLocation, mFilter.getTexttureCoordinateVariableName()); + muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mFilter.getMVPMatrixVariableName()); + checkLocation(muMVPMatrixLocation, mFilter.getMVPMatrixVariableName()); + muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mFilter.getTextureMatrixVariableName()); + checkLocation(muTexMatrixLocation, mFilter.getTextureMatrixVariableName()); } public void release() { - release(true); + if (mProgramHandle != -1) { + GLES20.glDeleteProgram(mProgramHandle); + mProgramHandle = -1; + } } public int createTexture() { @@ -114,9 +107,9 @@ public class EglViewport extends EglElement { return texId; } - public void changeShaderFilter(@NonNull Filter shaderEffect){ - this.mShaderEffect = shaderEffect; - mIsShaderChanged = true; + public void setFilter(@NonNull Filter filter){ + this.mFilter = filter; + mFilterChanged = true; } @@ -144,9 +137,9 @@ public class EglViewport extends EglElement { FloatBuffer vertexBuffer, FloatBuffer texBuffer) { - if (mIsShaderChanged){ - initProgram(); - mIsShaderChanged = false; + if (mFilterChanged) { + createProgram(); + mFilterChanged = false; } check("draw start"); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java index 0bf448ba..e3394120 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java @@ -103,9 +103,8 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { } @Override - public void - onFilterChanged(@NonNull Filter filter) { - mViewport.changeShaderFilter(filter); + public void onFilterChanged(@NonNull Filter filter) { + mViewport.setFilter(filter); } }); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index 3aacbf10..f371028d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -331,7 +331,7 @@ public class GlCameraPreview extends FilterCameraPreview { if (event.equals(FILTER_EVENT)) { Filter filter = (Filter) data; - mViewport.changeShaderFilter(filter); + mViewport.setFilter(filter); } else if (event.equals(FRAME_EVENT)) { Frame frame = (Frame) data; if (frame == null) { @@ -224,7 +224,7 @@ public class TextureMediaEncoder extends VideoMediaEncoder { mWindow = null; } if (mViewport != null) { - mViewport.release(true); + mViewport.release(); mViewport = null; } if (mEglCore != null) {