Android OpenGLES错误:将发生资源死锁



我正在开发一个带有"模糊工具"的照片编辑器应用程序,该应用程序允许用户模糊照片。为了实现这一点,我在原始图像上绘制了另一个"模糊层",并使用不透明度/alpha来显示模糊点。

我的着色器代码:

precision mediump float;
uniform float aRadius;
uniform vec2 aTouchPosition;
uniform sampler2D inputImageTexture;
varying vec2 textureCoordinate;
void main() {
float dist = distance(aTouchPosition, gl_FragCoord.xy);
if(dist <= aRadius)
gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
else
gl_FragColor = vec4(0., 0., 0., 0.);
}

每次用户触摸时,我都会将点放在一个数组中,然后放在着色器中:

protected void onDrawFrame() {
if (textures == null) return;
shader.useProgram();
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLES20.glUniformMatrix4fv(shader.uMVPMatrix, 1, false, mScratchMatrix, 0);
GLES20.glEnableVertexAttribArray(shader.position);
GLES20.glVertexAttribPointer(shader.position, COORDINATE_PER_VERTEX, GLES20.GL_FLOAT, false, VERTEX_STRIDE, mCubeCoordArray);
GLES20.glEnableVertexAttribArray(shader.inputTextureCoordinate);
GLES20.glVertexAttribPointer(shader.inputTextureCoordinate, 2, GLES20.GL_FLOAT, false, 0, mTexCoordArray);
for (int i = 0; i < listCurrent.size(); i++) {
PaintData.Position pos = listCurrent.get(i);
GLES20.glUniform1f(shader.aRadius, pos.size);
GLES20.glUniform2f(shader.touchPosition, pos.x, pos.y);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}
listCurrent.clear();
GLES20.glDisableVertexAttribArray(shader.position);
GLES20.glDisableVertexAttribArray(shader.inputTextureCoordinate);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
}

当用户触摸绘制时,它会根据路径的长短产生大约20-100个点。它仍然可以,但当用户保存&恢复编辑,我必须在一帧(第一帧(中恢复大量的点。这会导致错误并使我的应用程序崩溃。

W/Adreno GSL::ioctl fd 115代码0xc040094a(IOCTL_KGSL_GPU_COMMAND(失败:错误号35资源死锁将发生

W/Adreno GSL::panel.gpuSnapshotPath为未设置。未生成用户快照


经过一些调查,我发现:

  • 对于每个点,它必须绘制整个屏幕(而不是应该绘制的一个小模糊点(。

    =>我如何通过只绘制模糊点需要显示的屏幕的一部分来优化这一点(

  • 在第一次调用完onDrawFrame()函数(用我的模糊点执行所有glDrawArrays()(后,我的应用程序锁定&等待2秒钟执行mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)函数,之后它崩溃了。

    =>如何优化交换功能?

我也有类似的问题,在这个论坛帖子中偶然发现了答案#10。

每帧排队的命令似乎太多了,这会导致gpu冻结。对我来说,解决这个问题的方法总是在几次GL调用后调用glFinish(((等待之前排队的所有命令都执行完毕(或glFlush(((强制执行排队的命令(。

最新更新