2016-12-06 91 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

相關問題