2016-12-06 195 views
0

目标:机器人API> = 23,的OpenGL ES 2.OpenGL ES:即使没有当前上下文,glDeleteFramebuffers也会成功?

以下代码

private void deleteFBO() 
    { 
    android.util.Log.e("FBO", "deleting "+mFramebufferID); 

    int[] textureIds = new int[1]; 
    int[] mFBORenderToTexture = new int[1]; 

    textureIds[0] = mTextureID; 
    mFBORenderToTexture[0] = mFramebufferID; 

    if(GLES20.glGetError()!=GLES20.GL_NO_ERROR) 
     android.util.Log.e("FBO", "error before deleting"); 

    GLES20.glDeleteTextures(1, textureIds, 0); 
    GLES20.glDeleteFramebuffers(1, mFBORenderToTexture, 0); 

    if(GLES20.glGetError()!=GLES20.GL_NO_ERROR) 
     android.util.Log.e("FBO", "error after deleting"); 
    } 

不给我任何错误(即我不能看到 '错误之前/之后删除')甚至尽管它肯定是从不包含任何OpenGL上下文的线程调用的。

这怎么可能?或者,也许glDelete()调用真的会失败,但我的代码无法检测到这一点?

似乎我不明白当持有上下文时需要做什么OpenGL调用?当我尝试调用它而没有保持上下文时,glDrawArrays肯定会给我一个错误,并且我认为我需要在每个情况下都保持它,包括上面的两个glDelete *()。

回答

1

哪些OpenGL调用需要在持有上下文时进行?

所有这些。其中包括glGetError()。这意味着如果没有当前的上下文,你的错误检查本身是无效的。

即使如此,我发现一些声明glGetError()返回GL_INVALID_OPERATION如果没有当前上下文。但是我一直无法找到规范中定义的行为。因此,除非有人指示我,否则我会坚持我的说法,即在没有当前上下文的情况下调用glGetError()会给出未定义的(即实现相关)结果。

+0

是的,就是这样 - 我设法证明glGetError()本身失败。这是在Android模拟器和我的Nexus 4上。 – Leszek

+0

这实际上是非常不幸的。那么如何在这种情况下检测到失败的OpenGL调用呢?这里glDelete()默默地失败,应用程序似乎仍在运行,但内存当然不会释放... – Leszek

+0

不要写错误的应用程序 - 这不是你应该在运行时不小心处理的情况。如果必须添加调试检查,只需在'eglGetCurrentContext()'不返回'EGL_NO_CONTEXT'上添加断言。 – solidpixel

相关问题